Я пытаюсь надежно связать планшет Android с платой beagle для связи по Bluetooth. Цель состоит в том, чтобы связать оба устройства без какого-либо взаимодействия с пользователем в графическом интерфейсе планшета. Я обнаружил, что связывание вне группы (OOB) - это то, что я хочу для пользователя, и создал код, который в основном работает, но у меня есть некоторые проблемы на стороне Android, которых я не ожидал.
В Android я использую предоставленные методы через отражение в классах BluetoothDevices
и BluetoothAdaper
. Это хорошо, потому что приложение является пользовательским и НЕ предназначено для рынка Android или чего-либо публичного. Эти методы не доступны через публичный API, и поэтому я нахожу очень мало документации о них.
Надеюсь, у Ice Cream будет настоящий OOB API, когда он выйдет, но сейчас я должен заставить это работать с Honeycomb. Я опишу, что у меня есть, а затем задам вопросы, основанные на настройке.
Итак, на плате beagle установлена последняя версия стека bluez, версия 4.96. Я запустил пример кода test-oob , который поставляется вместе с исходным кодом, и он работал отлично. Для завершения склеивания взаимодействие с пользователем не требуется, за исключением выполнения скрипта. Я сделал это, используя 2 USB-ключа Bluetooth на плате beagle и запустив скрипт на python.
Теперь я полагаю, что у меня есть рабочий пример, который я смог бы связать с планшетом Android аналогичным образом. Я решил использовать USB в качестве носителя для безопасной передачи данных OOB, так как потребуется физическое соединение, и не будет проблем с тем, с какими устройствами я хотел бы выполнить сопряжение. У меня нет проблем с обменом данными, поэтому я не буду больше об этом говорить. Я скажу, что плата beagle монтирует планшет и данные OOB записываются / считываются в / из файлов с уникальными именами.
В тестовом примере кода OOB следующие строки в основном показывают, как выполняется OOB.
oob0 = oob_adapter0.ReadLocalData()
oob1 = oob_adapter1.ReadLocalData()
oob_adapter0.AddRemoteData(adapter1_address, oob1[0], oob1[1])
oob_adapter1.AddRemoteData(adapter0_address, oob0[0], oob0[1])
adapter0.CreatePairedDevice(adapter1_address, "/test/agent_oob", "DisplayYesNo",
reply_handler=create_device_reply, error_handler=create_device_error)
Я понимаю этот код, так как каждый адаптер Bluetooth имеет знание OOB адаптера, с которым он хочет выполнить сопряжение. Связь создана, и мы закончили.
Таким образом, чтобы сделать это с Android, в основном oob_adapter0
добавит данные Android, полученные через USB, и в коде Android адаптер устройства установит данные OOB платы beagle.
Методы, которые я использую в Android:
readOutOfBandData()
Описанный выше метод получает данные OOB адаптера Bluetooth планшета. Эта информация отправляется на плату beagle и устанавливается вместе с oob_adapter0.AddRemoteData
вместе с MAC-адресом адаптера Bluetooth для Android.
getRemoteDevice(Beagle Board MAC Address)
Приведенный выше метод в основном возвращает мне BluetoothDevices
, который указывает на доску гончей.
setDeviceOutOfBandData(Beagle Board OOB Data)
Вышеуказанный метод устанавливает данные Out of Band для удаленного устройства, которое будет использоваться во время соединения / спаривания. Возвращенное устройство Bluetooth из вызова getRemoteDevice () используется в качестве объекта.
Я выполняю эти методы и затем сигнализирую гоночной доске о начале спаривания. Затем плата beagle будет сопряжена с устройством Android, НО на Android появляется всплывающее окно с надписью «Устройства XYZ хотят выполнить сопряжение», и пользователь выбирает «Сопряжение» или «Не связывать». Я не ожидал, что это всплывающее окно и это то, что Andoird делает самостоятельно. Я не получаю ничего на доске гончей, как ожидалось. Я чувствую, что я продублировал скрипт test-oob, который не вызывал всплывающих окон с просьбой подтвердить парнинг. Поэтому я не уверен, в чем проблема.
Тогда я хорошо подумал, что если планшет был устройством, инициировавшим пару, но такая же проблема возникает при всплывающем окне на планшете с такими же вопросами.
Поэтому я больше играл с кодом Android и после проб и ошибок пришел к выводу, что Android вообще не нужно было устанавливать какие-либо OOB-данные. До тех пор, пока на плате beagle будет информация о внеплановых планшетах, соединение будет завершено без вмешательства пользователя.
Woot, я получил желаемый результат, но не так, как я понимал OOB. Кроме того, вызов createPariedDevice()
на плате beagle все еще не вернул пару, хотя я теперь в паре. Метод ожидает вызова, которого я не делаю? Кроме того, почему Android не нужно знать информацию об OOB платы beagle перед сопряжением?
Кроме того, когда вы переходите к настройкам Bluetooth, плата beagle не отображается как спаренное устройство, НО она спаренная. Если я выполню комбинацию выключения, а затем включения Bluetooth и сканирования устройств Bluetooth, сопряженная плата beagle в конечном итоге будет отображаться как сопряженное устройство. Я также вижу на Bluetooth-мониторе платы beagle, что он сопряжен и взаимодействует с планшетом.
Я попробовал это противоположным образом, Android знает об информации о OOB платы beagle и инициировал процесс соединения через createBondOutOfBand()
, но доска beagle не знала информацию OOB планшета Android. Этот случай приводит к появлению всплывающего запроса о том, что я хотел соединиться с доской гончей. Таким образом, это то же самое, что и случай, когда информация об OOB известна с обеих сторон, и гоночная доска инициировала спаривание.
Так что я чувствую, что что-то в моих настройках не на 100% правильно, и я не понимаю, почему. Там также не так много информации о том, как правильно сделать это.
Я тоже поиграл методами
setTrust(boolean) and setPairingConfirmation(boolean)
Но они, похоже, ни на что не влияли, так как я получал всплывающее окно или нет, исходя из описанных выше ситуаций. Таким образом, всплывающее окно, похоже, не связано с вышеуказанными методами.
Я заметил, что есть метод с именем:
setRemoteOutOfBandData()
Но я не видел в этом смысла и действительно не мог понять, для чего он был нужен. Чем этот метод отличается от setDeviceOutOfBandData
(Beagle Board OOB Data) за пределами setRemoteOutOfBandData()
, не требующего каких-либо дополнений?
Итак, мои вопросы:
Почему всплывающее окно на планшете Android спрашивает, хочу ли я выполнить сопряжение, когда я продублировал пример сценария test-oob. Я чувствую, что оба устройства знают друг о друге информацию о OOB, и поэтому Aandroid не должен задавать вопрос о том, хочу ли я соединиться с доской beagle.
Почему, когда я удалил информацию о плате beagle из кода планшета Android, соединение выполняется без какого-либо взаимодействия с пользователем? Для меня эта ситуация должна спрашивать, хочу ли я создать пару, потому что код Android не имеет информации о плате beagle и не должен ее принимать. Конечно, доска beagle имеет правильную информацию о OOB с планшета, но она не выглядит корректной. Может быть, я просто недостаточно знаю об OOB, и это правильно.
- Если возникает ситуация, когда вопрос 2 является ожидаемой и нормальной процедурой работы, то почему устройства Android не знают, что она подключена к плате beagle, без необходимости играть в сканирование устройств и выключать, а затем включать Bluetooth? Есть ли другой метод, который мне нужно вызвать, чтобы увидеть его, о котором я не знаю? Что-то здесь кажется неправильным.