BLE Сопряжение с Android-устройствами, действующими как периферийные устройства - PullRequest
0 голосов
/ 06 сентября 2018

Я использую Android Things 1.0.4 в прототипе, где он действует как периферийное устройство BLE: рекламные сервисы и запуск сервера GATT.

Я сталкиваюсь с проблемой в процессе сопряжения BLE при попытке связать плату Android Things (Raspberry Pi 3) и смартфон.

Поскольку устройство не имеет дисплея, я установил с помощью BluetoothConfigManager:

IoCapability = BluetoothConfigManager.IO_CAPABILITY_NONE

, что приводит к ошибке AUTH_FAILED каждый раз.

Вместо

IoCapability = BluetoothConfigManager.IO_CAPABILITY_OUT

регистрирует ключ сопряжения и предлагает смартфону ввести его во время сопряжения, но это приводит к ошибке REMOVED.

Вопросы:

  • Может ли Android Things в периферийной роли справиться с сопряжением BLE или нет?
  • Есть ли еще что-то, что нужно реализовать в коде приложения, чтобы повторить полноценную логику Android?

Вот исходный код приложения Android Things для тестирования сопряжения и соединения BLE

Тот же код, извлеченный из определенных элементов Android Things, успешно завершает сопряжение и соединение BLE при работе на телефоне Android в качестве периферийного устройства (сервер) и устройстве Android или iPhone в качестве центрального (клиент).

1 Ответ

0 голосов
/ 19 сентября 2018

Вообще говоря, если вы попытаетесь прочитать зашифрованную характеристику GATT перед сопряжением (что автоматически запускает логику сопряжения), это приведет к ошибке 137 GATT, возвращенной из запроса на чтение (AUTH_FAIL).Это связано с тем, что у устройства недостаточно времени, чтобы завершить настройку связи до отправки ответа стеком Bluetooth. Повторная попытка повторного запроса на чтение в целом завершается успешно.

Я не проверял это на клиентском устройстве iOS, но это, безусловно, относится к клиенту Android, подключенному к периферийному устройству Android (Things).Поэтому я бы порекомендовал несколько вещей:

  1. Пусть клиентское (мобильное) устройство явно инициирует сопряжение, и Android Things должен просто реагировать на эти входящие запросы в BluetoothPairingCallback.Это позволяет мобильному устройству выбирать тип сопряжения на основе сообщенных возможностей устройства IoT.

  2. Отделение потока сопряжения от потока GATT.Соединитесь с обнаруженным устройством отдельно от любых попыток прочитать характеристики.Это лучший способ избежать проблем с синхронизацией.

Относительно выбора возможностей, это зависит от вашего устройства.По моему опыту, если вы выберете IO_CAPABILITY_NONE, это приведет к PAIRING_VARIANT_CONSENT внутри onPairingInitiated(), и операция сопряжения завершится успешно после вызова finishPairing().Если вы настраиваете свои возможности, вы должны быть готовы к любому количеству вариантов, требующих отображения PIN-кода для входа на мобильное устройство.Я лично не проверял эти пути.

...