我正在开发一个系统,它有一个BLE设备(TI CC2540)作为中心和一个iOS应用程序在iPhone4S上作为外设。一切正常,除了一个我需要的功能:来自中央的白名单(过滤)广告设备。
据我所知,iOS设备使用的是随机可解析的MAC地址,因此不能使用基于MAC地址的白名单。
因此,我现在的方法是:在iOS应用程序的广告数据(iOS设备作为外围设备)的“本地名称”字段上放置一个ID,中央设备将根据检索到的广告数据进行扫描和过滤。除非应用程序在后台,否则这将起作用。
当我的应用程序被放到后台时,广告数据会被截断,我的“本地名字”不会出现在空中。从corebluetooth的头文件中可以看到,当应用程序在后台时,广告数据中只能有“溢出区”数据,但只有iOS设备可以读取这个区域。
所以在座的任何人都可以告诉我如何在后台模式下添加自定义数据到广告包中,或者任何其他具有此过滤功能的解决方案。
任何评论都会对我有很大帮助。
发布于 2013-10-19 00:03:57
我知道这是一个更老的帖子,但对于任何好奇的人来说,没有可靠的方法来实现这一点,因为当应用程序在后台时,CBAdvertisementDataLocalNameKey不会传输。
此外,操作系统会忽略CBCentralManagerScanOptionAllowDuplicatesKey,因此您将为发现的每个新设备恰好获得一个didDiscoverPeripheral回调。
如果你想知道为什么,请记住,在硬件层面上,使用BLE的所有应用程序只共享一个蓝牙无线电,广告包在所有广告应用程序之间共享。
溢出区域包含您的设备通告的所有服务UUID。我可以想象这个字段很小,系统可能需要发送几个数据包循环通过UUID来通告所有的UUID,如果你有很多的话。
此外,这里还有一个原因,为什么广告包不是放置所需应用程序信息的最佳位置。假设您有一个应用程序,该应用程序依赖于服务UUID A的广告数据。然后,该应用程序变成后台应用程序,用户打开另一个使用广告数据的应用程序来提供服务UUID B。
因为设备现在正在为UUID A和UUID B通告服务,所以任何接收设备都将在寻找A或B的任何中心上获得回叫。但是,CBAdvertisementDataLocalNameKey将仅包含B的数据,因为它在发送设备上处于前台,这意味着您的设备只期望A的数据可能正在处理错误的数据。
如果你想更清楚地了解广告数据实际上在传递什么,app Store上有一款名为LightBlue的优秀iOS应用程序将向你显示这些数据,并允许你连接到一台设备并查看其所有服务、特征和描述符。
发布于 2016-07-11 01:32:49
我也在努力解决同样的问题。对于我的项目,我至少需要从树莓派的后台读取iPhone的CBAdvertisementDataLocalNameKey。我还是不能从溢出区得到任何信息。
然而,我发现了一件有趣的事情,可以解决我们的问题。有一些安卓应用程序可以在附近的iOS设备处于后台时读取LocalName。this one就是一个例子。This是被引用的应用程序的屏幕截图,显示了正确的CBAdvertisementDataLocalNameKey,而附近的iPhone在后台。
在android扫描实验中,除了制造商数据块之外,树莓不能读取任何内容。一种可能的解决方案是使用蓝牙包嗅探器来了解哪个是正确的扫描请求,以获得包含溢出区的扫描响应消息。不幸的是,这需要特定的硬件,比如Ubertooth。
https://stackoverflow.com/questions/15476132
复制相似问题