簡體   English   中英

斷開連接后收到Android BLE外圍設備服務

[英]Android BLE peripheral service received after disconnect

我正在使用一個android應用程序將樹莓派連接到本地wifi網絡,並通過藍牙從我的android手機發送它們的ssid和ssid密碼信息。 rpi正在使用bleno運行節點服務器。

我的應用程序的設置如下。

  1. 我掃描顯示設備清單的ble設備供用戶選擇
  2. 選擇后,用戶單擊“下一步”按鈕,以打開綁定到新BluetoothLeService的新活動。
  3. 此活動具有一個確認按鈕,單擊該按鈕將啟動ble外圍設備到手機的連接過程。
  4. 一旦完成向外圍設備發送ssid和ssid_pwd數據的操作,我就將其拆解並從BluetoothLeService取消綁定,完成該活動,然后啟動成功屏幕活動,該活動將用戶路由回掃描屏幕,以重新開始該過程。

這樣就可以了。 我什至可以選擇多個外圍設備來發送兩個數據,並且可以正常工作。

我的問題出在步驟4之后。如果用戶決定在已經完成一個onServiceConnected之后選擇另一個外圍設備,則該新外圍設備將被調用,但是mBluetoothGatt.discoverServices()似乎選擇了兩個服務。 一次用於先前連接的外圍設備,一次用於新外圍設備。

注意:僅當我解除與服務的綁定,然后稍后再次綁定時,才會發生這種情況。 綁定一次並與兩個外圍設備一起工作似乎可行。

是什么原因造成的? 我已經進行了十多次檢查,證明BluetoothLeService被銷毀,綁定到BluetoothLeService的活動也被銷毀,甚至檢查第一個外圍設備是否不在廣播或接受ble連接。 我什至已經拔掉了第一個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);
            }


        };

謝謝

當一個人注冊一個接收者時,也必須取消注冊。

編輯:對於任何進入android ble的人,Github上的googlesamples / android-BluetoothLeGatt回購是命脈。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM