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的睡眠时钟精度有关

可扫描通知 (ADV_SCAN_IND)

可扫描通知,是广播者发出的空中包,它会携带广播数据,同时也会响应其他设备的扫描请求,但与可连接非定向广播包不同的是,他不能响应其他设备的连接请求。

简而言之就是,可获取设备信息(广播数据和扫描响应中的数据),但不能被连接。

可扫描通知的payload部分如下图所示:

由上图可知,payload部分包含2个字段:

  • AdvA:广播者的设备地址
  • AdvData:广播数据

Header中的TxAdd为0表示AdvA是个公共地址,为1表示私有地址

posted @ 2021-04-30 10:26  浮生问道  阅读(2514)  评论(0编辑  收藏  举报