Подтвердить что ты не робот

Соединение 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/С++, содержащий фактический интерфейс стеков. Я знаю, что он использует синий bluetooth-стек, который написан на 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 [email protected] 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?

В Android API приведены примеры использования 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.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я думаю, это связано с ошибкой телефона 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, в то время как мой компьютер просматривает список, просматривающий каждый элемент. Но это только мое предположение:)

Ответ 3

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

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

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

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

взял меня на 4 дня, чтобы узнать это!

Ответ 4

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

Ответ 5

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