BLE广播信道空中包详解
广播信道空中包
在学习BLE的过程中,对于广播信道的空中包有许多混淆的地方,包括各个空中包的用途,帧格式等。现在想把他们做一个总结和归纳。
BLE广播信道中的空中包分为有以下几种:
- 可连接非定向广播 (ADV_IND)
- 可连接定向广播 (ADV_DIRECT_IND)
- 不可连接广播 (ADV_NONCONN_IND)
- 扫描请求 (SCAN_REQ)
- 扫描响应 (SCAN_RSP)
- 连接请求 (CONNECT_REQ)
- 可扫描指示 (ADV_SCAN_IND)
下面将分别详细介绍下这几种空中包。
空中包帧格式
之前的博文中有介绍BLE协议空中包的格式,所有空中包格式如下图所示:

广播信道空中包的PDU部分如下图所示:

Header部分如下图所示:

接下来将结合6中广播信道的空中包来解释帧格式中各个字段的意义
可连接非定向广播 (ADV_IND)
可连接非定向广播,是使用最为频繁的广播包,几乎所有提供了连接功能的BLE设备都使用这种空中包。
可连接的意思是,该设备提供了能与之建立链路层连接的功能;非定向的意思是,并非只有某个特定的设备才能与之建立连接。可连接非定向合起来的意思是,所有收到该广播的设备,都可与之建立链路层连接
接下来看一下这种广播包帧格式中的payload部分,如下图所示:

由上图可知,payload部分包含2个字段:AdvA和AdvData
- AdvA: Adv Address,它表示广播者的设备地址
- AdvData:广播数据,包括service data,service uuid以及manufacture data等等。
那么AdvA中的设备地址到底是公共设备地址还是私有设备地址呢?我们知道Header部分有一个字段TxAdd,占位1个bite。如果该比特为0,则表示AdvA是公共设备地址;如果该比特为1,则表示AdvA是私有设备地址
可连接定向广播 (ADV_DIRECT_IND)
可连接定向广播,是指明了对方设备地址的,为之提供了连接功能的广播包。简而言之就是,只有广播包中指定的那个设备才能与之建立链路层连接,其余设备的连接请求均被忽略。
帧格式中的payload部分,如下图所示:

由上图可知,payload部分包含2个字段:AdvA和InitA:
- AdvA:Adv Address,它表示广播者的设备地址
- InitA:表示接收者的设备地址,它指明了该广播包的接收者地址,也表示后续也只有该设备才能与之建立链路层连接
Header中的TxAdd字段表示AdvA地址是公共地址还是私有地址;RxAdd字段表示InitA地址是公共地址还是私有地址。相应的,如果为0表示公共地址;如果是1,则表示私有地址
不可连接广播 (ADV_NONCONN_IND)
不可连接广播,通常用于向周围的设备周期性的广播一些特定的信息,附近的任何设备都可以接收这种广播包,但不可与之建立连接。
例如,这种广播包可用于防丢器的应用场景,在一些容易丢弃的物件上内置BLE芯片,并周期性的广播不可连接广播包,手机扫描这种广播包,同时也会获得这种广播包的接收信号强度(RSSI),接收信号强度是与距离相关的,手机离设备远的时候,它的强度就弱,弱到一定程度手机就会发出报警声,表示物件已经离开手机很远了。
帧格式中的payload部分,如下图所示:

它的payload部分和可连接非定向广播包一模一样,只不过它是不可连接的。
扫描请求 (SCAN_REQ)
上面说到的那些广播包都是广播者发出的空中包,扫描请求是扫描者向指定的广播者发出的空中包,广播者收到扫描请求后,要立即回复扫描响应
扫描请求的payload部分如下图所示:

由上图可知,它包含2个字段:ScanA和AdvA:
- ScanA:Scanner Address, 表示扫描者的设备地址
- AdvA:广播者的设备地址
我们知道对于扫描请求来说,扫描者是发送方,广播者是接收方。所以Header中的TxAdd表示扫描者的设备地址类型,RxAdd表示广播者的设备地址类型,相应的,为0表示公共设备地址,为1表示私有设备地址
扫描响应 (SCAN_RSP)
扫描响应是广播者发出的空中包,它是作为对扫描请求的响应,其中会携带一些与广播者相关的数据,并返回给扫描者。
扫描响应的payload部分如下图所示:

由上图可知,它包含2个字段:AdvA和ScanRspData:
- AdvA:广播者的设备地址
- ScanRspData:Scanner Response Data,表示返回给扫描者的响应数据
对于扫描响应来说,广播者是发送方,扫描者是接收方。因而Header中的TxAdd表示AdvA的设备地址类型,0是公共地址,1是私有地址
值得注意的是,虽然扫描响应中并没有指定扫描者的设备地址,但也只有发出对应扫描请求的设备才能接收该扫描请求,其他设备会将其忽略。
连接请求 (CONNECT_REQ)
连接请求,既不是广播者发出的,也不是扫描者发出的。它是由发起者发出,并由广播者来接收,简而言之就是发起者向指定的广播者发起的一个连接请求。
发起者在发起连接请求之前,它必须先知道广播者的设备地址,那么它是如何知道对方地址的呢?一种方式就是通过扫描。我们知道广播者有2种可连接的广播包,分别是可连接非定向广播包和可连接定向广播包。那么当扫描者接收到其中一种可连接广播包的时候,它就知道对方的设备地址了,因而可以发起连接请求。如果是可连接定向广播包,前提是定向的是扫描者自己,那么才能发起连接请求。
连接请求的payload部分如下图所示:

由上图可知,payload部分包含3个字段:
- InitA: Initiator Address,发起者设备地址
- AdvA:广播者设备地址
- LLData:Link Layer Data,表示与链路层连接相关的连接参数
LLData的结构如下图所示:

LLData的内容比较复杂,下面简单介绍一下:
- AA:Access Address,访问地址
- CRCInit:用于CRC计算的一个初始值
- WinSize:transmitWindowSize,传输窗口的大小
- WinOffset:transmitWindowOffset,传输窗口的偏移量
- Interval:connInterval,简单理解就是一个睡眠唤醒周期的时间
- Latency:connSlaveLatency,表示Slave可以连续多长时间不用监听信道
- Timeout:connSuppervisionTimeout,设备双方约定这么长时间之后没有相互收到对方的包了,那么彼此可以认为连接已经丢失了,比如设备超出距离的情形
- Chm:Channel Map,后续连接中使用到和未使用到的数据信道
- Hop:跳频的跳数
- SCA:它和Master的睡眠时钟精度有关
BLE广播信道空中包详解的更多相关文章
- Spring jar包详解
Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...
- Spring——jar包详解(转)
Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...
- Spring 3.x jar 包详解 与 依赖关系
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- Spring 3.x jar 包详解 与 依赖关系(转)
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- 2.TCP_IP互联线缆_TCP_UDP报文抓包详解
TCP_IP互联线缆_TCP_UDP报文抓包详解 2.1网线标准 直通线 交叉线 异种设备互联使用直通线 同种设备互联使用交叉线 TCP和UDP 端口寻址 TCP数据格式 TCP三次握手 UDP数据格 ...
- 常见 jar包详解
常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...
- TCP通讯处理粘包详解
TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...
- easyui下载包详解
easyui包详解: 文件夹: demo--该目录下存放的是 EasyUI PC 版各插件的示例示例.如果不想在官网上查看演示,可以在该目录下找到相应的演示示例 demo-mobile--该目录下存放 ...
- spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途
Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...
随机推荐
- 从HashMap面试聊聊互联网内卷
微信公众号:大黄奔跑 关注我,可了解更多有趣的面试相关问题. 写在之前 毫无疑问,回想2020年有什么词出现在眼前最多的,无疑是"996"和"内卷",从马老师的 ...
- Charles 抓取https 包
1. Recording Settings中 include 添加 host , port端口为443 2. SSL Proxying Settings 选中 Enable SSL Proxyin ...
- 使用Spark加载数据到SQL Server列存储表
原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...
- 【秒懂音视频开发】05_Qt开发基础
控件的基本使用 为了更好地学习Qt控件的使用,建议创建项目时先不要生成ui文件. 打开mainwindow.cpp,在MainWindow的构造函数中编写界面的初始化代码. 窗口设置 MainWind ...
- JVM笔记 -- JVM的发展以及基于栈的指令集架构
2011年,JDK7发布,1.7u4中,开始启用新的垃圾回收器G1(但是不是默认). 2017年,发布JDK9,G1成为默认GC,代替CMS.(一般公司使用jdk8的时候,会通过参数,指定GC为G1) ...
- SpringBoot启动流程原理解析(二)
在上一章我们分析了SpingBoot启动流程中实例化SpingApplication的过程. return new SpringApplication(primarySources).run(args ...
- python之pillow模块学习--验证码的生成和破解
一.基础学习 在Python中,有一个优秀的图像处理框架,就是PIL库,pip install pillow 示例1 from PIL import Image # 读取当前图片 im = Image ...
- js【生成规定数量不重复随机数】、【冒泡排序】、【鸡尾酒排序】、【选择排序】、【插入排序】、【未完工的二分插入排序】------【总结】
[生成规定数量不重复随机数] function creatRandom( num ){ var randomLen = num, ranArr = [], thisRan = null, whileO ...
- [源码解析] 并行分布式框架 Celery 之 worker 启动 (1)
[源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 0x00 摘要 0x01 Celery的架 ...
- 如何使用Docker部署Go Web应用
目录 如何使用Docker部署Go Web应用 Docker部署示例 准备代码 创建Docker镜像 编写Dockerfile Dockerfile解析 From Env WORKDIR,COPY,R ...