BLE 监听以及MTU浅析
Posted zolty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BLE 监听以及MTU浅析相关的知识,希望对你有一定的参考价值。
监听
部分BLE程序会采用 descriptors 进行对固定UUID进行监听,例如:
“00002902-0000-1000-8000-00805f9b34fb”,这里采用了查找所有可用的descriptor UUID,对其监听
mInitialized = gatt.setCharacteristicNotification(characteristic, true);
//下面部分,不是必须的
Log.i(TAG,"setCharacteristicNotification : " + mInitialized);
if(mInitialized){
for(BluetoothGattDescriptor descList : characteristic.getDescriptors()){
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descList.getUuid());
Log.i(TAG, "Descriptor Service UUID found : " + descList.getUuid().toString());
if(descriptor != null){
Log.i(TAG, "Enable Descriptor Service UUID found : " + descList.getUuid());
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
}
}
MTU
当你发送byte[] 时,有时候会发现超过20字节后的数据消失了。默认MTU位20字节。所以BLE APP需要手动调节最大包长度
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
super.onMtuChanged(gatt, mtu, status);
Log.d(TAG," onMtuChanged");
if (BluetoothGatt.GATT_SUCCESS == status) {
Log.d(TAG, "onMtuChanged success MTU = " + mtu);
}else {
Log.d(TAG, "onMtuChanged fail ");
}
}
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
gatt.requestMtu(131);
}
//need 2s to config
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
.......
}
这里将MTU设置为131,注意这里需要2秒让设备加载这个配置。
以上是关于BLE 监听以及MTU浅析的主要内容,如果未能解决你的问题,请参考以下文章
一起Talk Android吧(第四百二十六回:修改BLE中的MTU)
Android BLE设置MTU大小(2020-08-20)
Qt低功耗蓝牙系列三(低功耗蓝牙客户端的程序设计纯Android代码)