Подключение Bluetooth RFCOMM / SDP к адаптеру RS232 в android

Я пытаюсь использовать пример приложения API Bluetooth Chat, которое Google предоставляет для подключения к адаптеру Bluetooth RS232, подключенному к другому устройству. Вот приложение для справки:

http://developer.android.com/resources/samples/BluetoothChat/index.html

А вот спецификации разъема RS232 для справки:

http://serialio.com/download/Docs/BlueSnap-guide-4.77_Commands.pdf

Проблема в том, что когда я подключаюсь к устройству с помощью:

mmSocket.connect(); (BluetoothSocket::connect())

Я всегда получаю IOException ошибку, вызванную методом connect(). Когда я делаю toString для исключения, я получаю «Ошибка обнаружения службы». Мой вопрос в основном в том, в каких случаях IOException будет брошен в методе подключения? Я знаю, что они есть где-то в источнике, но я не знаю точно, как слой Java, на котором вы пишете приложения, и слой C / C ++, который содержит фактический интерфейс стеков. Я знаю, что он использует стек bluetooth bluez, который написан на C / C ++, но не уверен, как он связан с уровнем java, который, как мне кажется, вызывает исключение. Любая помощь в указании мне того, где я могу попытаться проанализировать эту проблему, была бы невероятной.

Также просто хочу отметить, что я могу нормально подключиться к адаптеру RS232, но я никогда не могу подключиться. Вот вывод logcat для справки:

I/ActivityManager( 1018): Displayed activity com.example.android.BluetoothChat/.DeviceListActivity: 326 ms (total 326 ms)
E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
D/BluetoothChat( 1729): onActivityResult -1
D/BluetoothChatService( 1729): connect to: 00:06:66:03:0C:51
D/BluetoothChatService( 1729): setState() STATE_LISTEN -> STATE_CONNECTING
E/BluetoothChat( 1729): + ON RESUME +
I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_CONNECTING
I/BluetoothChatService( 1729): BEGIN mConnectThread
E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
E/BluetoothEventLoop.cpp( 1018): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/1498/hci0/dev_00_06_66_03_0C_51
I/BluetoothChatService( 1729): CONNECTION FAIL TOSTRING: java.io.IOException: Service discovery failed
D/BluetoothChatService( 1729): setState() STATE_CONNECTING -> STATE_LISTEN
D/BluetoothChatService( 1729): start
D/BluetoothChatService( 1729): setState() STATE_LISTEN -> STATE_LISTEN
I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
V/BluetoothEventRedirector( 1080): Received android.bleutooth.device.action.UUID
I/NotificationService( 1018): enqueueToast pkg=com.example.android.BluetoothChat callback=android.app.ITransientNotification$Stub$Proxy@446327c8 duration=0
I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
E/BluetoothEventLoop.cpp( 1018): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/1498/hci0/dev_00_06_66_03_0C_51
V/BluetoothEventRedirector( 1080): Received android.bleutooth.device.action.UUID

Устройство, к которому я пытаюсь подключиться, - это 00:06:66:03:0C:51, которое я могу сканировать и, по-видимому, отлично с ним соединиться.


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

Как можно подключиться на устройство RFCOMM, отличное от другого телефона на Android?

API Android предоставляет примеры использования listenUsingRfcommWithServiceRecord () для настройки сокета и createRfcommSocketToServiceRecord () для подключения к этому сокету.

Я пытаюсь подключиться к встроенному устройству с чипом BlueSMiRF Gold . Мой рабочий код Python (с использованием библиотеки PyBluez), который я хотел бы перенести на Android , как следует:

sock = bluetooth.BluetoothSocket(proto=bluetooth.RFCOMM)
sock.connect((device_addr, 1))
return sock.makefile()

... так что служба, к которой нужно подключиться, просто определяется как канал 1, без какого-либо поиска SDP.

Поскольку единственный документированный механизм, который я вижу в Android API, выполняет SDP-поиск UUID, я немного не понимаю. Использование "sdptool browse" с моего хоста Linux оказывается пустым, поэтому я предполагаю, что рассматриваемый чип просто не поддерживает SDP.


person ThePosey    schedule 23.12.2009    source источник


Ответы (5)


Хорошо, короткий ответ: мне пришлось использовать этот UUID для подключения к моему устройству SPP:

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

Я попытался изменить его, так как думал, что важна только часть «1101», так как я вижу, что это упоминается в материалах SPP повсюду на интертюбах, но из-за этого он больше не соединяется. По-видимому, этот конкретный UUID должен использоваться для подключения к универсальным устройствам SPP. В любом случае, я решил, что выложу его здесь, чтобы у любого, у кого возникла такая проблема, был ответ. Мне потребовалось около 3 дней, чтобы найти это LOL!

person ThePosey    schedule 13.01.2010
comment
Для Java2ME у вас нет UUID.fromString, но вы можете использовать: новый UUID (0000110100001000800000805F9B34FB, false) - person The_Ghost; 22.09.2010
comment
Спасибо за ответ. После предоставления этого UUID он по-прежнему показывает то же исключение «Ошибка обнаружения службы». Есть ли какие-то конкретные настройки, которые мне нужно сделать? Я застрял в этой проблеме. Пожалуйста помоги - person Rahul Raj; 03.08.2012

Я предполагаю, что это связано с ошибкой телефонов sony-ericsson (см. Здесь) .

Мне удалось подключиться с / к устройству Android 2.0 и моему Mac с помощью Bluetooth и полностью выдуманного UUID. Попытка сделать то же самое с устройством j2me (sony ericsson w910i) работала, только если сервером был андроид, в противном случае я получаю то же исключение, что и вы.

Насколько мне известно, UUID, который вы используете, является «базовым адресом» для профиля spp, и в поле ServiceClassIDList в ServiceRecord, возвращаемом серверным устройством при выдаче обнаружения службы, он должен быть указан ПОСЛЕ UUID, который вы решил использовать ... очевидно, что в некоторых ситуациях это не так (например, в моем телефоне сначала указан общий UUID, а затем - пользовательский UUID).

Похоже, здесь такая же ситуация. Вы можете попробовать вручную изменить ServiceRecord и вернуть правильный ServiceClassIDList. Может, у тебя это сработает .. К сожалению, мой тупой мобильник отказывается его менять :(

PS. странно то, что мой Mac действительно может видеть службу, даже если ServiceRecord «сломан», я предполагаю, что андроид просто потрудился увидеть первый UUID в ServiceClassIDList, в то время как мой компьютер просматривает список, просматривая каждый элемент. Но это только мое предположение :)

person cheng81    schedule 10.02.2010
comment
в какой-то момент я искал это в ядре, чтобы выяснить, почему он работает только с этим идентификатором, но я сдался. Похоже, это не совсем правильный способ делать что-то, или я совершенно неправильно понимаю UUID. - person ThePosey; 14.03.2010
comment
Я нашел эту веб-страницу весьма полезной при изучении Bluetooth: embedded.com/2000/0007/0007ia1. htm, в частности, найдите протокол обнаружения службы (SDP) (рядом с концом страницы), чтобы получить объяснение того, как UUID используются при обнаружении службы. Надеюсь, это поможет, ура! - person cheng81; 20.03.2010

Установленная скорость передачи данных должна соответствовать устройству, к которому оно подключено. У них по умолчанию 115200 или переключение на 9600, но если вам нужен другой (1200 в моем случае для прибора для обследования), вам нужно настроить его через гипертерминал * и нуль-модемный кабель.

* Хотя в документации к устройству bluesnap предлагается использовать гипертерминал, с ним есть проблемы. После нескольких звонков в bluesnap они предложили:

Во-первых, при подключении устройства к ПК попробуйте вернуть настройки перемычки в исходное положение, используя 115200 8, N, 1 и X off. Когда DTE включен, терминальное соединение не может быть установлено без использования специального программного обеспечения, специально разработанного для соединений DTR / DTE.

Во-вторых, у HyperTerminal есть известные проблемы с BlueSnap. Я бы порекомендовал попробовать TeraTerm или PuTTY.

мне потребовалось 4 дня, чтобы это выяснить!

person John    schedule 12.12.2012

На какой скорости установлено ваше устройство Bluetooth? Я подключен, но мои данные отображаются как типичная искаженная каша, которую вы получаете при смешанных скоростях передачи. У меня установлен 57600, это то, что я видел, как другие используют. О, спасибо за публикацию ваших результатов, UUID заставил меня поработать несколько дней.

person Community    schedule 14.03.2010
comment
не стесняйтесь голосовать за меня LOL. Скорость передачи на приемопередатчике bluetooth / rs232 по умолчанию - 115200. Если вы посмотрите на ту часть, где есть переключатель, который устанавливает его либо на это, либо на 9600. Где вы видите проблему на телефоне или на своем компьютере? Если у вас возникнут проблемы, напишите мне по электронной почте. - person ThePosey; 14.03.2010

Если 'sdptool browse' сообщает об отсутствии информации об устройстве, попробуйте 'sdptool records [device-mac-here]'

person Gilead    schedule 18.04.2010