蓝牙学习笔记(十)——BLE透传传输延迟分析

前言:在使用BLE进行数据透传时,收到串口数据并判断为一帧数据的做法为:

  • 1.每次收到一个字节数据后开始计数,计数器清零开始计数。
  • 2.若计数器计时时间达到10ms(即10m未收到数据,判断为一帧数据接收结束)。
  • 3.一帧数据接收结束后,开始将一帧数据送到BLE协议栈,协议帧在再将数据送到Android端。

  实验上述流程时,波特率115200,将串口数据端发送数据帧的时间间隔定为20ms。发现20ms的串口数据帧间隔不会造成BLE串口数据接收,但会造成的Android端数据丢失,不断改变串口数据帧发送时间间隔,发现当数据帧间隔>=75ms时,数据帧每一帧都可以被正确接收。由于考虑到数据的传输延迟不仅只有串口端,还有BLE协议栈到Android主机的过程。下面进行一些分析:


1.BLE的一次数据传输

  BLE的主设备和从设备数据传输时采用了Server/Client模型,所有在每一次数据传输过程中都需要 重新建立连接 ,即每一次的数据传输都在一个 连接事件(Connection Event) 内完成。

1.1BLE连接流程

BLE连接流程
主设备(Master) 从设备(Slave)
待机模式 待机模式
扫描模式 广播模式
扫描请求 扫描回应
连接请求 ——
连接参数请求 ——
—— 参数请求更新
参数更新回应 ——
建立连接 ——
连接事件 ——
  BLE的一次连接都需要经历创建连接和建立连接的过程,其间,主从设备双方还需要约定连接事件参数。由于本文主要分析传输延迟的原因,就不对创建连接和建立连接的过程再做赘述,重点分析BLE连接参数的影响。

2.BLE连接参数

  阅读一些BLE开发手册书籍,会发现BLE计算传输时间的时间片为1.25ms(即各种连接参数的时间都为1.25ms的倍数),在链路层的连接参数有如下:

  • 传输窗口偏移量:当连接请求数据包发送完毕,存在一个1.25ms的强制时延(为了让主机堆栈有足够时间向控制器提供数据),传输窗口偏移可以是0到连接间隔之间的任意值,但必须为1.25ms的整数倍。经过传输窗口偏移后,传输窗口开始。
  • 传输窗口大小:从传输窗口开始,从设备打开接收器,等待来自主设备的数据包。如果到传输窗口结束时仍未收到数据包,从设备终止侦听。
  • 连接间隔:连接间隔决定了主设备和从设备的交互间隔,它是指两个连续的连接事件开始处的时间距离,可以是7.5ms~4s内的任意值,但必须为1.25ms的整数倍。
  • 从设备延迟:要确定从设备和主设备的实际交互间隔,需要用到从设备延迟这一参数,它实际上是一个连接间隔的倍数,代表从设备在必须侦听之前可以忽略多少个连接事件。
  • 监控超时:从设备延迟必须短于监控超时时间,建议至少给从设备留出6次侦听的机会。
  • 瞬时:瞬时参数决定了连接更新的开始时刻。发送消息时,主设备为连接更新选定一个未来的时间点,并且放在消息中。接到消息后,从设备会记住这个未来的时刻。届时再切换至新的连接参数。

  在上述参数中,做应用层开发时经常用到的连接参数是:连接间隔、从设备延迟、超时时间。其他的参数一般都是为了解决连接质量冲突设计的,在一些SDK中不被开放修改。

2.1连接间隔(Connection interval)

  连接事件被一个个连接间隔分开。从主设备发送数据包开始,每个连接事件可以持续进行,直至主设备或从设备停止响应。在连接事件之外,主从设备之间不发送任何数据,设置时间必须为1.25ms的整数倍

2.2从设备延迟(Slave Latency)

  要确定从设备和主设备的实际交互间隔,需要用到从设备延迟这一参数,它实际上是一个连接间隔的倍数(即连接事件计数器),代表从设备在必须侦听之前可以忽略多少个连接事件。应当指出,从设备延迟必须短于监控超时时间,至少给从设备留出6次侦听的机会。

2.3超时时间(Supervision Timeout)

  为了让从设备收到数据包,主设备必须为其提供足够的机会 。不管从设备延迟是多少,都应该保证至少6次数据发送机会。因此超时时间应 >= 连接间隔 x (从设备延迟 + 1)x 6。

2.4连接参数对通信速率和低功耗的影响

  • 连接间隔设定越小,主从设备间通信次数多,数据吞吐量更高,通信速率更高,但功耗更大。
  • 从设备延迟设定越小,每次连接事件回应数据次数越频繁,功耗上升,但通信速率会更高。

实验分析

  在上述实验过程中,串口打印出连接参数为:conn_interval = 40, conn_latency = 0,conn_timeout = 500。可见对于每次连接事件,主设备都会响应,并且连接间隔时间50ms(40x1.25ms)。

蓝牙学习笔记(十)——BLE透传传输延迟分析

  当数据包从MCU发送到BLE(Server)时,它20ms后将会被后发送的数据覆盖,而它最多需要等待50ms才会有数据请求响应连接,有非常高的可能性数据会被覆盖而产生错误。所以如果算上数据本身发送时间以及传输窗口和传输偏移量等因素,数据透传串口端的发送间隔时间必须严格大于连接间隔

  而进一步考虑数据包出错概率的问题,我们可以考虑将串口端接收的数据发送两次,大大减小数据出错的概率。因此即使在略大于一个连接间隔的时间可以收到完全的正确的数据帧,但还是建议将串口端的数据帧发送间隔大于2倍连接间隔,在上述实验中是100ms(50ms x 2)。