Почему мы можем выполнить сопряжение с устройством BLE, не отображая системный диалог, используя BroadcastReceiver? - PullRequest
0 голосов
/ 10 января 2019

Я использую библиотеку RxAndroidBle для сканирования и подключения к устройствам BLE. Мне также нужно выполнить сопряжение с этим найденным устройством, не отображая системный диалог о сопряжении клавиш. Механизм склеивания: JustWorks.

Я уже достиг этого, создав BroadcastReceiver, следуя сути, которую я разместил ниже (кредиты @dglozano).

Суть кода: https://gist.github.com/dglozano/9b0ce38a558eeca16137909bd368698c

На самом деле это работает довольно хорошо, но я хотел бы понять, почему, когда я просто использую rxBleDevice.bluetoothDevice.createBond(), он отображает Dialog, но когда я обрабатываю его своим собственным BroadcastReceiver, тогда это не так. Это каким-то образом отменяет регистрацию обычного BroadcastReceiver, который будет обрабатывать устройство BOND_STATE? Почему мой BroadcastReceiver берет на себя основной контроль над этим? Меня интересует - что происходит внутри, когда я регистрирую свою receiver.

1 Ответ

0 голосов
/ 10 января 2019

Хорошо, я понял это.

Мое первое впечатление, что этот BroadcastReceiver обрабатывает эту систему Dialog, было неверным. Мы используем этот приемник только для двойной проверки BOUND_STATE. Это не имеет ничего общего с диалогом сопряжения, это предположение было ошибкой.

Итак, первый важный факт заключается в том, что для сопряжения необходим только метод createBond(). Остальное только о его создании.

Самый важный факт - это метод сопряжения «Просто работает». Там мы можем прочитать о безопасности BLE и о "Просто работает". Как вы можете прочитать здесь:

В этом методе ТЗ устанавливается на 0.

TK - это временный ключ. В этот момент вернемся к нашему методу Android createBond(). В документации мы можем прочитать:

Системные службы Android будут обрабатывать необходимые взаимодействия с пользователем для подтверждения и завершения процесса соединения.

Но если он обрабатывает взаимодействия с пользователем, почему он не отображает диалог? Мы находим ответ, когда объединяем эти две вещи вместе. Если для параметра «Временный ключ» задано значение «0», отображение диалогового окна «Сопряжение ключа» не требуется для обработчика Android.

Есть небольшие изменения между Bluetooth 4.0 / 4.1 и Bluetooth 4.2, но это не должно влиять на это поведение. Вы можете прочитать больше об этом здесь .

TL: DR Использование метода сопряжения «Просто работает» означает, что значение временного ключа установлено в 0, что означает, что оно нам не нужно во время процесса сопряжения. createBound() метод обрабатывает только необходимые взаимодействия с пользователем, поэтому, когда нам не нужен ключ сопряжения, нам не нужно взаимодействовать с пользователем по этому поводу. Вот почему Dialog не отображается - потому что в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...