Как я могу повторно подключить свое приложение при каждом открытии к тому же Bluetooth-устройству с низким энергопотреблением?

Я разрабатываю приложение для Android. Вначале это приложение показывает пользователю список устройств Bluetooth, и когда он выбирает один из них, он открывает другое действие.

Моя цель: после того, как пользователь снова откроет приложение, приложение должно будет запомнить устройство, и ему нужно попытаться подключиться к нему.

Теперь я получил свою цель таким образом:

  • Я запоминаю в предпочтении MAC-адрес выбранного устройства
  • Когда пользователь снова откроет приложение, приложение выполнит скрытое сканирование и попытается подключиться к устройству с тем же MAC-адресом.
  • для получения адреса mac я использую функцию getAddress() (когда я пытаюсь подключиться к периферийной части Android, эта функция дает мне некоторая проблема, поскольку устройство меняет свой MAC-адрес на каждом начинается:/)

Есть лучший способ получить то же самое?

Отключить тему: функция onScanResult в ScanResult некоторое время возвращает мне нулевое устройство, нормально ли это? У меня есть startLeScan (UUID [] serviceUuids, обратный вызов BluetoothAdapter.LeScanCallback), и после леденца я использую новую версию startLeScan с Scanfilter. Это может быть проблема?

Ответ 1

Для обеспечения конфиденциальности, адрес mac продолжает меняться: см. ниже фрагмент кода из спецификации:

5.4.5 Функция конфиденциальности

Bluetooth LE поддерживает функцию, которая уменьшает способность отслеживать устройство LE в течение определенного периода времени, изменяя Адрес устройства Bluetooth часто. Функция конфиденциальности не используется в режиме обнаружения GAP и процедурах, но используется, когда поддерживается в режиме подключения и подключения. В порядке для устройства, использующего функцию конфиденциальности для повторного подключения к известным устройствам, адрес устройства, называемый частным адресом, должен быть разрешимые другим устройством.

Частный адрес создается с помощью устройства, определяющие ключ идентификации (IRK), обмениваемый во время связывания Процедура.

Таким образом, идеальным способом является использование IRK для передачи фактического адреса устройства. Однако я не нашел API для этого.

В настоящее время работа вокруг - которую я использую в mny app для повторного подключения к устройству,

  • пройдите через все доступные устройства.
  • получить серийный номер no - если серийный номер не совпадает с уже сохраненным номером затем не отсоединяйте соединение.
  • Повторите шаг 2 для всех устройств.

    Эта работа будет работать только в том случае, если устройство предоставляет серийный номер через некоторую услугу.

Вы также можете попробовать установить флаг autoconnect равным true, когда вы вызываете connectGatt (контекст контекста, булевский автосоединение, обратный вызов BluetoothGattCallback)

Из документов:

public BluetoothGatt connectGatt (контекст контекста, логический autoConnect, BluetoothGattCallback) Добавлен в уровень API 18

Подключение к серверу GATT, размещенному на этом устройстве. Вызывающий абонент действует как GATT клиент. Обратный вызов используется для предоставления результатов Caller, например статус соединения, а также любые дальнейшие действия клиента GATT. метод возвращает экземпляр BluetoothGatt. Вы можете использовать BluetoothGatt для выполнять операции клиента GATT. Параметры

autoConnect Ли, чтобы напрямую подключиться к удаленному устройству (false) или автоматически как только удаленное устройство станет доступным (true).

Обратный вызов обработчика обратного вызова GATT, который получит асинхронный Обратные вызовы. Выбрасывает исключение IllegalArgumentException, если обратный вызов имеет значение null