Почему мы можем выполнить сопряжение с устройством BLE, не отображая системный диалог, используя BroadcastReceiver?
Я использую RxAndroidBle
библиотека для сканирования и подключения с устройствами BLE. Мне также нужно выполнить сопряжение с этим найденным устройством, не отображая системный диалог о сопряжении клавиш. Механизм склеивания JustWorks
,
Я уже достиг этого, создав BroadcastReceiver
, следуя сути, которую я разместил ниже (кредиты @dglozano).
Суть кода: https://gist.github.com/dglozano/9b0ce38a558eeca16137909bd368698c
Это на самом деле работает довольно хорошо, но я хотел бы понять, почему, когда я просто использую rxBleDevice.bluetoothDevice.createBond()
он отображает Dialog
но когда я справлюсь с этим самостоятельно BroadcastReceiver
тогда это не так. Это каким-то образом отменяет регистрацию обычного BroadcastReceiver, который будет обрабатывать устройство BOND_STATE
? Почему мой BroadcastReceiver
берет на себя основной контроль над этим? Меня интересует - что происходит внутри, когда я регистрирую свою собственную receiver
,
1 ответ
Хорошо, я понял это.
Мое первое впечатление, что это BroadcastReceiver
обрабатывает эту систему Dialog
был неправ. Мы используем этот приемник только для двойной проверки BOUND_STATE
, Это не имеет никакого отношения к диалогу сопряжения, это предположение было ошибкой.
Итак, первым важным фактом является то, что только createBond()
метод необходим для сопряжения. Остальное только о его создании.
Наиболее важным фактом является то, что это метод сопряжения "Просто работает". Там мы можем прочитать о безопасности BLE и о "Просто работает". Как вы можете прочитать здесь:
В этом методе TK устанавливается в 0.
ТК это временный ключ. На данный момент, давайте вернемся на данный момент к нашему Android createBond()
метод. В документации мы можем прочитать:
Системные сервисы Android будут обрабатывать необходимые взаимодействия с пользователем для подтверждения и завершения процесса склеивания.
Но если он обрабатывает взаимодействия с пользователем, почему он не отображает диалог? Мы находим ответ, когда объединяем эти две вещи вместе. Если для параметра "Временный ключ" задано значение "0", отображение диалогового окна "Сопряжение ключа" не требуется для обработчика Android.
Есть небольшие изменения между Bluetooth 4.0/4.1 и Bluetooth 4.2, но это не должно влиять на это поведение. Вы можете прочитать больше об этом здесь.
TL: DR Использование метода сопряжения "Просто работает" означает, что значение временного ключа установлено в 0, что означает, что оно нам не нужно во время процесса сопряжения. createBound()
Метод обрабатывает только необходимые взаимодействия с пользователем, поэтому, когда нам не нужен ключ сопряжения, нам не нужно взаимодействовать с пользователем по этому поводу. Вот почему Dialog
не отображается - потому что это не нужно.