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

6
我正在处理蓝牙低功耗设备,我想知道是否可以在iOS和Core Bluetooth上读取扫描响应数据而无需连接。在读取广告包后,您可以请求来自外围设备的31字节扫描响应格式的其他数据。我知道Core Bluetooth建议如果广告包已满,您可以将本地名称放在扫描响应包中,但它是否允许您查看整个数据包呢?
2个回答

15

是的,您可以使用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规范此处来了解如何解码上述字节。
要了解更多关于为什么无法读取iBeacon数据以及如何设置的附加代码,请参见此处

4
当应用程序在前台运行时,Core Bluetooth会自动请求扫描响应数据。这不是您可以请求的。didDiscoverPeripheral通常会被调用两次,第一次没有扫描响应数据,第二次有。然而,在后台,带有扫描响应数据的第二个事件可能不会发生。 - Marcus Adams
CoreBluetooth 在返回 NSDictionary 之前是否过滤掉所有带有 iBeacon 指示符八位组 (02 15) 的数据包?这是否意味着没有 02 15 的数据包将会通过? - Kar
是的,那些字节序列无法被识别为iBeacon的广告将会在kCBAdvDataManufacturerData键下填充它们的字节。 - davidgyoung
6
我认为这篇文章非常混乱——Core Bluetooth 接收到的原始广告字节并不可用。确实有一些字节,例如用于服务和制造商数据的字段,但这些字段已经被解析过了。iOS 还过滤了很多信息,我们无法获取——我认为阅读这篇文章的人们正在混淆由 BLE 设备传输并由 iOS 接收到的完整原始字节和在 advertisementData 参数中可用的字节。如果确实有一种方法可以获取原始字节,请告诉我。 - dinesharjani
1
@dinesharjani,您是正确的,完整广告的原始字节不可用,但 BLE 制造商广告类型的制造商数据部分的原始字节绝对可用。同样,BLE 服务广告类型中的服务数据的原始字节也是可用的。我已经编辑了我的答案,使其更加清晰明了。 - davidgyoung
显示剩余7条评论

6

我正在使用一个外设,其中包含一些制造商数据。我认为这些数据是通过扫描响应传输的,因为在初始广告中没有足够的空间来包含128位UUID、信道、RSSI和可连接标志。我连续接收到两个didDiscoverPeripheral:...调用(包括我的代码处理时间在内,间隔为3ms)。第一个字典中没有kCBAdvDataManufacturerData键,但第二个有。我假设扫描响应已经被自动请求,并且回复结果导致第二个调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接