Соединение 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
, который я могу сканировать и, по-видимому, с ним просто отлично.
Ниже приведено совпадение с аналогичным вопросом, который был успешно разрешен выбранным ответом здесь:
В 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.
Ответы
Ответ 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]'