我正在创建一个应用程序,它可以获取范围内所有BLE设备的UUID。我已经在Android中运行良好,它给我的广告数据作为字节数组。现在我正试图在iOS中做同样的事情。
我正在运行扫描并且它正在检测设备,并且在回调中有一个名为advertisementData的NSDictionary。但其中唯一的信息如下:
kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = jaalee;
kCBAdvDataTxPowerLevel = 0;
我是否正确地认为我应该获得整个广告包?如果没有,我怎么能得到它?
答案 0 :(得分:17)
不幸的是,iOS不允许您访问原始广告数据。我写了blog post来证明这一点。 虽然这篇文章是关于iBeacons的,但它适用于任何BLE广告。
编辑:为了澄清,您可以阅读非iBeacon广告的原始制造商数据字节或服务数据字节。只有iBeacon广告的制造商数据字节被CoreLocation
隐藏。见这里:Obtaining Bluetooth LE scan response data with iOS
等效的MacOS CoreLocation方法确实允许这样做,因此它可能是iOS上的故意安全或省电限制。
答案 1 :(得分:14)
基于Apple iOS的官方文档和我的个人经验:
是,iOS不允许您访问RAW广告数据。
<强> BUT 强>
如果您打算将信息放入广告包并从iOS应用程序中读取它们而不连接外围设备,则可以这样做。 这里描述如何:
1)在外围设备固件中,您必须在广告数据包中插入制造商特定数据,数据类型为 GAP_ADTYPE_MANUFACTURER_SPECIFIC ( 0xFF ) 请记住,在制造商特定数据中,前2个八位字节包含公司标识符代码,后跟其他制造商特定数据
2)在iOS
中- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
您可以使用键:
在advertiseData词典中查看制造商特定数据CBAdvertisementDataManufacturerDataKey
3)如果您希望在您的应用程序中收到外围设备发送到iOS的每个广告数据包的回叫通知,请记住将扫描选项更改为YES。请看这篇文章:Core Bluetooth - constant RSSI updates of in-range devices
在我的博文中很快就会出现一个教程:http://www.megabri.com/