Android - 检测我的应用程序的其他用户是否在附近

标签 android bluetooth bluetooth-lowenergy android-bluetooth

我正在开发一个 Android 应用程序,该应用程序需要检测该应用程序的其他用户是否彼此靠近(假设在同一房间或蓝牙范围内)。应用需要能够无需任何用户交互检测到这一点。

  • 无法使用地理定位,因为在室内定位太不准确。
  • 该应用仅在位于公司 field 的公司自有手机上运行,​​不存在隐私问题。
  • 所有设备始终连接到同一 Wi-Fi 网络,并且 BT 始终处于启用状态。

我的想法是通过定期蓝牙扫描并根据包含所有安装了该应用程序的设备的 MAC 地址列表检查结果来检测用户是否彼此距离较近。 所有设备的 MAC 地址都会发送到服务器,然后设备从服务器获取此 MAC 地址列表,以与 BT 扫描的结果进行比较。

问题是,英国电信和谷歌似乎使用广告/发现模式,其中一台设备充当服务器,一台设备充当客户端。为了使其正常工作,我觉得设备需要始终可被发现。

基于 Google 的“Nearby”或 BT 的实现能否满足我的需求?

是否可以在不被发现的情况下检测附近设备的存在?

由于电池生命周期是一个问题(需要能够每天至少使用 8 小时),BLE 是一种选择吗?

最佳答案

如果手机没有真正用于其他用途,您几乎可以肯定每天可以处理 8 小时。然而,还有很多变数。

许多旧手机需要使用无限扫描仪重新启动进行不同类型的扫描,以便正确报告“看到”外围设备。这会大大缩短电池生命周期。

如果手机运行的是 Marshmallow 或更高版本,它们会有打瞌睡模式,会中断扫描。可以使用 AlarmManager、JobService/Dispatcher 或 WorkManager 来避免这种情况。这会大大缩短电池生命周期。

如果手机运行 Oreo 或更高版本,则需要前台服务(持久通知),以防止应用程序被操作系统自动终止以节省电池。该应用程序还应该从电池优化中列入白名单,因为即使使用前台服务,该应用程序仍然会被操作系统杀死。

最后,使用定位服务进行扫描广播在电池方面相当昂贵。如果您尝试对手机进行聚类并根据附近的其他手机猜测它们的位置,在某种程度上,您仍然需要手机的位置数据来确定它们所在的位置。

直接扫描效果会更好。您可以在公司属性(property)上铺满信标,记录每个信标的位置。当手机“进入某个区域”(进入信标范围内)时,它应该向您的 api 发送一些内容,报告它刚刚找到了哪个信标。这将告诉您它位于哪个房间/区域。

另一种不太华丽(并且可能不太准确)的跟踪所有内容的方法是通过它们所连接的无线接入点的 IP 地址。使用WorkManager使用电话的某些唯一 ID 和 AP 的 IP 地址定期更新 api。您的 IT 部门应该知道它们各自的位置。这样您就可以获得相当好的跟踪效果并且几乎不会消耗电池。

关于Android - 检测我的应用程序的其他用户是否在附近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55222215/

相关文章:

android - 无效的命令行参数 : partition-size

android - Firebase Analytics 不显示屏幕名称和事件

android - 数据库和网络服务模型

Android - 新的日历样式 DatePicker 和 TimePicker

iOS 低功耗蓝牙 : unable to connect using stored pairing data

java - 如何避免调用 handler.postDelayed(Runnable run) ?

java - 如何使用 HandlerThread 类将单独的循环器传递给线程

android - 连接到三星 Galaxy 上的蓝牙套接字 SPP 时,在 android 2.1 中请求 'Pairing Request'

javascript - BLE主控: scanning while connected

flutter - 从 BLE 设备收到的不完整响应出现抖动