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

时间:2014-08-19 18:27:39

标签: ios bluetooth bluetooth-lowenergy core-bluetooth ibeacon

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

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

2 个答案:

答案 0 :(得分:10)

是的,您可以使用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规范here.

来了解如何解码上述字节

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

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

答案 1 :(得分:5)

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