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