1

我在使用 BLE 与我们定制的 BLE 单元进行通信的 iOS 应用程序上工作。我们希望通过 BLE 自动向设备发送特定命令。

当用户靠近设备并满足特定条件时,应用程序应连接到设备,“登录”用户,通过 BLE 发送命令并立即断开连接。

这些特定标准基于来自广告的制造商数据(即,当制造商数据的最后一个字节为 0x01 时,设备处于“可登录”状态,当它为“不可登录”时,最后一个字节为 0x00)。

在前台,这种机制完美无缺。即使应用程序处于后台或终止(在 iPhone 上的仪表板中向上滑动),我们也希望这样做。

我们实现的机制:

  • 该单元具有充当 iBeacon 的能力
  • 当设备无法登录时,iBeacon 关闭
  • 当它可用于登录时,iBeacon 将打开并唤醒应用程序,此时 BLE 扫描将以后台模式开始
  • 背景模式设置为蓝牙中心

这里的问题是,无论我尝试了什么,广告:

  1. 有时它根本没有被发现(看起来像是时间问题?)
  2. 当它被发现时,它不包含制造商数据

有没有人遇到过类似的事情?任何帮助表示赞赏,祝您有美好的一天!

4

1 回答 1

4

应用程序在 iOS 后台时根本无法读取原始 BLE 制造商广告数据——操作系统禁止它。

此规则有两个例外:

  1. iBeacon,它本身是作为一种特定类型的制造商广告来实现的。一个应用程序可以在 iOS 的后台检测 iBeacons,尽管只有四个字节的可读数据(编码在主要和次要字段中)是完全可用的。如果你可以修改你的设备以这种方式发送信息,它会做你想做的事。但是,您必须使用 CoreLocation API 来检测 iBeacon,因为 CoreBluetooth 不允许从 iBeacon 广告中读取制造商数据。如果您确实使用 CoreLocation,则无法使用检测与 CoreBluetooth 建立蓝牙连接,因为这两个 API 是沙盒化的。

  2. 溢出区域广告。后台 iOS 应用程序可以在后台读取这些特殊类型的制造商广告,但前提是屏幕打开。(通常可以通过发送本地通知在特定时间强制打开屏幕。)有关更多信息,请参阅我的博客文章:http ://www.davidgyoungtech.com/2020/05/07/hacking-the-overflow -区域

检测制造商广告的另一种方法是使用带有附加数据的 BLE 服务广告。为此,您需要定义一个 16 位或 128 位 GATT 服务 UUID 并发送带有附加数据字节的广告。 Eddystone 信标格式以这种方式工作,并允许在 iOS 上进行后台检测。如果您可以更改 BLE 硬件,这可能是最好的方法。

于 2020-07-30T15:38:25.447 回答