我使用Nexus 4(4.4 kitkat)作为中央设备,使用iPad作为外围设备。外设有一项正在做广告的服务。广告包有一些数据(22字节)+服务UUID。当我试图从Android扫描外围设备时,发现了iPad外围设备。但是,当我试图从回调中的scanRecord参数中获取服务UUID时,我找不到它。我得到的只是外围设备正在发送的20字节的数据。当我尝试扫描带有UUID的设备时,我无法发现这些外围设备。
以下是用于广告服务的iOS代码。正在使用的服务id是"0000192f-0000-1000-8000-00805f9b34fb"
CBUUID *serviceUuid = [CBUUID UUIDWithString:TRANSFER_SERVICE_UUID];
[self.peripheralManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey : @[serviceUuid],
CBAdvertisementDataLocalNameKey:[[BTLEConfigs sharedBTLEConfig] getAdvertizingUUID]}];
当我在没有服务UUID的情况下扫描时,会发现设备。
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//-- how to retrieve the service id from scanRecord
}
});
}
};
这些服务是在两个iOS设备之间发现的,但在Android设备和iOS外围设备之间不起作用。如何扫描具有16位服务UUID的外围设备?感谢您的帮助。
扫描记录字节数组包含EIR格式的数据。请参阅蓝牙核心规范第8节。
扫描记录包含一个或多个顺序EIR条目,其格式如下:
<entry length (1 byte)> <data type (1 byte)> <data (length - 1 bytes)>
您正在查找类型为0x02或0x03的EIR条目(请参阅蓝牙核心规范第18.2节)。该条目的数据将包含一个或多个Little Endian格式的UUID。
示例扫描记录:
02011a0303b4540a094c69676874426c7565
可细分为:
02 01 1a Flags - 1a
03 03 b454 16-bit service UUID - 54b4
0a 09 4c69676874426c7565 Local name - LightBlue
这是Android BLE中的一个已知错误-过滤仅适用于16位UUID,而不是完整的128位。
请参阅谷歌第58931期