我正在开发一个系统,它有一个BLE设备(TI CC2540)作为Central,一个iOS应用程序在iPhone4S上作为Peripheral。一切正常,除了我需要的1个功能:来自中心侧的白名单(过滤)广告设备。
据我所知,iOS设备使用随机可解析的MAC地址,因此我们无法根据MAC地址应用白名单。
所以我目前的方法是:在iOS app的广告数据上放置一个ID“Local name”字段(iOS设备充当外围设备),中央设备将根据检索到的广告数据进行扫描和过滤。除非app在后台,否则此方法有效。
当我的应用程序被放入后台时,广告数据会被截断,而我的“本地名称”不会出现在空中。从corebluetooth的头文件,我看到app在后台时只有“溢出区”数据可以在广告数据中,但只有iOS设备才能读取该区域。
所以这里有人可以告诉我如何将自定义数据添加到广告包中,即使在后台模式下,或任何其他具有此过滤功能的解决方案。
任何评论都会对我有所帮助。
答案 0 :(得分:1)
我知道这是一篇较旧的帖子,但对于任何好奇的人来说,没有可靠的方法来实现这一点,因为当应用程序在后台时,不会传输CBAdvertisementDataLocalNameKey。
此外,操作系统会忽略CBCentralManagerScanOptionAllowDuplicatesKey,因此您将为每个发现的新设备获得一个didDiscoverPeripheral回调。
如果您对原因感到好奇,请记住,在硬件级别,只有一个蓝牙无线电由所有使用BLE的应用共享,广告包在所有广告应用之间共享。
溢出区域包含设备广告的所有服务UUID。我想这个领域很小,系统可能必须发送几个循环通过UUID的数据包来宣传它们全部,如果你有很多。
此外,这是广告包是放置所需应用信息的非最佳位置的另一个原因。假设您有一个依赖于服务UUID A的广告数据的应用程序。然后,该应用程序变为后台,用户打开另一个使用服务UUID B的广告数据的应用程序。
由于该设备现在为UUID A和UUID B提供广告服务,因此任何接收设备都将在任何中心寻找A或B进行回叫。但是, CBAdvertisementDataLocalNameKey将仅包含B的数据,因为它位于发送设备的前台,这意味着您的设备只期望A的数据可能正在处理错误的数据。
如果您想更清楚地了解广告数据实际传输的内容,App Store上有一个名为LightBlue的优秀iOS应用会向您显示此数据,并允许您连接到设备并查看所有内容服务,特征和描述符。
答案 1 :(得分:0)
我正在努力解决同样的问题。对于我的项目,我需要至少读取Raspberry Pi背景中iPhone的CBAdvertisementDataLocalNameKey。我仍然无法从溢出区域获取任何信息。
然而,我发现了一个可以解决我们问题的有趣事情。 有一些用于BLE扫描的Android应用程序能够在附近的iOS设备处于后台时读取LocalName。一个例子是this一个。 This是引用应用的屏幕截图,显示正确的CBAdvertisementDataLocalNameKey,而附近的iPhone处于后台。
在Android扫描实验期间,树莓除了制造商数据块之外无法读取任何内容。 一种可能的解决方案是使用蓝牙数据包嗅探器来了解哪个是正确的扫描请求以获得包含溢出区域的扫描响应消息。 不幸的是,这需要像Ubertooth One这样的特定硬件。