1、前言
很长一段时间都是通过CSDN刷博客学技术,现在想尝试自己动手总结一下自己的学习结果。下面是基于公司项目需求和参考浅谈BLE吞吐量 | Jayden's Blog写的关于“ble透传”的总结,其中重点还是提高ble吞吐量,有不足或不当之处,烦请指出修正。
2、项目需求
ble主从模块点对点通信,执行“透传”功能,需求包最大容量1KB,吞吐速率4KB/S。
要求1,ble进行点对点通信,执行透传功能。
要求2,包长1KB
要求3,速率4KB/S
3、需求分析
**要求1,**很容易实现。一个模块作为slave进行广播,另一个模块作为master进行连接,分别通过**write without responce**而不用write,和**notification**而不用indication,小编的想法是空白(无payload)比回应包(有payload)有效数据少,1Mb/S情况下,一个bit占用1us嘛,有效数据越少,占用带宽时间越短。
**要求2**,包最大容量1KB,也就是说主从设备每次发包都需要1KB,工作模式半双工。根据上述博客中说明,ble中Link Layer Packet限制最多20B数据,也就是说20B对应Att的Payload部分不能超过20(1premble+4accessaddress+2header+4l2cap+3Att_header+20Att_payload+3crc), ,Att的payload若超过20B,L2cap则作分包处理,连续包Payload的长度可27B,去除header,但最终还是受MTU限制(512B),并不能达到每次包长1KB的要求。
策略如下:一方面Gatt对写操作支持写长包形式,如下图所示,每个包都对应一个回应,回应包相对于空包占用带宽时间更长;另一方面从代码实现角度来说,从设备通过notification发送数据并不支持长包,即最大支持512B。因此,小编主从设备采用统一方案,**应用层主动分包——MTU设置为512,包长度超过512B作分包处理,不超过直接发送。**
**要求3**,速率达到4KB/S,那么就是尽可能的提升ble的发包速率。在没读上述博客之前,小编已实现透传方案,与博主给的建议几乎一致,哈哈!!!这边截取一张博客图来说明一下。
根据上图可得出提升ble速率的方法:
1、减小连接间隔,最小6*1.5ms,即7.5ms;
2、在每个connection event中发送更多的包,小编在代码中翻了一遍,没找到可以适配这一条件的,不过可以提高配置connection event持续时间来达到要求;
3、提升Llink Layer Packet负载的数据,上文已经描述清楚,头包20B,连续包27B,直接pass。
4、调整帧帧间隔T_IFS,这个貌似硬件实现的,小编没有试过。
其他方法:
1、应用层,配置ble任务优先级为最高,不被其他任务打断,且发包过程都是在tx中断中,尽量减少发包过程中做其他业务吧。
2、GATT层,能做的MTU尽可能大,已经512B了!!!主从都采用无回应方案发包。
3、LL层,对于上述分析。
4、重传率,即SN和NESN正常更新情况下会很低,若一直SN_ERROE和NESN_ERROE……就去查一下芯片的收发性能吧,30%?20%?10%。
5、小编的方案是每次从queue即一个循坏buff读取数据,当没有数据来的时候在进行发送,因此很受影响……(AT框架限定死了,具体查阅代码)
当然还有一些其他因素,比如cpu处理速率,hci接口等。
注:当时查阅平头哥ble透传方案好像时9KB/S,源码链接参考1,咱们项目要求4KB/S。
4、BLE的AT透传方案设计:
实现框图如下,MCU1通过uart给MCU2发送AT指令,若ble模块工作于order模式,则将order保存于order_queue,若ble模块工作于data模式,即透传模式,则将data保存于data_queue。
两种模式之间通过状态机切换,oder模式下,比如AT+STARTADV,即先保存order_queue,之后立即执行开启广播操作;data模式下,先存数据入data_queue(**循坏buff**),当有数据刷新时,reset定时器,当无数据刷新时(2tick没收到数据即认为无数据来)通过定时器到期触发TX流程。
小编的这套方案受Uart模式限制,当前模式下,每从uart收到1B数据即触发中断影响业务,若边收边发的话遇到不小的麻烦,调试了一段时间果断放弃了。后续也将uart改进,uart申请FIFO,当FIFO数据满或者指定一段时间从FIFO中读取数据,然后通过ble发送,这样会大大提高ble发送速率。
** 5、总结**
源码链接奉上,有不足之处烦请讨论讨论。
https://gitcode.net/qq_41996931/ble.git
平头哥AT方案源码
ble小能手 / PTG_Source · GitCode
版权归原作者 ble小能手 所有, 如有侵权,请联系我们删除。