影响BLE吞吐量的主要因素有:Data Length, MTU,连接间隔, 每个连接间隔可以传输的最大数据笔数, 通讯速率(1Mbps、2Mbps)下面分别进行简单介绍: 1、MTU MTU是指L2CAP传输的最大数据长度,对于BLE这个值默认是最小值23,其中减去2个字节handle以及1个字节的Opcode,所以用户层ATT发送的默认最大是20个字节, 下图中的max_mtu就是设置这个值; 在l2cap层定义length的占用了2个字节,这个值蓝牙协议定义最大是4095bytes, 每个芯片的协议栈内存情况不一样,需要查看该芯片的实际值。
2、Data Length 是link layer的PDU通讯的长度,分为发射和接收的长度,连接上后主机通过LL_LENGTH_REQ发送请求,并携带了自身可发射的字节长度MaxTxOctets和时间MaxTxTime以及可接收的字节长度MaxRxOctets和时间MaxRxTime,从机会通过命令LL_LENGTH_RSP回给主机自身的对应的参数,主从双方发送数据长度不大于对方可接收的大小。我们的6621Cx\6621Px、6621Ax系列芯片可以在app_task.c中的命令GAPM_SET_DEV_CONFIG配置中配置这2个参数; 从下图3中可以看到Data length在header中只占用了1byte,图4中可以最大的值为251.
3、MTU与Data Length的区别 MTU属于软件性质的定义,当MTU过大时,l2cap会进行‘软件性质'的分包处理,从下图中可以看到,L2CAP在‘软件上’将包分成了10个组包,以第一包Start Fragment开始,后面跟若干个Continuation Fragment包; 从下面的图1和图2可以看到,一个包被分成了10个包由主机发往从机, 从下面的图3可以看到从主机发往从机的包被分成了3个包;
Data length是硬件性质的定义,是指芯片的硬件层PHY的Link Layer最大通讯的长度,也就是controller的数据通讯长度。 如果mtu大于data length,则l2cap负责分包成data length的发送长度进行传输。如果mtu小于data length则应用层发送最大MTU长度可以 被底层一笔传输出去; 如果将Data Length比做一辆大巴的载客量,MTU比作是游客总人数,如果大巴的载客量大于人数,那一次性就能载完,反之,则需要分多批次载人发送。 所以,对于只一味的去加大MTU,而data length不变化,对于吞吐量是不会提升的。 所以,data length才是吞吐量的关键影响因素,这是芯片影响吞吐量的硬件指标之一; 3、连接间隔的影响 对于连接间隔的影响,主要体现的RF的繁忙度上不要留下太多的空闲, 从下图中,可以看到一个15ms的连接间隔中主机发往从机有6个数据包,如果这样的情况将连接间隔设置为150ms,则效率就会下降到10%,要尽量的‘利用’完时间,当然 对于像电脑、手机这样的主机也不可能将一个连接间隔的时间全部占用用于传输,因为还需要留下空闲的时间进行扫描设备以及其它连接设备等任务;
4、一个连接间隔内最多的传输数据的笔数 一个连接间隔内,主从间不仅仅交互一个数据包,而是允许传输多个数据,至于最大能传输多少笔,取决于双方的FIFO的深度,完全由芯片自身硬性性能决定。 当在一个连接间隔内需要告知对端还有更多的数据包的时候,会将Link Layer的Header包中的MD(more data)数据位置1,接收方就会继续接收下一笔数据。 所以,如果一个连接间隔内只允许传1笔数据,那吞吐量肯定是不理想的。
5、Characteristic的Value长度 这个值的数据长度也是容易忽视的一个地方,添加服务属性的时候需要注意; |