前言:在使用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)。

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

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

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

  1. 蓝牙学习笔记(九)——BLE超过20字节数据包传输(MTU)

    前言:在默认情况下,BLE 支持传输一次性最大不超过20字节的数据包,但是很多应用场景下,往往会需要传输更多数据.下面说下如何进行一些修改,使之能够传输更大数据. 实验环境: 客户端:nRF Conn ...

  2. 蓝牙学习笔记(八)——BLE 4.0 的128Bits/32Bist/16Bits的UUID

    前言:对于BLE中的GATT Profile经常用到的UUID(universally unique identifier)做一些概述. 1. 128bits的UUID   UUID作为通用唯一标识符 ...

  3. 【RW007系列综合实战1】STM32+RW007实现BLE透传功能

    本期文章将分为5篇连载,前2篇将围绕模块功能详解展开,其后3篇将为大家讲解基于RW007相关DEMO的实现,文章目录如下: 今天我们将使用STM32F411-NUCLEO通过 RW007 BLE 功能 ...

  4. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  5. Kolin学习笔记十-kotlin与java互操作

    Kolin学习笔记十 kotlin与java 可空性 互操作性 @JvmName @JvmFiled @jvmoverloads @jvmstatic 异常捕捉 函数类型操作 kotlin与java ...

  6. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  7. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  8. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  9. 吴恩达《机器学习》学习笔记十——神经网络相关(2)

    吴恩达<机器学习>学习笔记十--神经网络相关(2) 一. 代价函数 二. 反向传播算法 三. 理解反向传播算法 四. 梯度检测 五. 随机初始化 1.全部初始化为0的问题 2.随机初始化的 ...

最新文章

  1. 皮一皮:直男的世界不可揣测!
  2. java基础(十一) 枚举类型
  3. app.vue中引用图片src=“../assets/logo.png“报错未找到图片
  4. python tkinter 布局_python tkinter组件摆放方式详解
  5. rxjs里subscribeToArray的一个JavaScript模拟实现
  6. matplotlib画图设置线条透明度
  7. linux make编译报错 mv,Linux下安装redis
  8. PsotgreSQL
  9. 多线程资源共享之同步锁
  10. 一道有关switch-case题目
  11. Linux下patch打补丁命令
  12. 深入浅出设计模式(影印版 ) 读书笔记
  13. c语言编程线性规划,C语言大作报告_线性规划求解_基科3字班
  14. 台达服务器AB和B2系列区别,台达A2与B2伺服的区别
  15. 关于 Uncaught ReferenceError: mOxie is not defined情况下的问题
  16. SCCM推送升级Win10
  17. C#高级编程面试考题
  18. 实对称矩阵的若干性质与详细证明
  19. sql cast 和convert用法详解
  20. 文案馆头像壁纸小程序源码 带后台

热门文章

  1. Android “Theme.AppCompat.Light”解决方法
  2. windows之临时文件
  3. springboot之idea多模块
  4. activemq之Windows安装
  5. sim卡iccid编辑软件_一篇文章扫盲手机SIM卡相关知识
  6. 拼团功能实现 php_PHP实现微信退款功能
  7. mysql sql语句集合
  8. 笔记本--摄像头驱动--找不到相机--浏览器打开相机失败--未检测到摄像头--剩下的标题我就不想了--太长了
  9. java家谱树_青锋家谱系统-基于springboot+orgtree的青锋家谱树管理系统
  10. python内置数据结构_Python内置数据结构(一)