Сценарий:
Учитывая, устройство, которое всегда включено, и делает рекламу 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) методом?