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

标签 android bluetooth bluetooth-lowenergy

问题

我目前只有一部 5.0 手机可以对此进行测试(5.0 Lollipop 上的 Moto E2 3G),但我无法在 Android 5.0 上宣传自定义 UUID。当我说自定义 UUID 时,我的意思是它不是 predefined by the Bluetooth LE spec.

在我的 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);

观察到的行为

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

IMAGE

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

IMAGE

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

IMAGE

是否有人能够在另一台 5.0 设备上确认此行为?我需要制作最低支持版本 5.1 吗?我能在互联网上找到的唯一相关引用资料是空的 ticket on the Android bug tracker .

最佳答案

我可以确认这是运行 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();
}

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

关于自定义服务UUID的Android 5.0和BLE广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31459797/

相关文章:

c - 使用 bluez 从 C 中的 ble 设备访问电池服务的示例代码

android - 调试检测装置(ADB)不工作

当列表行中填充微调器时,android onListItemClick 不工作

android - 为eclipse创建一个8英寸平板电脑模拟器android

android - 如何获取我正在为 RSSI 读取的 BLE 设备的地址?

ios - iBeacon 应用程序 - 同时接收/传输

android - 如何在 Android 中获取用户选择的日期格式?

bluetooth - 使用 bluez/bluetoothctl/gatttool 连接到蓝牙智能/LE 体重秤

ios8 - NSInputStream 从不在 iOS9(经典蓝牙)上使用 HasBytesAvailable

Android BLE 问题 : Unsupported transport for background connection