Android Bluetooth - Не может соединиться

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

Я никогда не мог установить SPP (последовательный порт) соединение с моего телефона на любое устройство. Однако я смог соединиться от устройства (мой ноутбук) к моему телефону с помощью Mac, эквивалентного из PuTTY (Единственным исключением к этому является "приложение" Передачи файлов Bluetooth с Рынка, кажется, работает, но я не думаю что использование 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. См. мое сообщение ответа для получения дополнительной информации.

6
задан idolize 23 June 2010 в 18:55
поделиться

2 ответа

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

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

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

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

7
ответ дан 16 December 2019 в 21:34
поделиться

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

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

Итак, вы смогли заставить пример Bluetooth Chat работать до внесения каких-либо изменений в код?

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");
1
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

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