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 确认

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 整合 Caffeine 实现本地缓存

目录 1、Caffeine 简介1.1、Caffeine 简介1.2、对比 Guava cache 的性能主要优化项1.3、常见的缓存淘汰算法1.4、SpringBoot 集成 Caffeine 两种方式 2、SpringBoot 集成 Caffeine 方式一2.1、缓存加载策略2.1.1、手动加载2.1.2、自动加载【Loading Cache】2.1.3、异步加载【As…

Jboss 低版本JMX Console未授权

漏洞描述 此漏洞主要是由于JBoss中/jmx-console/HtmlAdaptor路径对外开放,并且没有任何身份验证机制,导致攻击者可以进⼊到 jmx控制台,并在其中执⾏任何功能 影响范围 Jboss4.x以下 环境搭建 cd vulhub-master/jboss/CVE-2017-7504 doc…

Java笔试面试题AI答之单元测试JUnit(7)

文章目录 37. 请列举一些JUnit扩展 ?1. 参数化测试2. 条件测试执行3. 临时目录4. 时间测试5. 重复测试6. 前置/后置条件7. Mockito8. Spring Test9. JUnit Vintage10. Testcontainers11. 自定义注解和扩展12. 测试监听器(TestListener 和 RunListener&am…

WIFI路由器的套杆天线简谈

❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代,想必大家对其都不陌生。随着科技的发展,常用的路由器上的天线也越来越多,那么问题来了:天线越多,信号越好吗?路由器…

智谱清影 - CogVideoX-2b-部署与使用

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 体验地址:[丹摩DAMODEL官网](https://www.damodel.com/console/overview) CogVideoX 简介本篇将详细介绍使用丹摩服务器部…

Codeforces Round 974 (Div. 3)

比赛地址 : Dashboard - Codeforces Round 974 (Div. 3) - Codeforceshttps://codeforces.com/contest/2014 A 模拟 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); using namespace std;#define endl \n typedef long long …

Qt 模型视图(一):概述

文章目录 Qt 模型视图(一):概述1、模型/视图结构基本原理2、模型3、视图4、代理5、简单实例 Qt 模型视图(一):概述 ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视图组件显示模型中的数据&#xff0c;在视图组件里修改的数据会被自动…

MySQL练手题--体育馆的人流量(困难)

一、准备工作 Create table If Not Exists Stadium (id int, visit_date DATE NULL, people int); Truncate table Stadium; insert into Stadium (id, visit_date, people) values (1, 2017-01-01, 10); insert into Stadium (id, visit_date, people) values (2, 2017-01-02…

C++调用C# DLL之踩坑记录

C是非托管代码&#xff0c;C#则是托管代码&#xff0c;无法直接调用 CLR的介绍见CLR简介 MSDN提到了两种非托管-托管的交互技术&#xff1a;CLR Interop和COM Interop 后者要将C# 类库注册为COM组件&#xff0c;本文只探讨CLR&#xff0c;要通过C CLR写中间层代码 方式一&…

软件测试技术之 GPU 单元测试是什么!

1 背景 测试是开发的一个非常重要的方面&#xff0c;可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题&#xff0c;但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件&#xff0c;并确保代码按照预期的方式工作。单…

Cesium 绘制可编辑点

Cesium Point点 实现可编辑的pointEntity 实体 文章目录 Cesium Point点前言一、使用步骤二、使用方法二、具体实现1. 开始绘制2.绘制事件监听三、 完整代码前言 支持 鼠标按下 拖动修改点,释放修改完成。 一、使用步骤 1、点击 按钮 开始 绘制,单击地图 绘制完成 2、编辑…

java(3)数组的定义与使用

目录 1.前言 2.正文 2.1数组的概念 2.2数组的创建与初始化 2.2.1数组的创建 2.2.1数组的静态初始化 2.2.2数组的动态初始化 2.3数组是引用类型 2.3.1引用类型与基本类型区别 2.3.2认识NULL 2.4二维数组 2.5数组的基本运用 2.5.1数组的遍历 2.5.2数组转字符串 2.…

C#学习笔记(三)Visual Studio安装与使用

博主刚开始接触C#&#xff0c;本系列为学习记录&#xff0c;如有错误欢迎各位大佬指正&#xff01;期待互相交流&#xff01; 上一篇文章中安装了Visual Studio Code来编写调试C#程序&#xff0c;但是博主的目标是编写带窗口的应用程序&#xff0c;了解之后发现需要安装Visual …

基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图

目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spri…

局部凸空间及其在算子空间中的应用之四——归纳极限空间2

局部凸空间及其在算子空间中的应用之四——归纳极限空间2 前言一、归纳极限拓扑中极限的含义总结 数学的真理是绝对的&#xff0c;它超越了时间和空间。——约翰冯诺伊曼 前言 在上一篇文章中&#xff0c;我们讨论了归纳极限拓扑的概念和与连续线性算子有关的一个重要结论。认…

【Qt | QAction】Qt 的 QAction 类介绍

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

OSG开发笔记(三十):OSG加载动力学仿真K模型文件以及测试Demo

​ 若该文为原创文章&#xff0c;未经允许不得转载 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/142340138 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 长沙红胖子Q…

【STL】 set 与 multiset:基础、操作与应用

在 C 标准库中&#xff0c;set 和 multiset 是两个非常常见的关联容器&#xff0c;主要用于存储和管理具有一定规则的数据集合。本文将详细讲解如何使用这两个容器&#xff0c;并结合实例代码&#xff0c;分析其操作和特性。 0.基础操作概览 0.1.构造&#xff1a; set<T&…

解决nginx代理SSE接口的响应没有流式返回

目录 现象原来的nginx配置解决 现象 前后端分离的项目&#xff0c;前端访问被nginx反向代理的后端SSE接口&#xff0c;预期是流式返回&#xff0c;但经常是很久不响应&#xff0c;一响应全部结果一下子都返回了。查看后端项目的日志&#xff0c;响应其实是流式产生的。推测是n…

【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9&#xff09; 实验一 Lab: Reflected XSS into HTML context with nothing…