我正在使用蓝牙低功耗设备,我想知道是否可以在没有连接的情况下将扫描响应数据读取到具有iOS和Core蓝牙的广告。
据我所知,在阅读广告包后,您可以以31字节扫描响应的格式从外设请求其他数据。我知道Core Bluetooth建议如果广告包已满,您可以将本地名称放在扫描响应数据包中,但它是否允许您查看整个数据包?
答案 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键,但第二个没有。我假设扫描响应是是自动请求的,而回复会导致第二次调用。