Android Bluetooth принять () / подключиться () с уже сопряженными устройствами

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

Вот последовательность вещей на стороне сервера:

  1. Проверьте различные состояния Bluetooth (адаптер доступен, включен и т. Д.).
  2. вызовите listenUsingRfcommWithServiceRecord() с предопределенным UUID, который я выбрал.
  3. запрос на обнаружение устройства
  4. поскольку обнаружение происходит асинхронно, я вызываю accept() и жду входящего соединения.

На стороне клиента:

  1. Проверьте различные состояния Bluetooth (адаптер доступен, включен и т. Д.).
  2. для каждого устройства в getBondedDevices() я сравниваю getName() с именем сервера. Если есть совпадение, перейдите к шагу 6.
  3. Начать открытие BT
  4. Для каждого обнаруженного устройства (обратите внимание, что сопряженные устройства из 2a здесь не отображаются), сравните имя устройства с именем сервера. Если есть совпадение, перейдите к шагу 6.
  5. Отменить открытие
  6. На устройстве, которое было найдено на шаге 2, вызовите createRfcommSocketToServiceRecord() с тем же предопределенным UUID, который использовался на стороне сервера.
  7. Вызовите connect() и подождите, пока он вернет подключенный сокет.

Вышеописанный процесс прекрасно работает для меня, когда клиент и сервер никогда ранее не были сопряжены. Однако после того, как Android зарегистрирует их в списке устройств, они неизбежно прекратят свое действие на этапе connect()/accept().

Я искал решение уже пару дней и попробовал немало вещей, в том числе и эту: Подключение к уже подключенному устройству Bluetooth

Метод отражения у меня тоже не работает. Кажется, что connect() вернется сразу, но когда я попытался getOutputStream(), я получил исключение. На стороне accept() он даже не регистрирует, что кто-то пытался подключиться. Я серьезно нуждаюсь в некоторой помощи или указателе на получение устройств, чтобы установить соединение, как только они были связаны ранее.

Вот некоторая информация об устройствах:

  • Я тестирую сервер и клиент на двух телефонах LG G2X.
  • Оба они работают на Android 2.3.3, что соответствует уровню API 10.
  • Опять же, вышеперечисленное работает после того, как я отключил устройства вручную в настройках

Спасибо заранее Мне около 2 недель в Android и Bluetooth, поэтому, если вы видите какие-либо пропущенные шаги или лучшие практики, пожалуйста, укажите их.

3 ответа

Решение

В клиенте, когда я пытаюсь установить соединение со связанным устройством, я просто вызывал его на устройстве Bluetooth, которое я нашел в BluetoothAdapter.getBondedDevices(), Это не работает.

Чтобы правильно установить соединение Bluetooth, мне нужно было сделать что-то похожее на псевдокод ниже:

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices();
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress());

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID);
socket.connect();

Я получил этот ответ, точно следуя примеру чата Bluetooth: Служба чата Bluetooth. Почему это не работает на устройстве от getBondedDevices() вне меня. Может быть, кто-то с более глубоким знанием Android может ответить на это.

Посмотрите этот пример: http://developer.android.com/resources/samples/BluetoothChat/index.html.

это может объяснить, как подключено устройство Bluetooth и передает информацию.

private static BluetoothSocket mSocket;
BluetoothDevice selectDevice = null;

void connectDevice(){
    if(mSocket == null) {
        //Log.d(TAG, "Socket is null");
        UUID SPP_UUID = UUID
                .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");
        Set<BluetoothDevice> bondedDevices = BluetoothAdapter
                .getDefaultAdapter().getBondedDevices();
        //Log.d(TAG, "Size: " + bondedDevices.size());
        /**
         * Select your divice form paired devices
         */
        for (BluetoothDevice bluetoothDevice : bondedDevices) {
            selectDevice = bluetoothDevice;
            //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress());
        }

        if(selectDevice.getBondState() == selectDevice.BOND_BONDED) {
            //Log.d(TAG, selectDevice.getName());
            try {
                mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                //Log.d(TAG, "socket not created");
                e1.printStackTrace();
            }
            try {
                mSocket.connect();
            } catch (IOException e) {
                try {
                    mSocket.close();
                    //Log.d(TAG, "Cannot connect");
                } catch (IOException e1) {
                    //Log.d(TAG, "Socket not closed");
                    e1.printStackTrace();
                }
            }
   }
Другие вопросы по тегам