Bluetooth вне соединения (OOB) на Android? - PullRequest
9 голосов
/ 03 августа 2011

Я искал в Интернете и не видел ничего, как точно реализовать спаривание OOB.Я надеялся, что кто-то здесь может указать мне пример кода, чтобы помочь мне.Пример чата на сайте разработчиков Android на самом деле совсем не касался такого типа сопряжения.

По сути, у меня есть планшет Android, который я хочу безопасно связать с устройством, написанным на C ++, которое имеетнет встроенного дисплея / механизма ввода-вывода.Сопряженный планшет будет работать как интерфейс GUI / IO, и я отправлю сообщение обратно и четвертое по Bluetooth.Таким образом, я хочу надежно соединить планшет с каждым устройством по схеме OOB.

Я понимаю концепцию OOB, но мне трудно найти подходящие методы для вызова, когда я ищу на сайте android.developers.com мой код клиента Android.Также, глядя на вещи bluez, я не могу найти что-то, что можно использовать для моего написанного на C ++ сервера.

Основной вариант использования - пользователь подключит планшет к устройству через USB-соединение.Соединение USB облегчит передачу ключей / mac-адресов для каждого устройства, а затем будет использовать эту информационную пару Bluetooth друг с другом.

Я могу определить часть USB, но как только у меня есть ключи и необходимая информация наклиент и сервер Я не могу отследить правильные методы для успешного и безопасного соединения обоих концов.

У меня уже есть клиент / сервер, говорящий через небезопасное соединение, так что на самом деле единственная часть, которую я 'У меня возникли проблемы с фактическим спариванием на обоих концах.Как только я в паре, я могу использовать secureRFComm для всех моих будущих сообщений.

Ответы [ 2 ]

10 голосов
/ 18 августа 2011

У меня проблема решена на 95%, но я проехал небольшой блокпост. Сначала я обновлю этот пост более конкретным ответом на исходный вопрос и опубликую свой вопрос в конце.

Напомним, моя задача - использовать внеполосное (oob) соединение для безопасного соединения планшета Android с помощью Honeycomb 3.2 с платой beagle через USB. Я не могу опубликовать конкретный код, но я дам вам все шаги, необходимые для этого.

На плате beagle у меня установлен стек bluez 4.96 с установленным плагином dbusoob. Чтобы убедиться в правильности настройки, установите 2 Bluetooth-ключа на плату beagle и запустите тестовый код OOB, указанный в архиве bluez в папке тестирования. Это скрипт на питоне. Скрипт должен успешно соединить 2 ключа Bluetooth, если не bluez, вероятно, неправильно настроен.

Чтобы USB-соединение работало с планшетом, вам необходимо установить mtpfs и mtp-tools. Они используются для крепления вашего планшета. Как я и решил, получая информацию OOB между двумя устройствами, это установил планшет на плату beagle. После установки планшета и платы beagle можно записать файл с необходимой информацией.

Со стороны Android OOB не поддерживается в общедоступном API, поэтому все становится сложнее. Я полагаю, что это потому, что у Honeycomb 3.2 нет стека bluez, который официально поддерживает связывание OOB, но у Google есть какая-то реализация, закодированная. Я верю в это, потому что если вы посмотрите на исходный код пряника для классов Bluetooth Adapter и Bluetooth Device, вы можете см. методы OOB, доступные, но не доступные через документированный API.

Эти методы все еще общедоступны, поэтому вы можете вызывать их через отражение. Используя отражение, вы также можете получить все сигнатуры методов в классе. Вот как я выяснил, какие методы у меня были доступны.

Остерегайтесь, хотя многие из них не документированы, и не совсем очевидно, что делают некоторые. Важными из них являются readOutOfBandData () в классе адаптера и setDeviceOutOfandData () в классе устройства.

Еще одна проблема, с которой вы можете столкнуться, - это когда вы записываете данные oob в файл на планшете, который будет прочитан доской beagle. Поскольку android использует mtp, вы должны проиндексировать ваш файл после его записи во внутреннее хранилище SDCard. Для решения этой проблемы вам необходимо использовать класс MediaScannerConnection и метод scanFile ().

Надеюсь, что вышеизложенное поможет кому-то еще с этой же проблемой.

Теперь к моему вопросу. У меня отлично работает мое приложение для Android, и мой код платы beagle - пример testOOB, обновленный, чтобы один конец читал информацию OOB из файла. Теперь проблема, которую я вижу, заключается в том, что при выполнении все видят друг друга замечательно, но на планшете все равно появляется сообщение с вопросом, хочу ли я подключиться к устройству xyz. Там нет ключей или номеров. Он просто спрашивает «Сопряжение с устройством XYZ» или что-то в этом роде.

Если я нажму «pair», то все это будет спарено с точки зрения планшетов, НО скрипт python вернет, что не удалось установить соединение. Скрипт python на плате beagle вызывает реальный метод для связи между устройствами. Даже когда у меня андроид инициирует вызов createBond, я вижу тот же результат. Я могу гарантировать, что я установил необходимые данные OOB на обоих концах, прежде чем пытаться выполнить сопряжение в обоих случаях, так что это не так.

Итак, я надеюсь, что кто-то может мне помочь с этим:

1) Почему я даже получаю сообщение на Android, если данные OOB обмениваются должным образом? Я пропускаю еще один звонок и на каком конце?

2) Почему не удалось выполнить синтаксический анализ возврата Python-скрипта beagle, даже если я нажимаю всплывающее окно «pair», отображаемое на планшете. Планшет и монитор синего цвета показывают устройства как спаренные. Некоторые снова склоняются к мысли, что мне чего-то не хватает.

Спасибо всем, кто может помочь:)

EDIT:

Чтобы добавить больше информации, вот вывод logcat:

D/UIBluetooth( 4363): !!!!!! Start Bond !!!!!!
D/BluetoothService( 1703): Setting out of band data for: 00:02:76:24:C2:8F:[-37, -1, 65, -42, -121, -75, -60, -4, -47, -86, -88, 14, 64, 83, 16, 96]:[-112, 34, 121, -97, 15, -54, -83, -
93, 104, -83, -124, -25, 89, 114, 66, 62]
D/BluetoothBondState( 1703): 00:02:76:24:C2:8F bond state 10 -> 11 (0)
D/UIBluetooth( 4363): createOobBond Successful
V/BluetoothEventManager( 2174): Received android.bluetooth.device.action.BOND_STATE_CHANGED
D/BluetoothEventLoop( 1703): Property Changed: Devices : 1
D/BluetoothEventLoop( 1703): Device property changed: 00:02:76:24:C2:8F property: Connected value: true
I/BluetoothEventLoop.cpp( 1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData
I/BluetoothEventLoop.cpp( 1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData

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

Спасибо за любые предложения!

2 голосов
/ 03 августа 2011

На androind еще нет общедоступных API-интерфейсов, позволяющих спаривать OOB.Это возможно только в том случае, если вы можете или хотите изменить базовый стек BlueZ, чтобы предоставить приложению обработчики соединения OOB.(Нетривиальная задача)

Какой механизм OOB вы планируете использовать?NFC?

...