[英]Android 5.0 and BLE advertising of custom Service UUID
我目前只有一部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);
使用自定义UUID查看Moto E2的广告数据包时,我可以看到 - 请注意,没有关于服务UUID的信息:
如果我在Moto E2( 0000180D-0000-1000-8000-00805f9b34fb
)上公布已分配的服务UUID,我可以看到UUID的16位表示可用:
如果我在Nexus 6上宣传自定义UUID,我会按预期看到UUID数据:
是否有人能够在另一台5.0设备上确认此行为? 我是否需要制作支持的最低版本5.1? 我在互联网上能够找到的唯一其他相关参考是Android漏洞跟踪器上的空票 。
我可以确认这是Moto G 2014运行5.0.2(可能还有其他设备和/或版本)的错误。
我的解决方法是只将您的自定义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字节以上,否则将无法启动广告。
只有少数设备支持BLE广告,尽管大多数设备都支持BLE扫描,据我所知,5.0设备不受支持。
在Android代码中使用此代码检查您的设备是否受支持。您可以在其中的任何位置使用它。
BluetoothAdapter.getDefaultAdapter().isMultipleAdvertisementSupported();
这是查找您的设备是否受支持的最佳方法。 如果它不受支持你不能以编程方式做任何事情,期望购买支持的那个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.