Периферийный сервис Android BLE получен после отключения - PullRequest
0 голосов
/ 29 апреля 2018

Я работаю над приложением для Android, чтобы подключить Raspberry Pi к локальной сети Wi-Fi, посылая им информацию о пароле ssid и ssid через Bluetooth с моего телефона Android. Rpi работают на серверах узлов, используя bleno.

Моя заявка настроена следующим образом.

  1. Я сканирую все устройства, отображающие контрольный список устройств для выбора пользователем
  2. После выбора пользователь нажимает кнопку «Далее», открывая новую привязку активности к новой BluetoothLeService.
  3. У этого действия есть кнопка подтверждения, при нажатии которой запускается процесс подключения периферийного устройства к телефону.
  4. После завершения отправки данных ssid и ssid_pwd на периферийное устройство, которое я разрываю и отсоединяю от BluetoothLeService, завершите это действие, а затем запустите действие экрана успеха, которое перенаправит пользователя обратно на экран сканирования, чтобы снова начать этот процесс .

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

Моя проблема возникает после шага 4. Если пользователь решает выбрать другое периферийное устройство после того, как он уже это сделал, вызывается onServiceConnected, вызываемый для нового периферийного устройства, но mBluetoothGatt.discoverServices(), кажется, выбирает две службы. Один раз для ранее подключенного периферийного устройства и один раз для нового.

Примечание: это происходит только тогда, когда я отменяю связь со службой, а затем связываюсь позже. Кажется, работает связывание один раз и работа с двумя периферийными устройствами.

Что может быть причиной этого? Более десятка раз я проверял, что BluetoothLeService уничтожается, уничтожается действие, связывающееся с BluetoothLeService, даже проверяя, что первое периферийное устройство не передает или не принимает соединения. Я даже физически отключил первый RPI. btsnoop_hci.log показывает подключение к одному периферийному устройству, а затем к другому, поэтому оно должно быть в коде приложения. У кого-нибудь есть идеи?

Это часть кода, которая запускает беспорядок.

    private final BluetoothGattCallback mGattCallback =
        new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status,
                                                int newState) {
                String intentAction;
                if (newState == BluetoothProfile.STATE_CONNECTED) {
                    intentAction = ACTION_GATT_CONNECTED;
                    mConnectionState = STATE_CONNECTED;
                    broadcastUpdate(intentAction,gatt);
                    Log.i(TAG, "Connected to GATT server.");
                    Log.i(TAG, "Attempting to start service discovery:" +
                            mBluetoothGatt.discoverServices()); // <-- The problem starts here

                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                    intentAction = ACTION_GATT_DISCONNECTED;
                    mConnectionState = STATE_DISCONNECTED;
                    Log.i(TAG, "Disconnected from GATT server.");
                    broadcastUpdate(intentAction,gatt);
                }
            }

            @Override
            // New services discovered
            public void onServicesDiscovered(BluetoothGatt gatt, int status) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
                    Log.w(TAG, "onServicesDiscovered received: " + status);

                } else {
                    Log.e("ERROR", "Gatt onServiceDiscovered failed. Error code + " + status);
                }
            }
            @Override
            public void onCharacteristicWrite(BluetoothGatt gatt,
                                              BluetoothGattCharacteristic characteristic,
                                              int status) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
                }
                Log.d("DEBUG", characteristic.getValue().toString());
            }
            @Override
            // Result of a characteristic read operation
            public void onCharacteristicRead(BluetoothGatt gatt,
                                             BluetoothGattCharacteristic characteristic,
                                             int status) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
                }
                Log.d("DEBUG", characteristic.getValue().toString());
            }
            @Override
            public void onCharacteristicChanged(BluetoothGatt gatt,
                                                BluetoothGattCharacteristic characteristic) {
                Log.d("DEBUG", characteristic.getValue().toString());
                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
            }


        };

Спасибо

1 Ответ

0 голосов
/ 30 апреля 2018

Когда вы регистрируете получателя, вы также должны отменить регистрацию.

Редактировать: Для всех, кто попадает в Android, репозиторий googlesamples / android-BluetoothLeGatt на Github - жизненная сила.

https://github.com/googlesamples/android-BluetoothLeGatt/tree/master/Application/src/main/java/com/example/android/bluetoothlegatt

...