5.BLE---报文

1.报文种类

有两类报文:广播报文和数据报文

广播报文:发现连接其他设备。

数据报文:建立连接后开始使用数据报文。

2.报文通用数据包格式

无论是广播报文还是数据报文,链路层只使用一种数据包格式。

2.1 Preamble 前导

报文最开始的 8bits 是 01010101 或者 10101010 序列。
接收机可以用·它来配置自动增益控制,以及确定"0" 、 "1" 比特所使用的频率。

2.2 广播报文之Access Address
广播报文接入地址为: 0x8E89BED6

2.3 PDU 报文

PDU报文分为两种,广播报文与数据报文。(本章第3节,第4节 有详细介绍)。

2.4 CRC 校验

  • PDU被加密,然后在执行PDU加密之后计算CRC。
  • 24 位 CRC 校验可以检测所有奇数位错误,以及 2 位或 4 位错误。

生成多项式如下:

CRC=x24+x10+x9+x6+x4+x3+x1+x0

3.PDU 报文—广播报文

3.1 广播报文结构(PDU)

Header 结构:

3.2 广播报文之PDU Type

           

PDU类型

PDU格式(payload)

说明

Advertising

ADV_IND

AdvA(6 octets)
AdvData(0~31 octets)

connectable undirected advertising event,用于常规的广播,可携带不超过31bytes的广播数据,可被连接,可被扫描
AdvA,6bytes的广播者地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
AdvData,广播数据。

        

ADV_DIRECT_IND

AdvA(6 octets)
InitA(6 octets)

connectable directed advertising event,专门用于点对点连接,且已经知道双方的蓝牙地址不可携带广播数据,可被指定的设备连接,不可被扫描
AdvA,6bytes的广播者地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
InitA,6bytes的接收者(也是连接发起者)地址,并由PDU Header的RxAdd bit决定地址的类型(0 public,1 random)。

        

ADV_NONCONN_IND

AdvA(6 octets)
AdvData(0~31 octets)

和ADV_IND类似,但不可以被连接,不可以被扫描。

        

ADV_SCAN_IND

AdvA(6 octets)
AdvData(0~31 octets)

和ADV_IND类似,但不可以被连接,可以被扫描

Scanning

SCAN_REQ

ScanA(6 octets)
AdvA(6 octets)

当接收到ADV_IND或者ADV_SCAN_IND类型的广播数据的时候,可以通过该PDU,请求广播者广播更多的信息
ScanA,6bytes的本机地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
AdvA,6b 地址,并由PDU Header的RxAdd bit决定地址的类型(0 public,1 random)。

        

SCAN_RSP

AdvA(6 octets)
ScanRspData(0~31 octets)

广播者收到SCAN_REQ请求后,通过该PDU响应,把更多的数据传送给接受者
AdvA,6bytes的广播者地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
ScanRspData,scan的应答数据。

Initiating

CONNECT_REQ

InitA (6 octets)
AdvA (6 octets)
LLData (22 octets)

当接收到ADV_IND或者ADV_DIRECT_IND类型的广播数据的时候,可以通过该PDU,请求和对方建立连接:
InitA,6bytes的本机地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
AdvA,6bytes的广播者地址,并由PDU Header的RxAdd bit决定地址的类型(0 public,1 random);
LLData,BLE连接有关的参数信息,具体请参考本文第5小节。

             

4.PDU 报文—数据报文

4.1 数据报文结构

对于 Data PDU 而言,其 Length 取值范围为 0~255(单位 byte), Data 部分的结构与 Header字段( Advertising PDU Type)相关,如下图所示

     

4.2 Data PDU Header

Data PDU Header由以下 6 部分组成,

  • LLID2bit,指示了该 PDU 的类型,
  • NESN1bit, 指示 ACK/NACK 信息,详见 63.3小节
  • SN1 bit, 指示该 PDU 为新传还是重传,详见 第6章3.3小节
  • MD1 bit,指示发送 PDU BLE 终端是否还有数据需要发送
  • Rsv3 bit,保留位
  • Length8bit,指示 PDU Data 部分的长度

4.2.1 LLID

Header中的LLID=01b时

这种类型的PDU,要么是一个未传输完成L2CAP message(长度超过255,被拆包,此时不是第一个),要么是一个空包(Header中的Length为0)。

Header中的LLID=10b时

这种类型的PDU,要么是L2CAP message的第一个包,要么是不需要拆包的完整的L2CAP message,无论哪种情况,Header中的Length均不能为0。

Header中的LLID=11b时

表示这个数据包是用于控制、管理LL连接的LL control PDU。(详细介绍在本章第7小结)

           

5. LLData

当接收到ADV_IND或者ADV_DIRECT_IND类型的广播数据的时候,可以通过该PDU(包含LLData),请求和对方建立连接。LLData在本文3.2章节CONNECT_REQ类型介绍中被提及,主要包含BLE连接有关的参数信息。

           

5.1 AA (4 octets)

AA字段应包含链路层连接的访问地址。(详细介绍参考本文第6章节)

5.2 CRCInit (3 octets)

  • CRCInit字段应包含链路层连接的CRC计算的初始化值, 它应该是由链路层生成的随机值。
  • 对于每个数据通道PDU,移位寄存器应预设为链路层连接设置的CRC初始化值。
  • 对于每个广告信道PDU,移位寄存器应预设为0x555555。
  • 数据发送时,从位置23发送到位置0。

5.3 WinSize (1 octet)

  • 全称是transmitWindowSize和transmitWindowOffset,用于决定连接双方收发数据的时间窗口。
  • WinSize,即传输窗口信息,用于指示transmitWindowSize取值。
  • transmitWindowSize =WinSize * 1.25 ms
  • transmitWindowSize用途在第6章有详细介绍。

5.4 WinOffset (2 octets)

  • 即 传 输 窗 口 偏 移 信 息 , 用 于 指 示 transmitWindowOffset 取 值 ,transmitWindowOffset = WinOffset*1.25ms
  • WinOffset用途在第6章有详细介绍。

5.5 Interval (2 octets)

  1. 两个设备在切换信道后发送和接收数据称为一个连接事件。
  2. 尽管没有应用数据被发送和接收,两个设备仍旧会交换链路层数据(空包 EmptyPDU)来维持连接。
  3. 这个连接间隔就是指在一个连接事件(Connectionevents)的开始到下一个连接事件(Connectionevents)的开始的时间间隔。
  4. 连接间隔以1.25ms为单元,连接间隔的范围是6~3200既7.5ms~4s之间。
  • Interval,即 ConnInterval 信息, ConnInterval= Interval *1.25ms
  • ConnInterval 在第1章和第6章均有介绍
  1. Latency (2 octets)

  1. 允许Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件(Connectionevents)
  2. 在这些连接事件(Connectionevents)中不必回复Master(主设备)的包,这样就能更加省电。
  3. 范围可以是0 ~ 499
  4. SlaveLatency=OFF也就是SlaveLatency为0时,Master发包,Slave必须回复,如果不回复,Master就会认为Slave那边接收不正常
  5. SlaveLatency=ON也就是SlaveLatency不为0的时候,图中SlaveLatency为3。Master发包,Slave没有数据要回复的时候,就会忽略3个连接事件,在第4个连接事件接收到Master发送的数据之后,回复Master。
  6. 如果Slave有数据要发送就会唤醒,也就是说即使SlaveLatency为3,但是在Master发第二包的时候Slave有数据要回复,这个时候就会立即回复Master而不是等到3个连接事件之后的第4个连接事件去回复。
  • Latency,即 connSlaveLatency 信息, connSlaveLatency = Latency
  • 在第1章和第6章均有介绍

5.7 Timeout (2 octets)

  •  这个参数设定了一个超时时间,如果BLE在这个时间内没有发生通信的话,就会自动断开。
  • 单位是10ms,该变量的范围是10 ~ 3200,折算成时间范围是100ms ~ 32s。
  • SupervisionTimeout >(1+slaveLatency)*(connectionInterval)
  • 在第1章和有介绍

5.8 ChM (5 octets)

  • ChM的全称是Channel map,用于标识当前使用和未使用的Physical Channel。Hop的全称是hopIncrement,它和ChM一起决定了数据传输过程中的跳频算法。
  • 建立连接后有哪些channel是可以被使用的,有哪些channel是不可用的。
  • 具体用法参考第7章跳频原理。

5.9 Hop (5 bits)

  • hop表示跳数,表示跳频每次的跳频的间隔。
  • 具体用法参考第7章跳频原理。

5.10 SCA (3 bits)

  • SCA,即 Master 的时钟精度信息 masterSCA,由 Master 自身时钟性能确定,取值范围 0~7
  • 具体用法参考第6章2.3 小结 误差的考虑。     

6. Access Address

6.1 设计目的

避免同一频道下不同设备下的干扰。

6.2 Access Address说明

  • Access Address放在封包中。用于识别该physical channel下向哪一个设备发packet,这样某时刻工作在同一physical channel的设备就不至于packet混乱。
  • 从封包的Link Layer info能够看到每一个封包的确都有一个Access Address,Adv_pkt有一个固定Access Address(详见本文2.2章节)。而intiator发con_req时会包括一个con_Access_Addr(包含在本章5.1 AA 中)。连接之后的data pkt都是用的这个新的Access Addr了。
  • 每次又一次断开建立连接,Access Address会不一样。

6.3 con_Access_Addr

  • 任何两个设备间的con_Access_Addr都应该是不同的。
  • 该地址在设备启动状态下随机生成(32bit)。
  • 在con_req时第一次使用(包含在本章5.1 AA 中),之后所有的数据包都用这个地址。

6.4 Access Address遵循规则

数据报文接入地址为: 32bits 随机数

数据报文规则:

  • 不能出现 6 个连续的"0" 或"1" ;
  • 不等于 0x8E89BED6;
  • 与"0x8E89BED6" 不能只有一位不同
  • 4 个字节不能相等;
  • 不能有超过 24次比特翻转;
  • 最后 6 比特至少有 2 次比特翻转。

符合规则的大概有 231 个。

7.LL control PDU

7.1 LL control PDU简介

Header中的LLID=11b时(见本章4.2.1),表示这个数据包是用于控制、管理LL连接的LL control PDU。LL control PDU的payload的格式如下:

7.2 LL control PDU结构

数据报文结构:

    Header中的LLID=11b时LL control PDU的payload的格式如下:

 

     

7.3 控制帧类型列表

         

操作码

控制帧名称

解释

0x00 

LL_CONNECTION_UPDATE_REQ 

更新连接参数

0x01 

LL_CHANNEL_MAP_REQ 

设置跳频范围(37、38、39保留)

0x02 

LL_TERMINATE_IND 

指示连接中断的原因

0x03 

LL_ENC_REQ 

加密请求

0x04 

LL_ENC_RSP 

加密回复

0x05 

LL_START_ENC_REQ 

加密请求

0x06 

LL_START_ENC_RSP 

加密回复

0x07 

LL_UNKNOWN_RSP 

未知操作码指示

0x08 

LL_FEATURE_REQ 

请求支持的特性

0x09 

LL_FEATURE_RSP 

回复支持的特性

0x0A 

LL_PAUSE_ENC_REQ 

暂停加密请求

0x0B 

LL_PAUSE_ENC_RSP 

暂停加密回复

0x0C 

LL_VERSION_IND

指示controller版本和公司信息

0x0D 

LL_REJECT_IND 

拒绝控制命令指示

0x0E 

LL_SLAVE_FEATURE_REQ 

NA 

0x0F 

LL_CONNECTION_PARAM_REQ 

连接参数请求

0x10 

LL_CONNECTION_PARAM_RSP 

连接参数回复

0x11 

LL_REJECT_IND_EXT 

扩展拒绝控制命令指示

0x12 

LL_PING_REQ 

简单通讯,验证通讯

0x13 

LL_PING_RSP 

简单通讯,验证通讯

0x14 

LL_LENGTH_REQ

请求发送接收的字节和交互时间(27~251bytes、328~2120ms)

0x15 

LL_LENGTH_RSP 

0x16 

LL_PHY_REQ 

指定发送接收方的PHY类型

0x17 

LL_PHY_RSP 

指定发送接收方的PHY类型

0x18 

LL_PHY_UPDATE_IND 

Master和slave的PHY类型

0x19 

LL_MIN_USED_CHANNELS_IND 

设置使用的LE PHY类型和信道

0x1A~FF 

Reserved for Future Use 

保留未来使用

7.4 LL_CONNECTION_UPDATE_REQ 更新连接参数

 

  • 前5个参数说明参考本章5.2
  • Instant: 指示新参数生效的 connEventCount
  • Instant具体用法参考第6章3.2小结。

7.5 LL_CHANNEL_MAP_REQ 设置跳频范围(37、38、39保留)

  • Chm 可用频道映射表,具体用法参考第7章跳频原理。
  • Instant: 指示新参数生效的 connEventCount。     
  • Instant具体用法参考第6章3.2小结。

7.6 LL_TERMINATE_IND 指示连接中断的原因

  • 具体参考第八章

7.7 LL_ENC_REQ 加密请求

  • Rand,由 Master Host 提供的随机数, Encryption 使用。
  • EDIVEDIV 值, Encryption 使用。
  • IVmMaster 使用的 IVm值, Encryption 使用
  • 在加密会话设置期间,主设备在配对期间将从设备分发的16位加密分集器值EDIV和64位随机数Rand发送到从设备。 主机的Host为链路层提供在设置加密会话时使用的长期密钥。 从机的Host接收EDIV和Rand值,并为从属链路层提供长期密钥,以便在设置加密链路时使用。 当两个设备都支持LE Secure Connections时,EDIV和Rand设置为零。 详细参考11章

7.8 LL_ENC_RSP 加密回复

  • SKDsSlave 使用的 SKD 值, Encryption 使用
  • IVsSlave 使用的 IV 值, Encryption 使用

7.9 LL_START_ENC_REQ/LL_START_ENC_RSP 加密请求/回复

The LL_START_ENC_REQ PDU does not have a CtrData field.
The LL_START_ENC_RSP PDU does not have a CtrData field

7.10 LL_UNKNOWN_RSP未知操作码指示

 

 UnknownType应包含接收到的LL控制PDU的操作码字段值。

7.11 LL_FEATURE_REQ/ LL_FEATURE_RSP 请求/回复支持的特性

 

 FeatureSet应包含主链路层支持的功能集。

7.12 LL_PAUSE_ENC_REQ/ LL_PAUSE_ENC_RSP 暂停加密请求/回复

 The LL_PAUSE_ENC_REQ packet does not have a CtrData field

7.13 LL_VERSION_IND 指示controller版本和公司信息

  • VerNr, Controller 对应的协议版本
  • CompId,制造该 BLE 终端的公司 ID
  • SubVersNr,该 BLE 终端的 Controller 版本号

7.14 LL_REJECT_IND 拒绝控制命令指示

7.15 LL_SLAVE_FEATURE_REQ 拒绝控制命令指示

FeatureSet应包含从机链路层支持的功能集

7.16 LL_CONNECTION_PARAM_REQ/ LL_CONNECTION_PARAM_RSP 连接参数请求/回复

  • Interval_Min:指示 connInterval 的最小值, connIntervalmin= Interval_Min*1.25ms
  • Interval_Max:指示 connInterval 的最大值, connIntervalmax= Interval_Max*1.25ms
  • PreferredPeriodicity : 指 示 期 望 的 connInterval 集 合 ,{connInterval}={ PreferredPeriodicity *k}
  • ReferenceConnEventCount:与 Offset0~5 一起指示新参数生效的时间点,取值范围 0~65535
  • Offset0~5:与 ReferenceConnEventCount 起指示新参数生效的时间点即可,单位为 1.25ms,从 Offset0 到 Offset5 优先级依次降低,取值范围 0~65535,取值 65535 表 示无效值
  • 其他字段:与 2.3.3.1 小节中的 LLData 一致。

   

7.17 LL_REJECT_IND_EXT 扩展拒绝命令指示

  • RejectOpcode应包含被拒绝的LL控制PDU的操作码字段值。
  • 错误代码应包含LL控制PDU被拒绝的原因。
  • 仅当远程链路层支持扩展拒绝指示链路层功能时,才会发出此PDU。 否则,应发出LL_REJECT_IND PDU。

7.18 LL_PING_REQ/ LL_PING_RSP

  • 支持时的LE Ping过程可以在链路层使用,以验证远程链路层的存在。
  • 该过程还可用于通过强制远程设备发送包含有效MIC的LE ACL数据包来验证LE ACL逻辑传输上的消息完整性。
  • 通过发送LL_PING_REQ PDU进入连接状态后,主链路层或从链路层可以随时启动此过程。
  • 响应的链路层以LL_PING_RSP PDU响应。
  • 发起链路层可以是主设备或从设备。

7.19 LL_LENGTH_REQ / LL_LENGTH_RSP 发送接收的字节和交互时间

  • MaxRxOctets,发送该 PDU 的 BLE 终端支持的最大接收 PDU 长度,单位 byte
  • MaxRxTime,发送该 PDU 的 BLE 终端支持的最大接收 PDU 次数(初传和重传次 数总和)
  • MaxTxOctets,发送该 PDU 的 BLE 终端支持的最大发送 PDU 长度,单位 byte
  • MaxTxTime,发送该 PDU 的 BLE 终端支持的最大发送 PDU 次数(初传和重传次 数总和),单位 byte
  • 参数范围27~251bytes、328~2120ms

   

   

   

   

   

   

   

   

   

  

原文地址:https://www.cnblogs.com/yuqilihualuo/p/9549946.html