丨budboool · 2023年10月26日 · 广东

全志R128 BLE最高吞吐量测试正确配置测试

在R128使用前我们需要了解BLE的最高吞吐量,以方便评估相关功能的开发。

首先我们了解一下哪些因素会影响蓝牙的吞吐量:

1、蓝牙版本与PHY: 蓝牙设备的版本和物理层(PHY)对于吞吐量有很大影响。例如,R128设备支持蓝牙5.0,而蓝牙5.0版本后支持2M PHY,使用2M PHY会获得更高的数据吞吐量。

2、DLE(数据长度扩展): 在蓝牙4.2版本之后,BLE(蓝牙低功耗)开始支持DLE(也称为长包),使用长包可以使单个BLE数据包传输的payload达到251字节。通常,此功能是默认启用的,这有助于提高数据吞吐量。

3、MTU与数据发送量: 协议规定LL data PDU的Payload最大为251字节,即一次可以传输251字节的L2CAP数据。在L2CAP Data之上还有4个字节的头部,因此L2CAP的Payload为251-4=247字节,即一次可以传输247字节的ATT data。而在ATT Data之上还有3个字节的头部,所以ATT的payload为247-3=244字节,即一次可以传输244字节的应用数据。MTU(最大传输单元)通常指的是L2CAP的Payload,即ATT data,其大小为247字节。在发送数据时,应尽量减少拆包和组包的过程,以便提高吞吐量。这意味着应用在发送数据时,应尽量每次发送不超过244字节的数据。

downloadFileByUrl.png

4、连接间隔: BLE技术的特点是低功耗,这主要是因为BLE的两个设备并不是传统意义上的长连接,而是间隔一段时间进行周期性交互。这个周期性的间隔称为连接间隔。连接间隔越小,单位时间内可以发送的数据包就越多。因此,为了提高吞吐量,应尽量减小连接间隔。

downloadFile1ByUrl.png

5、每个连接事件的最大数据包数: 在蓝牙连接过程中,每个连接事件内可以发送的数据包数量通常为7个。如果在一个连接事件内发送过多的数据包,可能会导致吞吐量下降。因此,应尽量保证在一个连接事件内发送不超过7个数据包。

6、写操作: 在蓝牙通信中,write和write\_without\_response、indicate和notify是常见的操作方式。write操作需要对方确认,效率相对较低;而write\_without\_response和notify操作则不需要对方确认,效率较高。因此,为了提高吞吐量,应优先使用write\_without\_response和notify操作。

针对以上因素,我们可以制定出一套可以满足最大吞吐需求的正确配置

1、使用2M PHY
(1)若我方作为GATTC,应该由我方发起PHY UPDATE的动作。
在较新的btmanager中已经适配(在SDK V0.9版本后才有),老版本上未有。若客户不使用btmanager,需要自行检查适配。
(2)若我放作为GATTS,一般支持蓝牙的5.0的手机设备默认有PHY UPDATE的动作。

2、更新LL data length
虽然默认支持长包功能,但是为了兼容4.0和4.1版本,蓝牙controller默认还是使用27字节的包发送。
需要在连接的时候主动更新LL data length为251字节。在较新的btmanager中已经适配(在SDK V0.9版本后才有)。若客户不使用btmanager,需要自行检查适配。

3、MTU与数据发送量
L2CAP MTU 设置为247:

-CONFIG_BT_L2CAP_RX_MTU=65
+CONFIG_BT_L2CAP_RX_MTU=247
-CONFIG_BT_L2CAP_TX_MTU=65
+CONFIG_BT_L2CAP_TX_MTU=247

同时,应用或测试demo在发送数据时,应该每次最多发送244字节。

4、连接间隔
连接间隔范围是7.5ms ~ 4s。
但是并不是越小就越好

  • 连接间隔越小,抗干扰能力就越差。
  • 若蓝牙controller在一个连接事件中能发送7个数据包,连接间隔应该设置大于12.5ms,因为这7个包已经占用了大概9.5ms了。
  • 建议连接间隔在12.5ms、13.75ms、15ms中尝试。

(1)若我方作为GATTC,可以在btmg\_le\_connect中指定为连接间隔即可。
(2)若我放作为GATTS,对方使用的连接间隔太大,我方可以通过协议栈主动更新,相关配置

-# CONFIG_BT_GAP_PERIPHERAL_PREF_PARAMS is not set
+CONFIG_BT_GAP_PERIPHERAL_PREF_PARAMS=y
+CONFIG_BT_PERIPHERAL_PREF_MIN_INT=11
+CONFIG_BT_PERIPHERAL_PREF_MAX_INT=11
+CONFIG_BT_PERIPHERAL_PREF_SLAVE_LATENCY=0
+CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=42

5、增大协议栈TX和RX buff
增大协议栈TX buff可以让数据能快速送到蓝牙controller。

-CONFIG_BT_CONN_TX_MAX=3
+CONFIG_BT_CONN_TX_MAX=8

-CONFIG_BT_L2CAP_TX_BUF_COUNT=3
+CONFIG_BT_L2CAP_TX_BUF_COUNT=8

增大RX buff 可以提高接收效率:
设置为255是因为包含HCI的包头4个字节。

-CONFIG_BT_RX_BUF_LEN=88
+CONFIG_BT_RX_BUF_LEN=255

-CONFIG_BT_DISCARDABLE_BUF_SIZE=88
+CONFIG_BT_DISCARDABLE_BUF_SIZE=255

6、使用write\_without\_response和notify发送数据

推荐阅读
关注数
17
文章数
95
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息