Bluetooth RFCOMM / SDP подключение к адаптеру RS232 в Android - PullRequest
20 голосов
/ 23 декабря 2009

Я пытаюсь использовать пример приложения API чата Bluetooth, которое предоставляет 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 ++-уровне, который содержит реальный интерфейс стеков. Я знаю, что он использует стек bluez bluetooth, который написан на 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, выполняет поиск UDP UDP, я немного растерялся. Использование «sdptool browse» с моего Linux-хоста оказывается пустым, поэтому я предполагаю, что у данного чипа просто отсутствует поддержка SDP.

Ответы [ 5 ]

34 голосов
/ 13 января 2010

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

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

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

2 голосов
/ 10 февраля 2010

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

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

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

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

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

1 голос
/ 12 декабря 2012

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

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

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

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

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

0 голосов
/ 18 апреля 2010

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

0 голосов
/ 14 марта 2010

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

...