Как мне управлять соединениями Bluetooth в Android?

В. Каковы ваши лучшие методы управления Bluetooth-подключением?

Я прочитал руководство по Bluetooth для Android и множество руководств по подключению Bluetooth. Бесполезно ни с дизайном инкапсуляции, ни с лучшими практиками.

  • Когда я должен открыть/закрыть соединение?
  • Является ли «соединение» с одним устройством Bluetooth «сокетным» соединением?
  • Может ли одно соединение отправлять данные во время прослушивания? (...или между состояниями прослушивания).

Я никогда раньше не кодировал подключение к внешним устройствам. Мне потребовалось две недели, чтобы понять код, который сканирует ближайшие Bluetooth-устройства и добавляет их в ListView. Слушатели, трансляции и адаптеры!

Мой проект будет печатать от 1 до 40 чеков каждые 15 минут на чековом принтере Bluetooth. На данный момент безопасность не является проблемой. По тому же соединению он также будет получать данные (одновременная отправка и получение не являются необходимыми, но были бы полезны). Я еще не уверен, как устройства настроены на этом единственном устройстве ключа, но я предполагаю, что устройства подключены к ключу через USB-контроллер.

Пока что у меня есть 1 объект для управления одним соединением ввода-вывода. Статически я открываю действие, чтобы выбрать соединение (чтобы позже сохранить label, mac и pin в базе данных). На основе руководств у меня есть методы «открыть», «прослушать», «отправить» и «закрыть». Что меня смущает, так это "как" использовать эти функции. Могу ли я оставить соединение открытым весь день (10 часов) и использовать его каждые 3 минуты? Должен ли я открывать/закрывать соединение при отправке или запросе данных? Где я могу обнаружить необходимость повторного подключения?


person Kevin J.    schedule 24.03.2015    source источник
comment
Никаких отвлекающих факторов, никакой болтовни (прочитайте help→tour)   -  person Anthon    schedule 24.03.2015
comment
Да, никаких отвлекающих факторов или болтовни. Мне не нужны темы, не связанные с Bluetooth-подключением. merriam-webster.com/dictionary/chitchat У меня есть привычка предоставлять слишком много информация, но со всеми проблемами, которые у меня были только при сканировании соединений, было бы очень полезно иметь представление о том, как обрабатываются соединения Bluetooth.   -  person Kevin J.    schedule 24.03.2015


Ответы (2)


извините за краткий ответ, но из моей практики с API Bluetooth я обнаружил, что это видео очень хорошо описывает вещи (полностью личное мнение...)

Видео 1

Кроме того, это полезно, когда у вас НЕТ предыдущего опыта.

Учебник

И, как последний раз, проверьте этот вопрос в stackoverflow, там есть куча хороших ссылок и примеров!!

Еще раз извините за нехватку, но я считаю, что если вы проверите это, по крайней мере, на большинство ваших вопросов и опасений будет дан ответ!

:)


ИЗМЕНИТЬ


Итак, позвольте мне быть немного более описательным и поделиться своим опытом.

Я написал приложение, которое взаимодействует с устройством BLE, которое имеет 3 функции.

  • двусторонняя кнопка, управляемая событием (нажмите кнопку на телефоне -> событие запускается на устройство; нажмите кнопку на устройстве BLE -> событие запускается на телефон)

  • отправить запрос с телефона -> ответы устройства BLE с текущим процентом заряда батареи

  • непрерывное считывание сигнала силы (как приблизительное расстояние) между телефоном и устройством BLE


Пока все хорошо, теперь дело в том, что основной подход:

  1. Поиск BLE-устройств (поиск bluetooth или «обнаружение» ближайших bluetooth-устройств)

    • Here you will need android permissions!
  2. Выберите устройство, к которому хотите подключиться

    • To differ the devices (maybe there are a lot around you :) ) you can use BLE device's name or UUID or ... best - use the name ;)
  3. После того, как оба устройства соединятся друг с другом, вы можете начать связь Gatt. Подход с конечным автоматом для меня слишком излишен. Но в любом случае связь осуществляется через байты (в моем случае...)

  4. В одном из видео/ресурсов было что-то конкретное и ОЧЕНЬ ПОЛЕЗНОЕ по крайней мере для меня! Честно говоря, я точно не помню, но идея заключалась в том, что перед любым общением РЕКОМЕНДУЕТСЯ прочитать/получить все параметры с устройства BLE или чего-то подобного...

    • Maybe it was something like discoverOptions() or something like that
  5. Замечательно будет знать «коды связи» вашего устройства или, по крайней мере, я их так называю.

    • Check this link for example: Link ** Now you can see there are tables with the USEFUL INFO! E.g. if you want to read the battery level you navigate to this page and find that in order to read the battery, the service name is UUID XXXXX and you need to send 0x01 to the BLE device and it will "answer" to your call with some data which is again in bytes.

Я очень надеюсь, что это хоть как-то поможет!

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ Это строго основано на моем опыте, и могут быть некоторые несоответствия или неправильные термины, но это то, как я лично вижу вещи, и потому что мой проект был долгим. назад, я не помню точно большинство вещей.

person Stuci    schedule 24.03.2015
comment
Просто, чтобы отметить что-то важное из моего опыта, максимальное количество активных подключений Bluetooth (особенно Bluetooth Low Energy) жестко запрограммировано на 6! После этого числа результаты НЕ предсказуемы :) - person Stuci; 24.03.2015
comment
Спасибо! Разместил заметки, но отметил ваши как мой ответ. Надеюсь, это нормально, размещая таким образом. Это много информации, чтобы пройти через. ;) - person Kevin J.; 25.03.2015

ВАЖНЫЙ:

Это только краткий перечень ссылок, предоставленных STUCI выше. С тех пор он обновил свой ответ, и я не обновлял/редактировал это лето. Темы в моем резюме не являются пояснительными, а предназначены для справки и помощи в постановке конкретных вопросов.

Исходный пост...

Спасибо, Стуци! Что-то из этого было полезно: - что-то нет. Я подумал, что лучше всего собраться с мыслями и посмотреть, что было объяснено, а что нет.

(Я не могу опубликовать это в комментарии, извините)

ПОЖАЛУЙСТА, ЗВОНИТЕ МНЕ ПО ВСЕМ НЕПРАВИЛЬНЫМ УСЛОВИЯМ.

Видео Bluetooth LE

(Охватывает множество случайных вещей)

Хотя мне "не нравятся" видео с кодом: - Я посмотрел его, потому что его рекомендовали... и я рад, что сделал это. Хотя это и не очень помогло, оно познакомило меня с некоторыми понятиями, о которых я не знал. Поскольку я нацелен на старые устройства Android (v8+), функции LE не имеют значения.

  • Отправка данных: [в зависимости от исходного набора функций] нет необходимости постоянно извлекать данные (например, с помощью датчика температуры), но некоторые устройства могут «отправлять» их на устройство при изменении. Кажется, используется концепция дизайна «реклама».
  • UUID определяют услуги и/или характеристики подключенного устройства.
  • Возможность записи конфигурации на подключенные устройства.
  • Характеристики, которые кажутся просто «настройками», которые можно назначать через Bluetooth. Не уверен, что это (~ 19 минут) применимо к коннектоинам без gatt, но похоже на конечный автомат, который контролирует
  • Рекламные объявления, которые кажутся «метаданными» относительно текущего состояния или конфигурации устройств (~ 24 минуты). Опять же, не уверен, что это относится даже к не LE Bluetooth.

Оставить соединения открытыми

Соединения Bluetooth действительно могут оставаться открытыми; начиная с точки, в которой был успешно вызван метод startActivityForResult(...). Две основные вещи влияют на то, нужно ли поддерживать открытое соединение:

  1. Understand the power consumption.
    • Having the adapter active simply consumes additional power. If one can keep the adapter shut-off while it is not "absolutely-needed" will mearly save battery power.
  2. Accidental disconnects are managed.
    • Other than leaving the connection continually connected, one could disconnect & reconnect regularly at specified intervals to ensure a connection is up.
    • В потоках, используемых для ввода-вывода, можно было бы проверить отключение и повторное подключение (возможно, запустив новый поток).

Потоки ввода-вывода для соединения

Одно соединение действительно может «иметь» одновременные потоки ввода и вывода. я

Поскольку это было предложено, я перечитал Android-руководство по Bluetooth и в разделе «управление соединением» (речь об одном сокете) я заметил это...

  1. Получите InputStream и OutputStream, которые обрабатывают передачу через сокет, через getInputStream() и getOutputStream() соответственно.
  2. Чтение и запись данных в потоки с помощью read(byte[]) и write(byte[]).

... но продолжает, отмечая, что чтение и запись блокируют друг друга. Кое-что, что мне еще нужно изучить. Похоже, вы не можете одновременно выполнять ввод-вывод на одном и том же сокете???

Максимальное количество подключений

Я также изучил проблему с максимальным подключением, добавленную Стуци, и не нашел документации на стороне Android. Может и есть, не могу найти. Тем не менее, большинство людей, похоже, согласны с тем, что существует ограничение (которое может составлять всего 4), налагаемое любым оборудованием, для которого вы кодируете. Некоторые важные ссылки: - Сколько устройств мы можем подключиться через Bluetooth BLE к Android? - Сколько максимальное количество устройств мы можем подключить через Bluetooth к устройству Android одновременно? - https://groups.google.com/forum/#!topic/android-developers/adeBD275u30

person Kevin J.    schedule 24.03.2015