问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

BLE数据传输丢包的分析

发布网友 发布时间:2022-10-15 16:30

我来回答

1个回答

热心网友 时间:2023-10-09 22:11

像所有的网络传输协议一样,应用层能感知到的丢包有可能产生于应用层之下的所有层。

对于蓝牙BLE而言,进一步细化从机到主机的数据传输场景(假设使用的是Notify方式传输),其数据传输路径为:

1、从机的应用层产生数据。

2、从机将数据从Host上位机转交给Controller下位机。

3、从机Controller通过调制器,将数据在连接事件的射频Tx阶段发出。

4、主机Controller同时开启射频Rx阶段,接收无线电波并通过解调器还原数字信号。

5、主机将数据从Controller下位机转交给Host上位机。

6、主机的应用层接收数据。

根据上面的流程,进一步分析一下可能产生数据丢包的环节。

在步骤2中,Host调用HCI函数将数据提交给Controller发送之前,会先将数据存放在Controller的数据缓冲区中,不同的蓝牙芯片这个缓冲区的大小不同,比如Ti CC2541的射频缓冲区只有4个PDU(4*20字节)的大小。在缓冲区存满后继续调用HCI的Notify等函数会返回缓存区满状态位标识。这是第一个有可能产生丢包的位置,若缓冲区满且开发者没有对此状态位进行校验,则应用层产生的数据会在传递给链路层之前丢失。

在步骤3、4中,从机的Controller在连接事件的Tx阶段,会通过射频依次发送缓冲区数据,并在下一个Rx阶段根据捕获和解析对端主机的数据包,从其链路层报头中读取NESN来确认其在上一个Tx阶段发送的数据包是否被对端主机链路层正确接收。由于链路层数据包序列号校验机制(SN和NESN)和重传机制的存在,基本可以保证数据在物理层和链路层阶段不会产生丢包,这跟互联网的传输层TCP协议校验数据包序列和完整性基本类似。

之所以上面用“基本”二字,是因为这里还是存在第二个有可能产生丢包的位置。由于BLE中使用的CRC校验是弱CRC,其只能保障传输字节的全部偶数位和部分奇数位不产生错误,并无法保证所有数据在传输过程中不出错。那么一个可能性极小的场景是:CRC弱校验通过,但实际上NESN出现了错误,而将本来应该是0的位识别成了1,或者相反。而这个位差错让本来应该是错误的序列号交替变成了正确的。

在步骤5中,主机将数据从Controller向上派发到Host,并转到应用层触发回调通知。这里是第三个可能产生丢包的地方。原因同步骤2,但这里还有一点小区别,就是notify跟indicate的区别(反向传输中的write with/without response也是同理),其本质区别是数据接收成功的判断标志是以链路层确认为准还是以应用层确认为准。前者是notify采用的方式,而后者是indicate采用的方式。可见如果采用notify做数据传输,链路层到应用层这一步依然是有丢包的可能,比如链路层的数据传输速率大于应用层的回调函数中对数据处理的速率,导致Host中数据缓冲区持续增长,当缓冲区满后,主机的Controller将丢弃无法继续保存的数据,并不会通知对端设备重传。

而indicate方式下,每一个数据包的成功确认都是以应用层回调处理执行完成为标志,而通常数据的逻辑处理是一个耗时的操作,并且由于数据是在连接事件内接受到,但同一个连接事件在开始的时候主从机两端的数据就已经准备好,由于连接事件的持续事件极短,在这段时间内Controller的所有工作都集中在射频的发射上,而不会从Host上位机接受数据和响应,甚至有的蓝牙芯片会有选项在这段时间内直接挂起CPU,以防止其他中断信号同步到达,干扰到射频数据的发送效率。所以在indicate方式下,一个数据包至少要横跨两个甚至更多的连接事件时长才可以确认到达,从而发送下一个数据包,这就是有响应的数据发送方式比无响应要慢的原因。

最后一点,由于Android操作系统封装了蓝牙低层驱动和实现,以上的6个步骤即使都正确完成,也只是意味着Bluez或者Bluedroid这一层正确拿到了数据,但App要接收到这些数据还存在一个从操作系统到App的数据派发过程,indicate的数据确认是在App得到数据派发并执行完成回调后确认,但notify会在Bluedroid接受到数据后即完成链路层确认。而Bluedroid向App的数据派发又存在一个缓冲区,当蓝牙连接而App没有运行的情况下缓冲区满依然会产生丢包。(Android好像很难模拟这种情况,iOS在通过调试器终止App进程的时候经常会造成蓝牙连接链路不同步断开)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女人脚出汗有酸味是怎么回事 脚的酸味是什么原因 请问南充有奥迪4S店或者奥迪专修店吗?电话号码是多少? ...不爱我了,对我已经死心了!我该怎么做,真的很爱她,好想挽回,我也不... 烂板凳的意思是什么 爸爸过世几个月了,为什么还梦见爸爸还没埋葬呢,看见爸爸的尸体_百度知 ... 眼睛结膜炎痒怎么办 结膜炎眼睛痒怎么缓解 结膜炎眼角痒怎么办 苹果电脑下载什么编辑器适合mac的视频剪辑软件有哪些 labview用tcp侦听与wifi模块通信,怎么实现不了啊!!!就是我想用labview作为上位 C:/windows/font是字体库那怎样把字体弄进去 求助,ShareFontTool字库工具安装不能 椰子苹果汤可以与虾蟹同吃吗? 虾蟹与水果不能同食? 吃了九节虾和螃蟹可以喝苹果胡萝卜汁吗 虾和螃蟹不能和什么一起吃 虾和螃蟹不能和哪些食物一起吃 苹果跟虾蟹同吃可以吗 吃完螃蟹虾在喝苹果猕猴桃香蕉果汁可以吗? 车两厢三厢是什么意思 两厢车和三厢车是什么意思? 苹果7公司怎样下载手机铃声? 石家庄工资5000等于北京多少 石家庄动物园工资多少钱一个月 为什么感觉石家庄工资普遍偏低? 荣耀v10标准版跟尊享版外观是一样的吗? 网上搜索的低利息贷款可靠吗? 银行降低贷款利息 是什么意思 les一般都喝什么红酒 蒙自有几家诚泰保险公司分别在什么地点 这是什么牌子的红酒?大约多少钱 高三家长必知的十大建议 踢足球英语怎么读 如何英语表达踢足球 抖音谁收藏了我的作品 华为畅享九能不能使用?五v=6A的充电头充电,如果可以的话,能不能和5A的充电线一起使用? 苹果手机开机时的 取消 与 接受 提示怎样关闭? 怎样取消苹果手机在开机时的备忘等显示 苹果手机开机问候语,怎么取消 不同规格的广告钉都使用在什么地方 大雁报仇童话故事 出自《尼尔斯骑鹅旅行记》第46页 大雁们离开维姆布湖开始朝北飞行的遇到什么 10秒31等于多少秒 1分31秒27怎么简写 我想问一下一般裸眼视力是多少 梦见大黑鹅有什么意思 吸铁石能吸到纽扣电池么 优秀的财经宣传语 95年一万3能买怎么样的摩托车 有什么办法快速解决口腔溃疡? oppok7x怎么刷机清除密码 广州奈瑞儿美容院祛腋毛大概多少钱