Android 5.0和BLE广告的自定义服务UUID

Mar*_*cny 10 android bluetooth bluetooth-lowenergy

问题

我目前只有一部5.0手机可以测试它(在5.0 Lollipop上的Moto E2 3G),但我无法在Android 5.0上宣传自定义UUID.当我说自定义UUID时,我指的是蓝牙LE规范预定义的 UUID .

在我的Nexus 6 Android 5.1上,一切正常.

    AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
    AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();

    // Advertising this spec assigned UUID works
    //ParcelUuid temp = new ParcelUuid(UUID.fromString("0000180D-0000-1000-8000-00805f9b34fb"));

    // Advertising this custom UUID doesn't work!!
    ParcelUuid temp = new ParcelUuid(UUID.fromString("02FD04F4-CFFF-4573-B478-F7470A7CF2F2"));

    dataBuilder.addServiceUuid(temp);

    settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);               settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
    settingsBuilder.setConnectable(true);

    AdvertiseData ad = dataBuilder.build();

    bluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), ad, null, advertiseCallback);
Run Code Online (Sandbox Code Playgroud)

观察到的行为

使用自定义UUID查看Moto E2的广告数据包时,我可以看到 - 请注意,没有关于服务UUID的信息:

图片

如果我在Moto E2(0000180D-0000-1000-8000-00805f9b34fb)上公布分配的服务UUID ,我可以看到UUID的16位表示可用:

图片

如果我在Nexus 6上宣传自定义UUID,我会按预期看到UUID数据:

图片

是否有人能够在另一台5.0设备上确认此行为?我是否需要制作支持的最低版本5.1?我在互联网上能够找到的唯一其他相关参考是Android漏洞跟踪器上的.

jca*_*ady 1

我可以确认这是运行 5.0.2(可能还有其他设备和/或版本)的 Moto G 2014 上的错误。

我的解决方法是将自定义 UUID 插入制造商数据而不是服务 UUID 字段。仅当您有权访问正在扫描它的中心并且可以明确检查制造商数据以查看 UUID 是否存在以做出连接决定时,此功能才有效。

通过我的实现,我可以控制中央检查什么来决定是否连接,因此我只是对所有在外围模式下运行的 Android 设备采用了这种方案,而不是使用正常的“addServiceUuid”方法。在 Galaxy S6 (5.0) 上进行了测试.2) 和 Nexus 5X (6.0) 并且它正在工作。

private AdvertiseData buildAdvertiseData()
{
    int manufacturerID = 0x0001;
    byte[] uuidBytes = new byte[]{ (byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F };
    return new AdvertiseData.Builder()
            .addManufacturerData(manufacturerID, uuidBytes)
            .setIncludeDeviceName(false)
            .build();
}
Run Code Online (Sandbox Code Playgroud)

确保排除设备名称,某些设备会将广告数据包放在 31 字节以上,否则将无法开始广告。