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 ...
随机推荐
- MySQL如何搭建主库从库(Docker)
目录 MySQL主从搭建 一.主从配置原理 二.操作步骤 1.创建主库和从库容器 2.启动主从库容器 3.远程连接并操作主从库 4.测试主从同步 MySQL主从搭建 一.主从配置原理 mysql主从配 ...
- Kubernetes-3.安装
docker version:19.03.14 kubernetes version:1.19.4 本文介绍使用kubeadm安装Kubernetes集群的简单过程. 目录 使用kubeadm安装k8 ...
- 【秒懂音视频开发】05_Qt开发基础
控件的基本使用 为了更好地学习Qt控件的使用,建议创建项目时先不要生成ui文件. 打开mainwindow.cpp,在MainWindow的构造函数中编写界面的初始化代码. 窗口设置 MainWind ...
- 基于云原生DevOps服务自动化部署前端项目学习总结
本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...
- 统一Java环境变量配置,Java环境如何配置?
一 JDK下载和安装 Java开发工具包统一下载地址:https://www.hiai.top/archives/268.html 二 java环境变量配置 1.变量名:JAVA_HOME 变量值:你 ...
- redis集群(redis_cluster)
一.为什么要使用redis-cluster? 1.数据并发问题 2.数据量太大 新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集 ...
- Apache配置 8.配置防盗链
(1)介绍 防盗链,通俗讲,就是不让别人盗用你网站上的资源.这个资源,通常指的是图片.视频.歌曲.文档等. (2)配置 配置防盗链先编辑主机配置文件: #vim /usr/local/apache2. ...
- 如何使用python把json文件转换为csv文件
@ 目录 了解json整体格式 转换格式 提取key和value 使用pandas写入csv 了解json整体格式 这里有一段json格式的文件,存着全球陆地和海洋的每年异常气温(这里只选了一部分): ...
- 使用nodejs进行了简单的文件分卷工具
关键词:node fs readline generator (在这之前需要声明的是这篇博客的应用范围应该算是相当狭隘,写出来主要也就是给自己记录一下临时兴起写的一个小工具,仅从功能需求上来说我相信是 ...
- (二)SpringBoot启动过程的分析-环境信息准备
-- 以下内容均基于2.1.8.RELEASE版本 由上一篇SpringBoot基本启动过程的分析可以发现在run方法内部启动SpringBoot应用时采用多个步骤来实现,本文记录启动的第二个环节:环 ...