蓝牙学习笔记(九)——BLE超过20字节数据包传输(MTU)

本文介绍了如何通过调整BLE设备的MTU值实现超过20字节的数据包传输。首先,解释了BLE设备的client和server角色,然后详细阐述了MTU交换请求的过程,包括服务端和客户端如何处理这些请求。实验中,使用nRF Connect APP作为客户端,展示如何修改MTU以允许更大数据量的传输,并观察了不同MTU设置下的数据传输效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在默认情况下,BLE 支持传输一次性最大不超过20字节的数据包,但是很多应用场景下,往往会需要传输更多数据。下面说下如何进行一些修改,使之能够传输更大数据。


实验环境

  • 客户端nRF Connect APP,手机应用市场均可下载,实验手机蓝牙协议版本为5.0。
  • 服务端搭载蓝牙芯片AC6920的开发板,SDK蓝牙协议栈版本为4.2。

1.server与client

  低功耗蓝牙的设备可以分成两类:一类是中央设备,用于找到并与外围设备进行交互,在常见的场景中,一般它具有丰富的功能和复杂的用户界面,比如手机。中央设备在BLE中一般扮演的角色是client
  低功耗蓝牙应用的另一类是外围设备,向中央设备提供信息和服务。在常见的场景中,它一般是搭载在各设备上的蓝牙芯片,扮演server角色。
  类似于互联网的HTTP协议一样,属性协议其本质上也是也是一种无状态协议,它不仅在连接时没有状态,在连接和连接之间也没有状态。因此,在每次信息发生变化时,都需要其中一方主动发送信息。


2.交换MTU请求

  在低功耗蓝牙连接中,属性协议默认的MTU长度为23字节。按照1个字节的类型操作码(六种基本操作:请求、响应、命令、指示、确认、通知)以及最少2个字节操作句柄(16BitsUUID)算,数据传输字节最多不超过20字节。在两个设备连接初期,谁也不知道对方底细,因此数据交换严格按照默认MTU来,即MTU为23字节。
  如果设备想要发送更大的数据包,那么它就要协商一个更长的MTU。只有客户端可以发起这种请求。客户端的请求包含客户端接收的MTU长度;服务器请求则包含服务器接受的MTU长度。对于同时是是客户端服务器的设备而言,二者提供的接收MTU长度中较小的那个即是连接将会使用的MTU长度。


2.服务端

  观察了AC6920的SDK后,发现在每次蓝牙芯片上电初始化时总是先读取一次默认MTU的值作为传输数据的标准。此后客户端若进行MTU请求,则在请求MTU大小和发送数据缓存中取二者最小更新数据,否则一直按照默认MTU发送数据。

/* -----------------定义服务端的MTU------------------*/
#define ATT_DEFAULT_MTU       23

/*--------------初始化ATT发送协议栈参数------------- 
--
在Android BLE(Bluetooth Low Energy,低功耗蓝牙)通信中,单字节数据传输通常涉及通过特征值(Characteristic)进行读、写操作。BLE设备之间相互通信的基本单位是服务(Service),每个服务可以包含多个特征值(Characteristics)。每个特征值用于表示特定的数据点,并支持各种属性如读取、写入等。 对于仅需发送或接收一个单独字节的情况来说,在设置好连接和服务后: ### 写入单字节 1. 确定你要使用的GATT服务器上的目标特性。 2. 准备好待发送的一个字节数组(byte[1])。 3. 使用`writeCharacteristic()`方法将这个数组作为该特性的新值。 例如: ```java byte[] value = new byte[]{(byte) 0x7F}; // 示例:准备要写的单字节数据 bluetoothGattCharacteristic.setValue(value); mBluetoothGatt.writeCharacteristic(bluetoothGattCharacteristic); ``` ### 接收单字节 当另一端向我们的应用程序写入了一个字节时,我们会收到回调通知,这一般是在实现了 `BluetoothGattCallback` 的地方处理的。 示例代码片段: ```java @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic){ super.onCharacteristicChanged(gatt,characteristic); final byte[] data = characteristic.getValue(); if(data != null && data.length > 0){ // 解析接收到的第一个字节... Log.d(TAG,"Received Byte:" + String.format("%02X ",data[0])); } } ``` 为了保证成功地完成上述过程,请确认已经正确配置了BLE权限以及相关的广播发现流程;并且确保两个BLE设备之间的配对和连接状态正常工作。 此外还需注意一些细节事项,比如检查是否需要启用Notification来监听远程设备发来的更改信息等等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值