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

问题

我目前只有一个5.0手机来testing这个(Moto E2 3G 5.0的棒棒糖),但我不能在Android 5.0上宣传自定义UUID。 当我说一个自定义的UUID,我的意思是不是由蓝牙LE规范预定义的。

在我的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的信息:

图片

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

图片

如果我在Nexus 6上公布一个自定义UUID,我会看到UUID数据如期:

图片

任何人都可以确认在另一个5.0设备上的这种行为? 我是否需要制作最低支持的版本5.1? 我唯一能够在互联网上find的其他相关参考资料是Android bug跟踪器上的这张空单 。

Solutions Collecting From Web of "自定义服务UUID的Android 5.0和BLE广告"

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

我的解决方法是将您的自定义UUID插入制造商数据而不是服务UUID字段。 这只有在访问正在扫描它的中心的情况下才能起作用,并且可以明确地检查制造商数据,以确定UUID是否存在于决定连接的位置。

在我的实现中,我控制了什么中央检查来决定是否连接,所以我只是采用这种scheme,所有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个字节,否则将无法启动广告。

尽pipe大多数设备支持BLE扫描,但是我所知道的5.0设备不支持,只有less数设备支持BLE广告。

要检查您的设备是否支持在您的android代码中使用此代码。您可以在任何地方使用它。

 BluetoothAdapter.getDefaultAdapter().isMultipleAdvertisementSupported(); 

这是find你的设备是否被支持的最好的方法。 如果不支持,你不能以编程的方式做任何事情,期望购买支持的。