Android BLE Реклама UUID Длина отличается на разных уровнях SDK? - PullRequest
0 голосов
/ 13 июня 2019

Я хочу транслировать некоторые данные через 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 для соответствия.

Это нормально, потому что мне нужна пропускная способность для данных, которые я отправляю. Но то же самое приложение отправляет полный 128-битный Uuid на Android 8.1 устройство.

Я не понимаю этого, и я хочу, чтобы мое приложение всегда отправляло 16-битный Uuid. Я не нашел возможности выбрать длину Uuid.

1 Ответ

1 голос
/ 14 июня 2019

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.

...