在iOS中获取BLE的广告数据

use*_*511 15 objective-c ios bluetooth-lowenergy ibeacon

我正在创建一个应用程序,它可以获取范围内所有BLE设备的UUID.我已经在Android中运行良好,它给我的广告数据作为字节数组.现在我想在iOS中做同样的事情.

我正在运行扫描并且它正在检测设备,并且在回调中有一个名为advertisementData的NSDictionary.但其中唯一的信息如下:

kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = jaalee;
kCBAdvDataTxPowerLevel = 0;
Run Code Online (Sandbox Code Playgroud)

我是否正确地认为我应该获得整个广告包?如果没有,我怎么能得到它?

dav*_*ung 18

不幸的是,iOS不允许您访问原始广告数据.我写了一篇博客文章来证明这一点.虽然这篇文章专门针对iBeacons,但它适用于任何BLE广告.

编辑:为了澄清,您可以读取非iBeacon广告的原始字节.只有iBeacon广告才隐藏其字节CoreLocation.请参阅此处:使用iOS获取蓝牙LE扫描响应数据

等效的OSX CoreLocation方法确实允许这样做,因此它可能是iOS上的故意安全或省电限制.


meg*_*bri 15

基于Apple iOS的官方文档和我的个人经验:

是的,iOS不允许您访问RAW广告数据.

如果您打算将信息放入广告包并从iOS应用程序中读取它们而不连接外围设备,则可以这样做.这里描述如何:

1)在外围固件中,您必须在广告数据包中插入制造商特定数据,数据类型为GAP_ADTYPE_MANUFACTURER_SPECIFIC (0xFF)请记住,在制造商特定数据中,前2个八位字节包含公司标识符代码,后跟附加的制造商特定数据

2)在iOS中

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Run Code Online (Sandbox Code Playgroud)

您可以使用键在advertiseData词典中查看制造商特定数据:

CBAdvertisementDataManufacturerDataKey
Run Code Online (Sandbox Code Playgroud)

3)如果您希望在您的应用程序中收到外围设备发送到iOS的每个广告包的回叫通知,请记住将扫描选项更改为YES.看看这篇文章:核心蓝牙 - 范围内设备的不断RSSI更新

在我的博客文章中很快就会有一个教程:http://www.megabri.com/