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

时间:2015-07-16 16:32:57

标签: android bluetooth bluetooth-lowenergy

问题

我目前只有一部5.0手机可以测试它(在5.0 Lollipop上的Moto E2 3G),但我无法在Android 5.0上宣传自定义UUID&#s; s。当我说自定义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(0000180D-0000-1000-8000-00805f9b34fb)上宣传已分配的服务UUID,我可以看到UUID的16位表示可用:

IMAGE

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

IMAGE

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

2 个答案:

答案 0 :(得分:0)

我可以确认这是运行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字节以上,否则将无法开始投放广告。

答案 1 :(得分:-1)

虽然大多数设备支持BLE扫描,但只有少数设备支持BLE广告,据我所知,5.0设备不受支持。

要在Android代码中使用此代码检查您的设备是否受支持。您可以在其中的任何位置使用它。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table id='dynamicTable'></table>
<input type='button' id='cal' value='Calculate'>

这是查找您的设备是否受支持的最佳方法。如果它不受支持你不能以编程方式做任何事情,期望购买支持的那个。