16-битный Bluetooth UUID является сокращением для:
0000xxxx-0000-1000-8000-00805F9B34FB
… где xxxx
- 16 бит.Например, если вы хотите объявить BEEF
UUID, я считаю, что вам нужно передать 0000BEEF-0000-1000-8000-00805F9B34FB
в AdvertiseData.Builder
.
Далее по стеку, Android должен распознавать это как 16-битный Bluetooth UUIDи транслировать только два байта.Соответствующий код находится в классах AdvertiseHelper
и BluetoothUuid
в AOSP:
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 соответствует стандарту / нотации Bluetooth.