Bluetooth RFCOMM / соединение SDP с адаптером RS232 в андроиде

Я пытаюсь использовать образец Чата Bluetooth приложение API, которое 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() метод. Когда я делаю a toString на исключении я получаю "Сервисное отказавшее исследование". Мой вопрос главным образом, что является случаями, которые вызвали бы IOException быть добавленным метод подключения? Я знаю, что это находится в источнике где-нибудь, но я не знаю точно, как слой Java, что Вы пишете приложения в и слой C/C++, который содержит фактический интерфейс стеков. Я знаю, что это использует 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. Мой рабочий код Python (пользующийся библиотекой PyBluez), который я хотел бы портировать на Android, следующие:

sock = bluetooth.BluetoothSocket(proto=bluetooth.RFCOMM)
sock.connect((device_addr, 1))
return sock.makefile()

... таким образом, сервис для соединения только с определяется как канал 1 без любого поиска SDP.

Поскольку единственный зарегистрированный механизм, который я вижу в API Android, делает поиск SDP UUID, я немного в недоумении. Используя "sdptool обзор" от моего хоста Linux подходит пустой, таким образом, я предполагаю, что рассматриваемая микросхема просто испытывает недостаток в поддержке SDP.

20
задан Charles Duffy 14 March 2010 в 20:44
поделиться

4 ответа

ОК, краткий ответ - я должен был использовать этот UUID, чтобы подключиться к моему устройству SPP:

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

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

34
ответ дан 30 November 2019 в 00:05
поделиться

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

2
ответ дан 30 November 2019 в 00:05
поделиться

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

0
ответ дан 30 November 2019 в 00:05
поделиться

Если sdptool browse не сообщает об устройстве, попробуйте «sdptool records [device-mac-here]»

0
ответ дан 30 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: