我正在处理蓝牙低功耗设备,我想知道是否可以在iOS和Core Bluetooth上读取扫描响应数据而无需连接。在读取广告包后,您可以请求来自外围设备的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广告(一个开源beacon标准)标识符2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 2的示例。
{
kCBAdvDataIsConnectable = 0;
kCBAdvDataManufacturerData = <1801beac 2f234454 cf6d4a0f adf2f491 1ba9ffa6 00010002 be00>;
}
你可以通过查看AltBeacon规范此处来了解如何解码上述字节。我正在使用一个外设,其中包含一些制造商数据。我认为这些数据是通过扫描响应传输的,因为在初始广告中没有足够的空间来包含128位UUID、信道、RSSI和可连接标志。我连续接收到两个didDiscoverPeripheral:...调用(包括我的代码处理时间在内,间隔为3ms)。第一个字典中没有kCBAdvDataManufacturerData键,但第二个有。我假设扫描响应已经被自动请求,并且回复结果导致第二个调用。
CoreBluetooth
在返回NSDictionary
之前是否过滤掉所有带有 iBeacon 指示符八位组 (02 15
) 的数据包?这是否意味着没有02 15
的数据包将会通过? - KaradvertisementData
参数中可用的字节。如果确实有一种方法可以获取原始字节,请告诉我。 - dinesharjani