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