我想通过BLE广播一些数据。
addServiceData函数接受一个ParcelUuid和数据。
https://developer.android.com/reference/android/bluetooth/le/AdvertiseData.Builder.html
我在 Android 7.0 智能手机上进行了测试,Uuid缩小为 16位。
https://code.tutsplus.com/tutorials/how-to-advertise-android-as-a-bluetooth-le-peripheral--cms-25426
此实用程序创建128位UUID时,仅Android系统 使用16位UUID进行广告发布,并将自动调整 符合128位UUID。
这很好,因为我需要发送数据的带宽。但是相同应用会在 Android 8.1 设备上发送完整的128位Uuid 。
我不明白这一点,我希望我的应用始终发送16位的Uuid。 我找不到选择Uuid长度的选项。
答案 0 :(得分:1)
16位蓝牙UUID是以下操作的快捷方式:
0000xxxx-0000-1000-8000-00805F9B34FB
…其中xxxx
是16位。例如,如果您要宣传BEEF
UUID,我相信您需要将0000BEEF-0000-1000-8000-00805F9B34FB
传递给AdvertiseData.Builder
。
再往下,Android应该将其识别为16位蓝牙UUID,并仅广播这两个字节。相关代码在AOSP的AdvertiseHelper
和BluetoothUuid
类中:
public static byte[] uuidToBytes(ParcelUuid uuid) {
if (uuid == null) {
throw new IllegalArgumentException("uuid cannot be null");
}
if (is16BitUuid(uuid)) {
byte[] uuidBytes = new byte[UUID_BYTES_16_BIT];
int uuidVal = getServiceIdentifierFromParcelUuid(uuid);
uuidBytes[0] = (byte) (uuidVal & 0xFF);
uuidBytes[1] = (byte) ((uuidVal & 0xFF00) >> 8);
return uuidBytes;
}
...
我猜这种行为可能在7.0和8.1之间发生了变化。看起来像以前一样,他们可能无论如何都已将128位UUID转换为16位UUID。现在,看起来只有在128位UUID遵循蓝牙标准/表示法的情况下,它才能正确执行操作。