Android Bluetooth принять () / подключиться () с уже сопряженными устройствами - PullRequest
6 голосов
/ 14 февраля 2012

У меня проблемы с подключением двух устройств 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 ]

7 голосов
/ 15 февраля 2012

В клиенте, когда я пытаюсь установить соединение со связанным устройством, я просто вызывал его на устройстве 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 может ответить на этот вопрос.

2 голосов
/ 08 марта 2012

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

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

0 голосов
/ 16 сентября 2017
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();
                }
            }
   }
...