BLE 设备丢包理解

前言

  1. 个人邮箱:zhangyixu02@gmail.com
  2. 在学习 BLE 过程中,总能听到 “丢包” 一词,但是我查阅资料又发现,有大佬说,ATT所有命令都是“必达”的,不存在所谓的“丢包”。而且我发现,在宣传 BLE 产品时候,从来没有商家宣传过自己丢包率有多低,一般都是宣传的功耗传输速率
  3. 一顿操作下来,这彻彻底底把我这个菜鸟搞懵逼的了。为了搞明白这其中的概念,我查阅了各种资料,结合个人理解写一下我对 BLE 丢包这一词的概念。
  4. 如果有误,请大佬不吝赐教。

丢包的概念

个人认为,对于丢包这一词,我们应当站在不同的层级说不同的话,这样我们就能够真正的理解,为什么有些大佬说ATT所有命令都是“必达”的,不存在所谓的“丢包”。而又有一些大佬说,BLE 怎么可能不丢包。这**两种说法其实并没有错误,只是所站的角度不同
**,因此说出来的话看起来完全对立。

Control 层

丢包理解

  1. 在 Control 层是存在丢包行为的,因为电磁干扰网络带宽不足信号衰减设备故障等物理因素导致数据包无法成功传递到对端设备。
  2. 因此,当发送数据给对端设备的 150us 后需要收到对端设备的 ACK 回应数据包。如果没有收到对端设备的 ACK,那么就会启动重传机制,一直等到对端设备发回的 ACK 命令,如果等待时间超过了监管超时时间那么就会进行断连。
  3. 对端设备在收到数据后,会进行 CRC 校验,确保数据在传输过程中没有因为各种物理因素导致接收到错误信息。

什么是 ACK

  1. 这个时候肯定会有人问,ACK 是啥玩意,怎么抓包没有抓取过,难道空包就是 ACK?如果你明白了 BLE LL 层数据包结构,就将会明白所谓的 ACK 是什么了。
  2. 首先我们先看一下 LL 层数据包格式,我们重点看 SN 和 NESN 这两位进行重传判断。
  • 序列号(SN):当前主机发送的数据包序列。
  • 下一个预期序列号(NFSN):从机期待收到下一个主机发来的数据包序列号。

在这里插入图片描述

  1. 现在我们来看看实例进一步理解。
  • 主机发送数据报文,SN = 0,NESN = 0
  • 从机此时收到数据报文后,期望下一包收到的数据包序列号为 0,因此 NESE = 1。而当前数据包是用于回复主机序列号为 0 的数据包的,因此,SN =0。
  • 因为各种原因,一段时间内主机并没有收到从机回复包,因此进行数据重传。
  • 从机收到重传数据后,发现 SN 依旧为 0。那么说明主机并没有成功收到上一此从机发送的响应包,因此继续重传上一次数据。
  • 主机此时收到从机的响应包了,那么就更新 SN = 1 ,并且期望从机回复该数据包,因此 NESE = 1。
  • 从机收到数据包后,更新 SN 和 NESN。

在这里插入图片描述

  1. 通过上面的例子,我们现在明白了,整个 BLE 的重传机制。那么我们再举几个例子加深理解。
  2. 假如,我设置了从机延迟从机可以忽略主机的数据包,那么整个机制是怎么样的呢?
  3. 主机首先发送数据包给从机从机进行忽略。此时主机继续重发,从机继续忽略。然后主机继续重发,一直重发到从机发送回包时才会开始发下一包其他数据,或者超过监管超时时间,发生断连。
  4. 上面这个需要注意一点,从机发送的回报,有可能是空包,也有可能是包含数据的数据包。如下图,主机发送 LL_VERSION_IND,从机回复的却是 LL_FEATURE_RSP。

core 5.3的 2861 页存在这样如下描述。因此,这种 LL 层 PDU 发生碰撞是允许的,整个数据包分析要结合整个数据交互流程才可知道。
Note: Because Link Layer PDUs are not required to be processed in real time, it is possible for the local Controller to have queued but not yet transmitted an LL_LENGTH_REQ PDU when it receives an LL_LENGTH_REQ PDU from the peer device. In this situation each device responds as normal; the resulting collision is harmless.

在这里插入图片描述

HOST 层

  1. 对于 HOST 层而言,数据包是必达的。因为 Control 层存在 CRC 和重传机制,因此 HOST 层数据只要传递给了 Control 层,只要没有断连,那么数据就一定会正确的传递到对端设备。
  2. 我们需要注意的一点是,不是 req 的命令,虽然协议栈底层确保了该命令必达对方,但应用层其实并不知道。而 req 命令会产生回调函数,这会应用层是知道的,从而实现特定的通讯逻辑。但是,这两种命令都会产生回包确保数据必达

应用层

  1. 在 HOST 层,我们知道数据是必达的,那么应用层数据还有讲的必要吗?很显然,是有必要的。因为很多从事应用开发的人会经常说,数据丢包数据丢包。其实,这个并不是丢包,而是你的数据包正确没有完整安全地送达到协议栈射频 FIFO 。这才导致了所谓的丢包。
  2. 如果应用层没有及时的处理资源不足(如内存不足)处理异常,短时间发送太多数据,导致对端设备接收端的缓冲区被填满,新的数据包被丢弃等行为将会导致数据不能成功的存储在射频 FIFO中,因此存在所谓的丢包问题。

总结

  1. 通过上面的分析,我们也将能够知道,为什么 BLE 设备厂商从来不宣传丢包率,而是宣传速率的问题了吧。
  2. 因为只要你程序写对了,数据完好无损的放入了射频FIFO中,数据就一定会到达对端设备。而空中的丢包,将会以速率的形式体现,因为你空中包丢包次数一多,那么数据就需要多次进行重传,那么最终拖慢传输速率。

参考

  1. 低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
  2. 《低功耗蓝牙开发权威指南》7.8.4 确认

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/429349.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【如何在 Windows 10 主机上通过 VMware 安装 Windows 11 虚拟机,并共享主机网络】

环境说明 主机操作系统:Windows 10虚拟机操作系统:Windows 11虚拟机软件:VMware 步骤一:确保主机(Windows 10)网络连接正常 启动网络加速软件:在主机上启动软件,确保主机可以正常访…

分布式锁优化之 防死锁 及 过期时间的原子性保证(优化之设置锁的过期时间)

文章目录 1、AlbumInfoApiController --》testLock()2、AlbumInfoServiceImpl --》testLock()3、问题:可能会释放其他服务器的锁。 在Redis中设置一个名为lock的键,值为111,并且只有在该键不存在时才设置(即获取锁)。同…

Mistral AI 又又又开源了闭源企业级模型——Mistral-Small-Instruct-2409

就在不久前,Mistral 公司在开源了 Pixtral 12B 视觉多模态大模型之后,又开源了自家的企业级小型模型 Mistral-Small-Instruct-2409 (22B),这是 Mistral AI 最新的企业级小型模型,是 Mistral Small v24.02 的…

【路径规划】自动泊车的 Simulink 模型

摘要 本文介绍了一个用于自主机器人路径规划和导航的 Simulink 模型,该模型结合了路径跟踪算法(如 Pure Pursuit)和动态机器人模型,实现了复杂环境中的路径跟随和导航控制。实验结果表明,模型能够在给定路径上精确控制…

QT快速安装使用指南

在Ubuntu 16.04上安装Qt可以通过多种方式进行。以下是使用Qt在线安装程序和apt包管理器的两种常见方法: 方法一:使用Qt在线安装程序 下载Qt在线安装程序 访问Qt官方网站:Try Qt | Develop Applications and Embedded Systems | Qt找到并下载…

初识ZYNQ——FPGA学习笔记15

一、ZYNQ简介 ZYNQ:Zynq-7000 All Programmable SoC(APSoC),赛灵思公司(AMD Xilinx)推出的新一代全可编程片上系统 PS:Processing System,处理系统 PL:Program Logic&…

Linux:路径末尾加/和不加/的区别

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 普通文件操作 首先说明这个问题只会出现在目录和符号链接中,因为如果想要索引普通文件但却在路径末尾加/则会出现错误,如例1所示。 # 例1 zhang…

Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料

选择123云盘作为存储介质的原因 原因1: zotero个人免费空间大小:300M,如果zotero云端也保存文献pdf资料则远远不够 原因2: 百度网盘同步文件空间大小:1G123云盘同步文件空间大小:10G 第一台电脑实施步骤…

Hadoop的一些高频面试题 --- hdfs、mapreduce以及yarn的面试题

文章目录 一、HDFS1、Hadoop的三大组成部分2、本地模式和伪分布模式的区别是什么3、什么是HDFS4、如何单独启动namenode5、hdfs的写入流程6、hdfs的读取流程7、hdfs为什么不能存储小文件8、secondaryNameNode的运行原理9、hadoop集群启动后离开安全模式的条件10、hdfs集群的开机…

如何导入一个Vue并成功运行

注意1:要确保自己已经成功创建了一个Vue项目,创建项目教程在如何创建Vue项目 注意2:以下操作均在VS Code,教程在VS Code安装教程 一、Vue项目导入VS Code 1.点击文件,然后点击将文件添加到工作区 2. 选择自己的vue项…

有女朋友后,怎么养成贤内助?为自己找个好伴侣,为孩子找个好妈妈,为母亲找个好儿媳

有女朋友后,怎么养成贤内助?为自己找个好伴侣,为孩子找个好妈妈,为母亲找个好儿媳 时代背景女生有点作怎么办?大商家族的爱情观 时代背景 一块钱的东西,赋予俩块钱的意义,三块钱卖出去。 用商…

企业急于采用人工智能,忽视了安全强化

对主要云提供商基础设施上托管的资产的安全分析显示,许多公司为了急于构建和部署 AI 应用程序而打开安全漏洞。常见的发现包括对 AI 相关服务使用默认且可能不安全的设置、部署易受攻击的 AI 软件包以及不遵循安全强化指南。 这项分析由 Orca Security 的研究人员进…

Python爬虫使用实例-umei

优美图库 www.umei.cc BV1Ag41137re 1/获取资源 查看网站资源结构 多页,每个item只有一张图 多页,每个item都是一个图集 最大页码 内外层图集均有若干page。 通过尾页按钮确定pageNum: 2/发送请求 response requests.get(urlurl, header…

蓝桥杯【物联网】零基础到国奖之路:十. OLED

蓝桥杯【物联网】零基础到国奖之路:十.OLED 第一节 硬件解读第二节 MDK配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fa7660b81be9407aa19c603561553db0.png)第三节 代码 第一节 硬件解读 OLED硬件知识: 第二节 MDK配置 第三节 代码 include头文件。 编…

Vue3 中组件传递 + css 变量的组合

文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件&#xff0c;根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件&#xff1a; <Arrow color"red" />子组件&#xff1a; <template><div class&…

VM-Ubantu中使用vscode头文件报错——解决办法

问题 系统中头文件明明存在但是却报错 解决方法 在报错的文件中点击&#xff0c;shift ctrl p选择Edit Configurations(JSON) 修改文件内容 原文件内容 修改之后的内容 {"configurations": [{"name": "Linux","includePath":…

https加密原理

以为http的数据都是以明文传送&#xff0c;会有很大的安全问题&#xff0c;所以出现的https协议。https就是在http协议的基础上增加了一个安全层&#xff0c;可以对数据进行加密和解密(例如SSL、TLS等)。 https加密解密的原理&#xff1a;证书非对称加密对称加密 在讲解原理前…

你了解system V的ipc底层如何设计的吗?消息队列互相通信的原理是什么呢?是否经常将信号量和信号混淆呢?——问题详解

前言&#xff1a;本节主要讲解消息队列&#xff0c; 信号量的相关知识。 ——博主主要是以能够理解为目的进行讲解&#xff0c; 所以对于接口的使用或者底层原理很少涉及。 主要的讲解思路就是先讨论消息队列的原理&#xff0c; 提一下接口。 然后讲解ipc的设计——这个设计一些…

QT打包--windeployqt执行,运行程序提示缺少库

执行windeployqt.exe D:\Data\code\QtCode\Release\RegularExp\RegularExp.exe 生成相应的dll动态库 执行RegularExp.exe&#xff0c;出错&#xff1a;“由于找不到libgcc_s_seh-1.dll…” 找到安装的qt对应的libgcc_s_seh-1.dll拷贝到RegularExp.exe同级目录下&#xff0c; 执…

Qt 窗口事件机制

在 Qt 开发中&#xff0c;窗口的关闭、隐藏、显示等事件是常见且重要的功能。不同的事件触发条件、处理方式不同&#xff0c;了解和掌握这些事件有助于我们更好地控制窗口行为。本文将详细讲解这些事件的使用方法&#xff0c;并通过代码实例来展示其应用。 1. done(int r) — 关…