Android BLE: получение служебного UUID в обратном вызове onLeScan() при рекламе от iOS Peripheral

Я использую Nexus 4 (4.4 kitkat) как центральный и iPad как периферийный. Периферийный сервис, который он рекламирует. В рекламном пакете есть некоторые данные (22 байт) + сервис UUID. Когда я пытаюсь отсканировать периферию от Android, iPad периферия обнаружена.Однако, когда я пытаюсь получить UUID службы из параметра scanRecord в обратном вызове, я не смог его найти. Все, что я получаю, это данные в 20байт, которые посылает периферийное устройство. Когда я пытаюсь сканировать устройства с UUID, я не могу обнаружить эти периферийные устройства.

Ниже приведен код iOS для рекламы сервиса. Используемый идентификатор службы "0000192f-0000-1000-8000-00805f9b34fb"

CBUUID *serviceUuid = [CBUUID UUIDWithString:TRANSFER_SERVICE_UUID];
    [self.peripheralManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey : @[serviceUuid],
                                               CBAdvertisementDataLocalNameKey:[[BTLEConfigs sharedBTLEConfig] getAdvertizingUUID]}];

Устройство обнаруживается при сканировании без служебного UUID.

// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {

    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                //-- how to retrieve the service id from scanRecord
            }
        });
    }
};

Службы обнаруживаются между двумя устройствами iOS, но между Android-устройством и периферией iOS его не работает. Как сканировать периферийное устройство с 16-разрядным UUID службы? Любая помощь приветствуется.

Ответ 1

Байт байта записи сканирования содержит данные в формате EIR. См. Раздел Основные характеристики Bluetooth.

Запись сканирования содержит одну или несколько последовательных записей EIR, которые имеют следующий формат:

<entry length (1 byte)> <data type (1 byte)> <data (length - 1 bytes)>

Вы ищете запись EIR с типом 0x02 или 0x03 (см. Спецификация ядра Bluetooth, раздел 18.2). Данные для записи будут содержать один или несколько UUID в формате Little Endian.

Пример записи сканирования:

02011a0303b4540a094c69676874426c7565

Можно разбить на:

02 01 1a                    Flags               - 1a
03 03 b454                  16-bit service UUID - 54b4
0a 09 4c69676874426c7565    Local name          - LightBlue

Ответ 2

Это известная ошибка в Android BLE - фильтрация работает только с 16-битным UUID, не полным 128-битным.

См. Проблема с Google 58931