使用iOS获取蓝牙LE扫描响应数据

我正在使用蓝牙低功耗设备,我想知道是否可以将扫描响应数据读取到没有连接的iOS和Core蓝牙的广告。

据我所知,在阅读广告包后,您可以以31字节扫描响应的格式从外设请求其他数据。 我知道Core Bluetooth建议如果广告包已满,您可以将本地名称放在扫描响应数据包中,但它是否允许您查看整个数据包?

是的,您可以使用CoreBluetooth读取BLE广告的完整字节, 只要它不是iBeacon广告。 如果是iBeacon广告, CoreBluetooth将阻止您查看字节的能力。 您使用的回调如下:

 - (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 

原始字节将出现在NSDictionary *advertisementData 。 但他们关键持有这些数据将被iBeacons的操作系统删除。

这是你在回调中的advertisementData NSDictionary中得到的一个例子。 此示例用于检测AltBeacon广告(开源信标标准),标识符为2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 2

 { kCBAdvDataIsConnectable = 0; kCBAdvDataManufacturerData = <1801beac 2f234454 cf6d4a0f adf2f491 1ba9ffa6 00010002 be00>; } 

您可以在此处查看AltBeacon规范,了解如何解码上述字节。

有关无法读取iBeacon数据的原因以及显示如何设置的其他代码的详细信息,请参阅此处:

http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html

我正在使用具有一些制造商数据的外设,我认为这些数据是在扫描响应中传输的,因为在初始广告中没有空间可以使用128位UUID加通道,RSSI和可连接标志。 我接到两次调用didDiscoverPeripheral:…快速连续(相隔3ms,包括我的代码中的一些处理时间)。 第一个没有dict中的kCBAdvDataManufacturerData键,但第二个没有。 我假设正在自动请求扫描响应,并且回复导致第二次调用。