BluetoothPairingStateProvider: getUuids() возвращает нуль для устройства

Контекст:

Я работаю над FIDO-U2F bluetooth-аутентификатором с nRF52 BLE SoC. и хочу, чтобы это проверить на примере Google.

До сих пор я реализовал спецификацию FIDO Bluetooth, и у меня есть устройство, которое рекламируется как FIDO-совместимое устройство.

Благодаря nRF Connect я гарантировал, что все сервисы и характеристики представлены правильно и что я могу взаимодействовать с ним только тогда, когда мое устройство надежно сопряжено (с LTK):

Проблема:

Когда приложение сканирует подходящее устройство FIDO, оно не находит мое.

Я застрял на экране, который просит нажать кнопку в течение 5 секунд, что мне не нужно, так как мое устройство отвечает на запрос на сопряжение без взаимодействия с пользователем и уже связано с моим SAMSUNG A8.

I/BluetoothDevicePreference: onDeviceAttributesChanged :: Device = (N) D8BE86, isBonded = 12 , mIsOnProgressAddVI = false
I/Fido: [BleScanner] startScan()
E/Fido: [BluetoothPairingStateProvider] getUuids() returns null for device: D8:BE:86:4A:E5:65
I/Fido: [PreferredTransportProvider] BLE enabled but no device is paired
I/Fido: [AuthenticateBaseChimeraActivity] User selected transport ble
I/Fido: [ViewController] Accepting proposed view {"viewName":"ble_instructions","anyU2fDevicesPaired":false}: outranks current (2 > 0)
I/Fido: [ViewPresenter] viewSelected(...) ble_instructions
I/Fido: [U2fRequestController] onResultReceived(null, ErrorResponseData{errorCode=5})
I/Fido: [BleScanner] stopScan()

Я попытался удалить данные сопряжения, и все, что у меня есть, это:

I/BluetoothDevicePreference: onDeviceAttributesChanged :: Device = (N) D8BE86, isBonded = 10 , mIsOnProgressAddVI = false

Рекламные флаги в настоящее время установлены на " BR / EDR не поддерживается ", но я также безуспешно пытался " LE Limited Discoverable Mode " и " LE General Discoverable Mode ".

Я посмотрел на источники Android-Fido, но BLE-сканирование, кажется, импортировано из другого места, я не могу отладить его в этом проекте.

Любой указатель приветствуется

0 ответов

Вы попали на этот экран?

Возможно, нам понадобится добавить поле данных сервиса (0x16) в рекламный пакет. Это упоминается в спецификации FIDO здесь

Добавлен фрагмент кода Android для рекламы с полем Service Data:

AdvertiseData data = new AdvertiseData.Builder()
                        .addServiceUuid(new ParcelUuid(fido2GattService.getUuid()))
                        .setIncludeDeviceName(true)
                        .addServiceData(new ParcelUuid(fido2GattService.getUuid()), new byte[] {(byte)192, (byte)192, (byte)192})
                        .build();

Если вы хотите перехватывать пакеты Bluetooth, чтобы увидеть, какой у вас рекламный пакет, вы можете использовать PacketLogger (для MacOS)

Вот скриншот рекламного пакета

Красное поле - Сервисные данные

Другие вопросы по тегам