1

我有一个基于自定义轮换方案广播不同 UUID 值的信标设备。

通常,开发人员必须设置静态 UUID 才能被应用程序识别(例如 iOS):

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:major minor:minor identifier:identifier];

我想知道是否有一种方法可以动态生成(或从服务器接收)要识别的 UUID。

话虽如此,我仍然难以理解 iOS 和 Android 如何理解信标的内部机制。据我了解,手机的 BLE 模块将所有格式正确的 iBeacons 转发到操作系统,该操作系统维护一个已识别的 UUID 列表。经过简单的查找并找到匹配项后,操作系统会将相应的应用程序带到前台。

但是,应用程序识别的 UUID 何时在操作系统中注册?他们多久重新注册一次?如果有人能指出任何相关的在线材料或至少提及此过程中涉及的机制,我将不胜感激。

4

1 回答 1

0

在 Android 和 iOS 上,注册 Beacon ProximityUUID来检测无非是对匹配 Beacon 和 ProximityUUID 的字节模式的蓝牙数据包应用过滤器。重要的区别在于,在iOS上,执行过滤的操作系统框架 CoreLocation对您可以拥有的过滤器设置了严格的限制。iOS 限制包括:

  • 在任何给定时间,您只能为单个应用程序监控 20 个 UUID。
  • 受监控的前 30 个 UUID 的设备范围限制获得硬件辅助快速检测。稍后要注册的 UUID 检测速度会变慢(后台延迟几分钟)。
  • 您不能监视或范围内的任何 UUID(全局通配符)

但是,您可以随时更改您的应用程序正在监控的 20 个 UUID——甚至每隔几秒一次。诀窍是您的应用程序必须在前台执行此操作,或者有允许的方式在后台运行以执行此 UUID 轮换。

要在 iOS 上注册一个用于监控的 UUID,您只需使用该 UUID 声明一个区域(通常不指定主要和次要值),然后调用

[locationManager startMonitoringForRegion:region];

为了避免超过 20 个区域的限制,您还必须致电:

[locationManager stopMonitoringForRegion:oldRegion];

在您不想再监控的旧区域上。否则,如果您超过 20 个限制,您将无法检测到新注册的区域。

当然,您可以使用 Web 服务为您的新区域提供 UUID 以进行监控。

在 Android 上,它要简单得多——您可以通过使用 Android 信标库和类似的 SDK 指定全局通配符来监视所有 UUID。

全面披露:我是 Android 信标库的首席开发人员,这是该平台上的第一个信标实现。

于 2016-04-21T01:20:03.183 回答