Android Bluetooth - не удается подключиться - PullRequest
6 голосов
/ 19 июня 2010

Я занимаюсь разработкой приложения, которое использует Bluetooth для подключения к устройству и отправки / получения данных. Я провожу все свои тесты с телефоном Nexus One.

Мне никогда не удавалось установить соединение SPP (последовательный порт) от моего телефона к любому устройству. Тем не менее, я смог подключиться к устройству (моему ноутбуку) к моему телефону, используя эквивалент PuTTY для Mac (единственное исключение - приложение Bluetooth File Transfer из Marketplace, похоже, работает , но я не думаю, что использует RFCOM / SPP ...).

Я продолжаю видеть это сообщение в моих журналах LogCat:

ERROR/BluetoothService.cpp(78): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)

а также эти:

java.io.IOException: Operation Canceled
java.io.IOException: Software caused connection abort

Я пытался использовать UUID "00001101-0000-1000-8000-00805F9B34FB", а также пытался использовать:

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
sock = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));

метод вместо device.createRfcommSocketToServiceRecord(UUID); тоже - без удачи.

Я использую пример BluetoothChat и варианты этого кода для всех моих испытаний ...

Решения или предложения были бы хорошими ... или даже лучшим / менее сложным примером некоторого тестового кода, который я могу запустить на телефоне, или сценария Python или чего-то, что я могу запустить на своем компьютере, чтобы помочь отладке?

Спасибо! Я надеюсь, что это не ошибка в ОС Android, но если это так, я надеюсь найти обходной путь.


РЕДАКТИРОВАТЬ: Я также должен отметить, что большинство устройств отображаются как «сопряженные, но не подключены» в настройках Bluetooth.


РЕДАКТИРОВАТЬ 2: Решение, похоже, заключается в простом отключении любого прослушивания Bluetooth. См. Мой пост для получения дополнительной информации.

Ответы [ 2 ]

7 голосов
/ 23 июня 2010

Решение, как оказалось, состояло в том, чтобы отключить функциональность сервера службы Bluetooth.Используя только createRfcommSocketToServiceRecord и никогда не вызывая listenUsingRfcommWithServiceRecord (в примере BluetoothChat это означает, что никогда не запускается «AcceptThread»), проблема была исправлена.

Даже если эти два вызова должны быть полностью разделены и иметьне влияет друг на друга (в соответствии с документацией по Android), просто комментирование listenUsingRfcommWithServiceRecord устранило мою якобы не связанную проблему.

Я могу взять программу чата Bluetooth без редактирования, и она не сможет установить исходящее соединениена ЛЮБОЕ устройство Bluetooth, которое я тестировал (ноутбуки, рабочие столы, гарнитуры и т. д.), но если я уберу эту вещь, она будет работать безупречно в качестве клиента.

В любом случае, я надеюсь, что это поможет кому-то другому, если они придутчерез ту же проблему.Это может быть ошибка в ОС Android или, возможно, прошивка на Nexus One.

1 голос
/ 19 июня 2010

Я бы проигнорировал ошибку stopDiscovery - хорошо, что вы отменяете обнаружение перед установлением соединения.В соответствии с документацией SDK:

Поскольку обнаружение является тяжеловесной процедурой для адаптера Bluetooth, этот метод всегда следует вызывать перед попыткой подключения к удаленному устройству с помощью connect ().Обнаружение не управляется операцией, а запускается как системная служба, поэтому приложение всегда должно вызывать отмену обнаружения, даже если оно не запрашивало обнаружение напрямую, просто чтобы быть уверенным.

То же самое сТем не менее, вы смогли заставить работать пример чата Bluetooth, прежде чем вносить какие-либо изменения в код?

UUID, который вы хотите использовать для SPP / RFCOMM:

static UUID UUID_RFCOMM_GENERIC = new UUID(0x0000110100001000L,0x800000805F9B34FBL);

или определенпо-другому (оба выполняют одно и то же).

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