广播信道空中包

在学习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广播信道空中包详解的更多相关文章

  1. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  2. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...

  3. Spring 3.x jar 包详解 与 依赖关系

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  4. Spring 3.x jar 包详解 与 依赖关系(转)

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  5. 2.TCP_IP互联线缆_TCP_UDP报文抓包详解

    TCP_IP互联线缆_TCP_UDP报文抓包详解 2.1网线标准 直通线 交叉线 异种设备互联使用直通线 同种设备互联使用交叉线 TCP和UDP 端口寻址 TCP数据格式 TCP三次握手 UDP数据格 ...

  6. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

  7. TCP通讯处理粘包详解

    TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...

  8. easyui下载包详解

    easyui包详解: 文件夹: demo--该目录下存放的是 EasyUI PC 版各插件的示例示例.如果不想在官网上查看演示,可以在该目录下找到相应的演示示例 demo-mobile--该目录下存放 ...

  9. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

随机推荐

  1. python爬虫登录保持及对http总结

    [前言]这几天一直看python爬虫登录保持.实现接口太多,太乱,新手难免云山雾罩.各种get.post,深入理解一下,其实就是由于http的特性需要这些操作.http是一种无状态.不保存上次通信结果 ...

  2. go mod包管理 加代理下载

    原始go.mod文件 module xxx go 1.14 报错 i/o timeout go mod init workorder go mod init: go.mod already exist ...

  3. 关于Laravel框架中Guard的底层实现

    1. 什么是Guard 在Laravel/Lumen框架中,用户的登录/注册的认证基本都已经封装好了,开箱即用.而登录/注册认证的核心就是: 用户的注册信息存入数据库(登记) 从数据库中读取数据和用户 ...

  4. C++的标识符的作用域与可见性

    下面是关于C++的标识符的作用域与可见性学习记录,仅供参考 标识符的作用域与可见性 作用域是一个标识符在程序正文中有效的区域. 作用域分类 ①函数原型作用域 ②局部作用域(快作用域) ③类作用域 ④文 ...

  5. springboot注解之@Import @Conditional @ImportResource @ConfigurationProperties @EnableConfigurationProperties

    1.包结构 2.主程序类 1 @SpringBootApplication(scanBasePackages={"com.atguigu"}) 2 public class Mai ...

  6. 使用伪类(::before/::after)设置图标

    使用伪类(::before/::after)设置文本前后图标.减少标签的浪费,使页面更加整洁. 如图: <!DOCTYPE html> <html> <head> ...

  7. .zip爆破

    .zip爆破 Python的优化问题 Python在计算密集型任务方面没有明显的多线程优化,多线程更加适合用于处理I/O密集型任务(如网络请求).爆破任务使用顺序执行即可. 编写Python脚本 一个 ...

  8. Python读写配置文件模块--Configobj

    一.介绍 我们在项目的开发过程中应该会遇到这样的问题:我们的项目读取某个配置文件,然后才能按照配置的信息正常运行服务,当我们需要对修改服务的某些信息时,可以直接修改这个配置文件,重启服务即可,不用再去 ...

  9. 10、字典dict

    字典(dict) 字典是有序,键不重复,元素只能是键值对的可变的容器 dict = {'k1':'v1','k2':'v2'} 容器 元素必须键值对 键不重复,重复则会被覆盖 data = {'k1' ...

  10. python-递归函数和内置函数笔记汇总

    1. def syz(*args)    #    *args  参数组 不必填,不限制参数的个数    参数组不常用 2.def sys2(**kwargs): #关键字参数 3.递归函数,  不常 ...