BLE: получение BluetoothDevice через BluetoothAdapter # getRemoteDevice () против сканирования - PullRequest
0 голосов
/ 28 апреля 2018

Сценарий:

Учитывая, устройство, которое всегда включено, и делает рекламу Bluetooth Low Energy каждую секунду.
Мне нужно реализовать приложение для планшетов Android, которое подключается к этому устройству через Bluetooth Low Energy, отправляет некоторые команды и затем отключается от него.
Минимальная версия Android: та, которая работает лучше всего, я могу решать. Я начал с API 21 (Android 5.0, Lollipop)

Проблема:

Проблемы, возникающие в стеке BLE, также вызывали у меня проблемы: я хотел бы создать успешное прямое соединение с использованием объекта, извлеченного с помощью BluetoothAdapter # getRemoteDevice (MACAddress: String) , и это всегда не удается.

Результаты моего исследования:

Ниже приведены вопросы / ответы / сообщения, которые я нашел и которые кажутся полезными (может быть, они кому-нибудь помогут):

Вопросы:

Помимо этого, я посмотрел исходный код BluetoothDevice и обнаружил, что параметр Context метода connectGatt () равен , а не используется вообще:
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java#1899
Хотите знать, может ли это быть одной из причин недостатков стека BLE?

Кроме того, я не понимаю, в чем разница между BluetoothDevice объектом, полученным сканером, и объектом, полученным BluetoothAdapter # getRemoteDevice (MACAddress: String) методом.
Если я запускаю прямое соединение (для параметра autoconnect установлено значение false при вызове connectGatt () ) на устройстве, полученном в результате сканирования, соединение обычно выполняется успешно. Но прямое соединение всегда терпит неудачу ( status = 133, время ожидания ) при использовании объекта, полученного с помощью getRemoteDevice () .

Поскольку устройство, к которому я хочу подключиться, каждую секунду рекламирует себя, я ожидаю, что прямое подключение будет работать всегда / большую часть времени, как в случае сканирования.
Поскольку фоновое соединение (для параметра autoconnect установлено значение true ) очень медленное, я не могу на это полагаться.
Кроме того, поскольку сканирование ненадежное и медленное, я не могу заставить пользователя ждать каждый раз при запуске приложения.

Подводя итог моим вопросам:

  • Параметр Context метода connectGatt () используется , а не вообще - это может быть одной из причин недостатков стека BLE ? Я полагаю, кто-то положил это по уважительной причине.
  • В чем разница между BluetoothDevice объектом, полученным сканером, и объектом, извлеченным BluetoothAdapter # getRemoteDevice (MACAddress: String) методом?

1 Ответ

0 голосов
/ 29 апреля 2018
  1. Параметр context использовался в более ранних версиях Android, но, видимо, больше не был нужен. Вы все равно должны передать действительный контекст, чтобы быть совместимым с более ранними версиями или более новыми, если они решат использовать его снова.

  2. Не должно быть никакой разницы. Но если вы просто подключитесь по адресу устройства Bluetooth, вы заметите недостаток API в том, что вы не можете передать тип адреса (открытый или случайный). Поэтому, если вы попытаетесь подключиться к статическому случайному адресу, это может произойти сбой, если вы сначала не отсканировали устройство. Это связано с тем, что Android хранит кеш адресов и тип адреса, который был в последней рекламе. Поэтому попробуйте сначала отсканировать и убедитесь, что вы видите устройство, к которому хотите подключиться. Затем попробуйте подключиться с помощью BluetoothAdapter # getRemoteDevice (MACAddress: String).

...