断开

时间:2018-04-29 01:33:33

标签: android service raspberry-pi bluetooth-lowenergy bluetooth-gatt

我正在开发一个Android应用程序,将覆盆子pi连接到本地wifi网络,通过蓝牙从我的Android手机发送ssid和ssid密码信息。 rpi正在使用bleno运行节点服务器。

我的申请设置如下。

  1. 我扫描显示设备清单的ble设备供用户选择
  2. 选择后,用户点击按钮' next'打开绑定到新BluetoothLeService的新活动。
  3. 此活动有一个确认按钮,单击此按钮可启动外接手机与手机的连接过程。
  4. 完成将ssid和ssid_pwd数据发送到外围设备后,我从BluetoothLeService拆除并取消绑定,完成该活动,然后启动成功屏幕活动,将用户路由回扫描屏幕以启动该过程全部再一次。
  5. 所以这部分都很好。我甚至可以选择多个外围设备来发送数据,并且可以正常工作。

    我的问题发生在第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 :(得分:0)

当注册接收者时,还必须取消注册。

编辑:对于任何进入Android版本的人来说,Github上的googlesamples/android-BluetoothLeGatt回购都是生命之源。

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