iOS BLE外设/广告数据在后台模式

mgd*_*ubo 9 peripherals ios bluetooth-lowenergy

我正在开发一个系统,它有一个BLE设备(TI CC2540)作为Central,一个iOS应用程序在iPhone4S上作为外围设备.一切正常,除了我需要的1个功能:来自中心侧的白名单(过滤)广告设备.

据我所知,iOS设备使用随机可解析的MAC地址,因此我们无法应用基于MAC地址的白名单.

所以我目前的方法是:在iOS app的广告数据上放置一个ID"Local name"字段(iOS设备充当外围设备),中央设备将根据检索到的广告数据进行扫描和过滤.除非app在后台,否则此方法有效.

当我的应用程序放在后台时,广告数据被截断,我的"本地名称"不会出现在空中.从corebluetooth的头文件,我看到app在后台时只有"溢出区"数据可以在广告数据中,但只有iOS设备才能读取该区域.

所以这里的任何人都可以点亮我如何将自定义数据添加到广告包中,即使在后台模式下,或任何其他具有此过滤功能的解决方案.

任何评论都会对我有所帮助.

小智 3

我知道这是一篇较旧的帖子,但对于任何好奇的人来说,没有可靠的方法来完成此操作,因为当应用程序在后台时 CBAdvertisementDataLocalNameKey 不会传输。

此外,操作系统会忽略 CBCentralManagerScanOptionAllowDuplicatesKey,因此对于发现的每个新设备,您将获得一个 didDiscoverPeripheral 回调。

如果您好奇为什么,请记住,在硬件级别,只有一个蓝牙无线电由所有使用 BLE 的应用程序共享,并且广告数据包在所有广告应用程序之间共享。

溢出区域保存您的设备通告的所有服务 UUID。我想这个字段很小,系统可能必须发送几个通过 UUID 循环的数据包来通告它们(如果有很多的话)。

此外,这也是广告包不是放置所需应用信息的最佳位置的另一个原因。假设您有一个依赖于服务 UUID A 的广告数据的应用程序。然后,该应用程序将进入后台,并且用户打开另一个使用服务 UUID B 的广告数据的应用程序。

由于设备现在正在为 UUID A 和 UUID B 通告服务,因此任何接收设备都会在任何寻找 A 或 B 的中心上收到回调。但是,CBAdvertisementDataLocalNameKey 将仅包含 B 的数据,因为它位于前台传输设备,这意味着您的设备只期望 A 的数据可能正在处理错误的数据。

如果您想更清楚地了解广告数据实际传输的内容,App Store 上有一款出色的 iOS 应用程序,名为 LightBlue,它会向您显示这些数据,并允许您连接到设备并查看其所有服务、特征和描述符。