采集的小蜜蜂 发表于 2021-4-10 10:06

【安卓】蓝牙,写数据没问题,接收通知第二次连接就会自动断开

本帖最后由 采集的小蜜蜂 于 2021-4-10 10:07 编辑

目前在搞蓝牙测心率项目,需要订阅通知(安卓开发者官方文档叫“接收GATT通知”,注意:不是读特征)。
每次写特征断开之后可以正常连接,但是只要订阅通知,第二次连接连接上之后肯定会自动断开,在onConnectionStateChange(用于判断蓝牙是否连接成功)中会返回一个status为 数值8(TIME OUT)的值。第三次连接就会正常连接,想让专业人士看看是不是有代码的逻辑写错了,订阅通知之后如果断开连接是不是还需要关闭接收通知,但是从网上找了半天也没找到,
以下是代码:
先进入连接是否成功的回调方法,133是错误代码之后重连,这个不用管,之后STATE_CONNECTED表示连接成功,括号里是连接成功之后发现服务,成功发现服务进入onServiceDiscover(发现服务后才可以写特征,读特征和订阅通知)。

private BluetoothGattCallback mGattCallback=new BluetoothGattCallback() {
      @Override
      public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if(status==133){
                DisconnectDevice();//这个方法用来断开设备,disconnect和close都一并执行了。
                jumpdata=0;
                mBluetoothGatt = device.connectGatt(mContext, false, mGattCallback);
            }else{
                if (BluetoothGatt.STATE_CONNECTED == newState&&jumpdata==1) {
                  mBluetoothGatt.discoverServices();//必须有,可以让onServicesDiscovered显示所有Services
                        }
                } else if (BluetoothGatt.STATE_DISCONNECTED == newState) {
                  mBluetoothGatt=null;
                  jumpdata=0;
                }
            }
      }
执行gatt.discoverService方法之后跳转到下边的回调,同时给BluetoothService service 赋值。 @Override
      public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            super.onServicesDiscovered(gatt, status);

            service=mBluetoothGatt.getService(CommandUtils.serviceUUID);}

service(服务)获取到后就可以读写特征和订阅通知了。

写特征:
BluetoothGattCharacteristic characteristic = service.getCharacteristic(CommandUtils.characterWriteUUID);
            mBluetoothGatt.setCharacteristicNotification(characteristic, true);
            characteristic.setValue(data);
            mBluetoothGatt.writeCharacteristic(characteristic);}

写成功后,会有一个回调,在第一段代码中的gattcallback中会执行 @Override      public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicWrite(gatt, characteristic, status);
      }

订阅通知:
BluetoothGattCharacteristic characteristic = service.getCharacteristic(GetDataUtils.characterReadUUID);//这里的readuuid值是为了方便理解把订阅通知的uuid起名字起了个read,实际上是订阅通知的uuid
            mBluetoothGatt.setCharacteristicNotification(characteristic, true);
            BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));//这个UUID是官方库的里UUID,订阅通知都需要这个uuid,我缺少一个库文件,所以直接用uuid代替了。
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mBluetoothGatt.writeDescriptor(descriptor);

订阅成功每当特征值发生改变,就会进入onCharacteristicChanged这个方法中,

@Override
      public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicChanged(gatt, characteristic);
                  sleepdata = characteristic.getValue();
      }

oljbd7alyel 发表于 2021-4-10 10:34

大神学习了 感谢分享

迎风练习微笑 发表于 2021-4-10 10:48

感谢大神分享
页: [1]
查看完整版本: 【安卓】蓝牙,写数据没问题,接收通知第二次连接就会自动断开