Ios 可在后台模式下读取外围设备/广告数据

Ios 可在后台模式下读取外围设备/广告数据,ios,bluetooth-lowenergy,peripherals,Ios,Bluetooth Lowenergy,Peripherals,我正在开发一个系统,它以一个可编程设备(TI CC2540)为中心,iPhone4S上的一个iOS应用程序为外围设备。除了我需要的一个功能外,所有功能都正常工作:从中央侧的白名单(过滤)广告设备 据我所知,iOS设备使用随机可解析的MAC地址,因此我们不能基于MAC地址应用白名单 因此,我目前的方法是:在iOS应用程序的广告数据的“本地名称”字段上放置一个ID(iOS设备充当外围设备),中央设备将根据检索到的广告数据进行扫描和过滤。除非应用程序位于后台,否则此功能正常 当我的应用程序放在后台时,

我正在开发一个系统,它以一个可编程设备(TI CC2540)为中心,iPhone4S上的一个iOS应用程序为外围设备。除了我需要的一个功能外,所有功能都正常工作:从中央侧的白名单(过滤)广告设备

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

因此,我目前的方法是:在iOS应用程序的广告数据的“本地名称”字段上放置一个ID(iOS设备充当外围设备),中央设备将根据检索到的广告数据进行扫描和过滤。除非应用程序位于后台,否则此功能正常

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

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


任何评论都会对我很有帮助。

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

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

如果您想知道原因,请记住,在硬件级别上,只有一个蓝牙收音机由使用BLE的所有应用程序共享,而广告数据包则在发布广告的所有应用程序之间共享

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

此外,还有一个原因说明为什么广告包不是放置所需应用程序信息的最佳位置。假设您有一个应用程序依赖于服务UUID A的广告数据。然后,该应用程序成为后台应用程序,用户打开另一个应用程序,该应用程序使用服务UUID B的广告数据

由于该设备现在正在为UUID A和UUID B发布广告服务,因此任何接收设备都将在任何中心上获得一个回调,以查找A或B CBAdvertisementDataLocalNameKey将只包含B的数据,因为它位于传输设备的前台,这意味着您的设备只需要A的数据,可能正在处理错误的数据


如果你想更清楚地了解广告数据实际传输的内容,app Store上有一个名为LightBlue的优秀iOS应用程序,它将向你显示这些数据,并允许你连接到一台设备,查看它的所有服务、特征和描述符

我也在努力解决同样的问题。在我的项目中,我需要从一个树莓圆周率(Raspberry Pi)的后台读取至少一个iPhone的CBAdvertisementDataLocalNameKey。我仍然无法从溢出区获得任何信息

然而,我发现了一件有趣的事情,可以解决我们的问题。 有一些用于BLE扫描的Android应用程序能够在附近的iOS设备处于后台时读取本地名称。举个例子。 是引用的应用程序的屏幕截图,显示了正确的CBAdvertisementDataLocalNameKey,而附近的iPhone处于后台

在android扫描实验中,树莓除了制造商的数据块外,无法读取任何内容。 一种可能的解决方案是使用蓝牙数据包嗅探器来了解哪个是正确的扫描请求,以获取包含溢出区域的扫描响应消息。
不幸的是,这需要像Ubertooth这样的特定硬件。

您有没有找到解决方案/解决方法?这里也有同样的问题。我把解决方案添加到