广播信道空中包

在学习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. Jump Server在docker中安装部署

    安装部署: 1.准备机器: 官方环境要求: 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低) 操作系统: Linux 发行版 x86_64 Python = 3.6.x Mysql S ...

  2. MySQL确认注入点

    目录 WHERE子句后面的注入点 逻辑符号AND.OR other order by union limit table WEB渗透测试流程中,初期工作是进行信息收集,完成信息收集之后,就会进行漏洞测 ...

  3. Zeebe服务学习2-状态机

    1.什么是状态机? 第一次接触到这个名词,感觉自己是明白这个东东是啥的,但是后来发现,emm-,是的,只是理解了这个词而已. 贴一下官方介绍: 有限状态机,(英语:Finite-state machi ...

  4. Linux下找出吃内存的方法总结

    Linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」. 现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种 ...

  5. Python开发环境从零搭建-03-安装Python解释器并配置

    想要从零开始搭建一个Python的开发环境说容易也容易 说难也能难倒一片开发人员,在接下来的一系列视频中,会详细的讲解如何一步步搭建python的开发环境 本文章是搭建环境的第3篇 讲解的内容是:安装 ...

  6. MyBatis(八):MyBatis插件机制详解

    MyBatis插件插件机制简介 ​ MyBatis插件其实就是为使用者提供的自行拓展拦截器,主要是为了可以更好的满足业务需要. ​ 在MyBatis中提供了四大核心组件对数据库进行处理,分别是Exec ...

  7. Flutter 改善套娃地狱问题(仿喜马拉雅PC页面举例)

    前言 这篇文章是我一直以来很想写的一篇文章,终于下定决心动笔了. 写Flutter的小伙伴可能都感受到了:掘金的一些热门的Flutter文章下,知乎的一些Flutter的话题下或者一些论坛里面,喷Fl ...

  8. salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容

    本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader https://github.com/SheetJS/sheetjs ...

  9. python之模块与类库

    什么是模块 模块是一组类,函数,方法所组成的.这些类都储存在文本文件中..py是python程序代码中的扩展名,模块可能是c或者python写的.模块的扩展名可以是.py或者是.pyc(经过编译的.p ...

  10. 【ZeyFraのJavaEE开发小知识05】Mybatis-Plus & Axios

    关于如何在Mybatis-Plus中添加SQL拦截器 之前ZeyFra在MyBatis-Plus[踩坑记录01]一文中提到过,使用Mybatis-Plus时最好使用MybatisSqlSessionF ...