Android BLE:从iOS外设广告时,在onLeScan()回调中检索服务UUID

时间:2013-12-03 13:14:23

标签: android ios bluetooth-lowenergy

我使用Nexus 4(4.4 kitkat)作为中心,iPad作为外围设备。外围设备有广告服务。广告包有一些数据(22字节)+服务UUID。当我尝试扫描周边设备时Android,iPad外围设备被发现。但是当我尝试从回调中的scanRecord参数获取服务UUID时,我找不到它。我得到的是外围设备正在发送的20byte数据。当我尝试扫描设备时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扫描外围设备?感谢任何帮助。

2 个答案:

答案 0 :(得分:8)

扫描记录字节数组包含EIR格式的数据。请参阅Bluetooth Core Specification第8节。

扫描记录包含一个或多个顺序EIR条目,其格式如下:

<entry length (1 byte)> <data type (1 byte)> <data (length - 1 bytes)>

您正在寻找类型为0x02或0x03的EIR条目(请参阅Bluetooth Core Specification第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

答案 1 :(得分:1)

这是Android BLE中的已知错误 - 过滤仅适用于16位UUID而不是完整的128位。

请参阅Google issue 58931