Вообще говоря, если вы попытаетесь прочитать зашифрованную характеристику GATT перед сопряжением (что автоматически запускает логику сопряжения), это приведет к ошибке 137 GATT, возвращенной из запроса на чтение (AUTH_FAIL
).Это связано с тем, что у устройства недостаточно времени, чтобы завершить настройку связи до отправки ответа стеком Bluetooth. Повторная попытка повторного запроса на чтение в целом завершается успешно.
Я не проверял это на клиентском устройстве iOS, но это, безусловно, относится к клиенту Android, подключенному к периферийному устройству Android (Things).Поэтому я бы порекомендовал несколько вещей:
Пусть клиентское (мобильное) устройство явно инициирует сопряжение, и Android Things должен просто реагировать на эти входящие запросы в BluetoothPairingCallback
.Это позволяет мобильному устройству выбирать тип сопряжения на основе сообщенных возможностей устройства IoT.
Отделение потока сопряжения от потока GATT.Соединитесь с обнаруженным устройством отдельно от любых попыток прочитать характеристики.Это лучший способ избежать проблем с синхронизацией.
Относительно выбора возможностей, это зависит от вашего устройства.По моему опыту, если вы выберете IO_CAPABILITY_NONE
, это приведет к PAIRING_VARIANT_CONSENT
внутри onPairingInitiated()
, и операция сопряжения завершится успешно после вызова finishPairing()
.Если вы настраиваете свои возможности, вы должны быть готовы к любому количеству вариантов, требующих отображения PIN-кода для входа на мобильное устройство.Я лично не проверял эти пути.