Android BLE广告UUID长度在不同的SDK级别上有所不同吗?

时间:2019-06-13 13:16:31

标签: android bluetooth-lowenergy uuid

我想通过BLE广播一些数据。

addServiceData函数接受一个ParcelUuid和数据。

https://developer.android.com/reference/android/bluetooth/le/AdvertiseData.Builder.html

我在 Android 7.0 智能手机上进行了测试,Uuid缩小为 16位

https://code.tutsplus.com/tutorials/how-to-advertise-android-as-a-bluetooth-le-peripheral--cms-25426

  

此实用程序创建128位UUID时,仅Android系统   使用16位UUID进行广告发布,并将自动调整   符合128位UUID。

这很好,因为我需要发送数据的带宽。但是相同应用会在 Android 8.1 设备上发送完整的128位Uuid

我不明白这一点,我希望我的应用始终发送16位的Uuid。 我找不到选择Uuid长度的选项。

1 个答案:

答案 0 :(得分:1)

16位蓝牙UUID是以下操作的快捷方式:

0000xxxx-0000-1000-8000-00805F9B34FB

…其中xxxx是16位。例如,如果您要宣传BEEF UUID,我相信您需要将0000BEEF-0000-1000-8000-00805F9B34FB传递给AdvertiseData.Builder

再往下,Android应该将其识别为16位蓝牙UUID,并仅广播这两个字节。相关代码在AOSP的AdvertiseHelperBluetoothUuid类中:

public static byte[] uuidToBytes(ParcelUuid uuid) {
    if (uuid == null) {
        throw new IllegalArgumentException("uuid cannot be null");
    }

    if (is16BitUuid(uuid)) {
        byte[] uuidBytes = new byte[UUID_BYTES_16_BIT];
        int uuidVal = getServiceIdentifierFromParcelUuid(uuid);
        uuidBytes[0] = (byte) (uuidVal & 0xFF);
        uuidBytes[1] = (byte) ((uuidVal & 0xFF00) >> 8);
        return uuidBytes;
    }

    ...

我猜这种行为可能在7.0和8.1之间发生了变化。看起来像以前一样,他们可能无论如何都已将128位UUID转换为16位UUID。现在,看起来只有在128位UUID遵循蓝牙标准/表示法的情况下,它才能正确执行操作。