蓝牙BLE传输性能及延迟分析
BLE传输性能主要受以下几个因素影响:操作类型,Connection Interval,每个Connection Event内发送的帧数、每一帧数据的长度。具体参见如下链接:
https://en.wikipedia.org/wiki/Bluetooth_low_energy
https://devzone.nordicsemi.com/question/3440/how-do-i-calculate-throughput-for-a-ble-link/
https://atmosphere.anaren.com/wiki/Data_rates_using_BLE
https://punchthrough.com/blog/posts/maximizing-ble-throughput-on-ios-and-android
目前的一个项目对BLE传输性能有较高要求,将以上几个因素逐一确认,使用协议支持的最优值,其中Connection Interval设置为7.5ms,每一帧数据长度为20字节,每个Connection Event根据业务需要设置为2,依此计算出的理论传输速度约为5600Bps。为了测试实际效果,在Android端写了一个小程序,将数据流和时间戳打印出来,如下:
[21]:TS 238.794720 PN 20780 [1]: [21]:TS 238.795954 PN 20780 [2]: [21]:TS 238.802182 PN 20781 [1]: [21]:TS 238.802373 PN 20781 [2]: [21]:TS 238.810432 PN 20782 [1]: [21]:TS 238.832608 PN 20782 [2]: [21]:TS 238.832650 PN 20783 [1]: [21]:TS 238.832728 PN 20783 [2]: [21]:TS 238.832751 PN 20784 [1]: [21]:TS 238.832820 PN 20784 [2]: [21]:TS 238.832843 PN 20785 [1]: [21]:TS 238.833862 PN 20785 [2]: [21]:TS 238.839201 PN 20786 [1]: [21]:TS 238.839403 PN 20786 [2]: [21]:TS 238.848280 PN 20787 [1]: [21]:TS 238.848894 PN 20787 [2]: …… [21]:TS 288.128815 PN 27346 [1]: [21]:TS 288.128977 PN 27346 [2]: [21]:TS 288.136323 PN 27347 [1]: [21]:TS 288.136908 PN 27347 [2]: [21]:TS 288.159292 PN 27348 [1]: [21]:TS 288.159569 PN 27348 [2]: [21]:TS 288.159922 PN 27349 [1]: [21]:TS 288.165079 PN 27349 [2]: [21]:TS 288.167879 PN 27350 [1]: [21]:TS 288.168157 PN 27350 [2]: [21]:TS 288.173809 PN 27351 [1]: [21]:TS 288.173906 PN 27351 [2]:
其中21为数据长度、TS为时间戳、PN为包号,1和2是一个Connection Event内的包的类型。可以看到,一般情况下,一个Connection Event发送两帧数据,这两帧数据的时间间隔在1ms以内,两个Connection Event之间的时间间隔约为7ms。为了直观呈现测试结果,在PC端写了一个工具以分析抓取的LOG,主要根据包号、包的类型、字节长度和时间戳,统计丢包率和传输速度,如下图所示。
可以看到,一共传输了约16.3万个包,没有数据丢失,两帧之间最大时间间隔约为22.384ms,最大传输速度为5641Bps,平均速度约为5583ms,与理论值相差不多。Connection Interval对传输性能的影响对比下图。
BLE传输延迟(Latency)主要是指设备端将数据放至蓝牙协议栈到Android主机收到的时间间隔。由于通信双方时间戳不统一,无法按照前面通过打印时间戳的方式来做统计传输延迟,只能通过硬件信号做同步。设备端将数据放至蓝牙协议栈时给出一个信号,Android主机收到该数据时也给出一个信号,使用示波器抓取两个信号即可得到数据通过蓝牙BLE传输的延迟,如下图所示。
可以看到BLE传输延迟约为8ms左右,会上下波动。
数据传输延迟还跟Android端软件读取数据的均匀程度有关,Android端软件需及时将数据从缓存中读取出来,否则也会造成一定的延迟。评估数据读取均匀程度的方法同上,也是通过示波器抓取波形来看,如下图所示。
其中1通道为设备端发送数据,2通道为Android端读取数据,双方节奏基本保持一致,确保了及时读取和分发设备端上报的数据。
本文主要是通过打流和抓波形的方法,验证了蓝牙BLE的传输性能和延时。实际调试过程中还可以使用FTS4BT工具分析btsnoop_hci.log文件,以探究BLE建立链接、Update Parameters和数据传输等细节。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
awesome-android 开发维护指南
作者:snowdream Email:yanghui1986527#gmail.com Github: https://github.com/snowdream QQ 群: 529327615 原文地址:https://github.com/snowdream/awesome-android/wiki awesome-android 开发维护指南 项目说明 本项目是为了将Github和其它网站的一些开源Android库进行索引,方便Android开发者进行查阅而创建。 项目地址 https://github.com/snowdream/awesome-android 适用范围: 本文档适合于任何想加入我们一起维护awesome-android项目的android开发者。 编写目标 用于规范awesome-android的开发维护流程。 如何加入我们 如果你是一名Android开发者,看完本文档后,希望加入我们一起维护这个项目,请通过以下方式联系我们。 Email:yanghui1986527#gmail.com QQ Group: 529327615 加入要求 Android开发者 熟...
- 下一篇
Android谈谈封装那些事--BaseActivity和BaseFragment(一)
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/53872175 绪论 圣诞节怎么过?我不过圣诞节,被票圈的晒幸福虐惨了,还是在家里面总结总结自己吧。上篇文章 Android自定义View–自己撸一个柱状图也没那么难 我说过会封装一套属于自己的库,争取在元旦之前发出来,作为新年礼物给自己,给大家。好了,今天我们先来聊聊自己在项目中以及参考大神们的代码怎么来封装自己的BaseActivity和BaseFragment。 怎么封装? 说到封装我们首先想到的就是面向对象,以前脑子里对于面向对象的认识就是封装、继承、多态,随着自己真正进入开发工作之后,慢慢的才有了更深的认识;其实最深的一次是在和朋友交流的过程中他给了我很大的启发,所以技术交流其实还是很重要的。那么什么是封装呢?那就不得不提到面向对象了,下面谈谈我自己的理解,不一定对,所以还请大家多多包涵指正: 首先:面向对象的根本本质是什么?简单的一句话,其实就是把属性和方法绑定到了一起,这句话该怎么理解呢?举一个最简单的例子:我们在写一个activity...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装