我们可以在 iOS 上检测到非 iBeacon 信标吗?

Can we detect non-iBeacon beacons on iOS?

我和我的团队正在研究我们需要与用户 iPhone 上的应用对话的信标。由于我们需要应用程序检测信标并执行代码以与我们的 API 对话,即使在被杀死时,我们也无法使用 CoreBluetooth 并且需要作为信标运行。

我们正在尝试在 BCM20737S BLE 模块上制作自定义信标。是否可以让此自定义信标作为信标与 iPhone 上的应用程序对话? (CoreLocation 框架)

谢谢!

只要您的数据包使用 iBeacon 协议广播数据包,corelocation 就可以检测到它,您的应用程序将根据检测到的信号唤醒。一个 iBeacon 协议数据包是一个 25 字节的有效负载,设置为 BLE 广告中的制造商数据字段。

  1. 公司 ID 为 2 个字节 (0x004C)
  2. 类型为1字节(0x02)
  3. 数据长度为 1 个字节 (0x015)
  4. Proximity UUID 是一个 16 字节的十六进制字符串
  5. 主要是2个字节uint16_t
  6. Minor 是 2 个字节 uint16_t
  7. 测量功率为 1 个字节 int8_t

这个堆栈线程可能对您有用。

What is the iBeacon Bluetooth Profile

但本质上核心定位只为 ibeacons 配置,如果你想传输不同的协议数据包,你将需要在 iOS 上使用 CoreBluetooth,然后一旦你收到数据包,以某种方式转换它以供使用你的应用程序。

CoreLocation框架只会检测iBeacons,即符合iBeacon字节格式的信标。 您当然可以构建自己的,虽然它不必是官方 Apple 认证的 iBeacon,但它必须与字节模式匹配。这种模式在 Internet 上随处可见,即使您没有注册 Apple 的认证计划也能使您获得查看该规范的权利。

但是请注意,不要更改字节模式。一些供应商已经构建了信标传输,将额外的字节附加到末尾以发送电池电量。虽然检测到这些传输,但它们的检测速度要慢得多,因为 header 具有不同的长度字段,这与后台用于快速检测的硬件过滤器不匹配。

如果要自定义信标格式,则必须使用 CoreBluetooth 进行检测。我写了一些开源 iOS beacon tools 来帮助做到这一点,使用开源 AltBeacon 和 Eddystone-UID 格式作为例子。虽然后台检测速度较慢,但​​您可以让您的信标同时传输 iBeacon 信号(快速唤醒您的应用程序)和自定义信标信号(发送您想要的任何自定义字段),一旦它被检测到被唤醒。 通过这种方式,即使您定义了自己的自定义信标格式,您也可以获得快速检测。