Я пытаюсь использовать приложение 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.