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浅析的主要内容,如果未能解决你的问题,请参考以下文章

Android BLE设置MTU大小(2020-08-20)

一起Talk Android吧(第四百二十六回:修改BLE中的MTU)

BLE入门 19 ATT MTU 提升BLE数据传输率

Qt低功耗蓝牙系列三(低功耗蓝牙客户端的程序设计纯Android代码)

Qt低功耗蓝牙系列三(低功耗蓝牙客户端的程序设计纯Android代码)

如何为 Android 应用强制执行最低蓝牙 MTU?