【安卓】蓝牙,写数据没问题,接收通知第二次连接就会自动断开
本帖最后由 采集的小蜜蜂 于 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();
}
大神学习了 感谢分享 感谢大神分享
页:
[1]