Я пытаюсь использовать образец Чата 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
с которым я могу просканировать для и по-видимому пара очень хорошо.
Ниже объединяется от подобного вопроса, который был успешно разрешен выбранным ответом здесь:
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.
ОК, краткий ответ - я должен был использовать этот UUID, чтобы подключиться к моему устройству SPP:
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Я пытался изменить его, так как я думал, что только часть «1101» была важной, так как я вижу, что упомянул с SPP Вещи повсюду на меж метабах, но это сделало его не снова подключаться. По-видимому, что специфические UUID - это то, что должно использоваться для подключения к универсальным устройствам SPP. В любом случае просто подумал, что я опубликую это здесь, чтобы кто-то, кто такой проблемы имеет ответ. Потребовалось около 3 дней, чтобы найти его, лол!
Думаю, это связано с ошибкой телефонов 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, в то время как мой компьютер просматривает список в поисках каждого элемента. Но это только мое предположение :)
Какая скорость передачи установлена на вашем устройстве Bluetooth? Я подключен, но мои данные отображаются как типичная искаженная каша, которую вы получаете при смешанных скоростях передачи. У меня установлен 57600, это то, что я видел, как другие используют. О, спасибо за публикацию ваших результатов, UUID заставил меня поработать несколько дней.
Если sdptool browse не сообщает об устройстве, попробуйте «sdptool records [device-mac-here]»