RFCOMM_CreateConnection - уже открытое состояние: 2, состояние RFC: 4, состояние MCB: 5 - PullRequest
3 голосов
/ 25 октября 2011

Я пишу приложение для Android, которое подключается к устройству через Bluetooth с помощью RFCOMM.Я использую пример BluetoothChat в качестве основы для установления соединения, и в большинстве случаев все работает идеально.

Однако иногда я не могу восстановить соединение из-за сообщения о том, что сокет уже открыт:

RFCOMM_CreateConnection - уже открытое состояние: 2, состояние RFC: 4, состояние MCB: 5

Это обычно происходит, если я подключаюсь к устройству, закрываю приложение (вызываем onDestroy ()), снова открываю его и пытаюсь подключиться снова, что приводит к приведенному выше.

Iиспользуйте этот метод для подключения в ConnectThread (пример ref.BluetoothChat):

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

Единственное, что решает эту проблему, это выключение / включение Bluetooth телефона Android.

Это наводит меня на мысль, что сокет не закрывается в onDestroy (), но я все же призываю закрыть все потоки, как показано в предыдущем примере.
Любые идеи приветствуются.

1 Ответ

4 голосов
/ 03 июля 2012

Я тоже наткнулся на это, и вот ответ, который я нашел:

Эта ошибка может произойти, если вы несколько раз открываете и закрываете соединение через разъем Bluetooth.

Решение

Начиная с уровня API 14, в BluetoothSocket есть метод с именем isConected () , который возвращает истину, если этот сокет уже подключен, и ложь в противном случае, здесь оригинальная выдержка из API:

Получить статус подключения этого сокета, т. Е. Есть ли активное соединение с удаленным устройством.

Для уровней API <14 вы можете обойти эту проблему, переместив поток обработки Bluetooth в спящий режим после закрытия соединения - должно быть достаточно 1000 мс, вот пример (btDevice относится к типу BluetoothDevice и инициализировался до фрагмент кода ниже): </p>

    try {
        //Open the socket to an SPP device (UUID taken from Android API for createRfcommSocketToServiceRecord)
        BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord("00001101-0000-1000-8000-00805F9B34FB");
        //Connect to the socket
        btSocket.connect();
        //Close the socket
        btSocket.close();
        //Sleep time of 1000ms after closing the socket
        SystemClock.sleep(POST_RESET_DELAY);

    } catch (Throwable e) {
        // Log error message
    }

P.s. Вместо SystemClock.sleep вы также можете использовать Thread.sleep - однако сон SystemCock не может быть прерван, тогда как Thread.sleep может быть прерван, поэтому от того, какой вариант использования лучше подходит для вашей цели, зависит ваш вариант использования.

Источник: Луи А. Прадо

...