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) | connectable undirected advertising event,用于常规的广播,可携带不超过31bytes的广播数据,可被连接,可被扫描: |
| ADV_DIRECT_IND | AdvA(6 octets) | connectable directed advertising event,专门用于点对点连接,且已经知道双方的蓝牙地址,不可携带广播数据,可被指定的设备连接,不可被扫描: |
| ADV_NONCONN_IND | AdvA(6 octets) | 和ADV_IND类似,但不可以被连接,不可以被扫描。 |
| ADV_SCAN_IND | AdvA(6 octets) | 和ADV_IND类似,但不可以被连接,可以被扫描。 |
Scanning | SCAN_REQ | ScanA(6 octets) | 当接收到ADV_IND或者ADV_SCAN_IND类型的广播数据的时候,可以通过该PDU,请求广播者广播更多的信息: |
| SCAN_RSP | AdvA(6 octets) | 广播者收到SCAN_REQ请求后,通过该PDU响应,把更多的数据传送给接受者。 |
Initiating | CONNECT_REQ | InitA (6 octets) | 当接收到ADV_IND或者ADV_DIRECT_IND类型的广播数据的时候,可以通过该PDU,请求和对方建立连接:
|
4.PDU 报文—数据报文
4.1 数据报文结构
对于 Data PDU 而言,其 Length 取值范围为 0~255(单位 byte), Data 部分的结构与 Header字段( Advertising PDU Type)相关,如下图所示
4.2 Data PDU Header
Data PDU Header由以下 6 部分组成,
- LLID, 2bit,指示了该 PDU 的类型,
- NESN, 1bit, 指示 ACK/NACK 信息,详见 第6章3.3小节
- SN, 1 bit, 指示该 PDU 为新传还是重传,详见 第6章3.3小节
- MD, 1 bit,指示发送 PDU 的 BLE 终端是否还有数据需要发送
- Rsv, 3 bit,保留位
- Length, 8bit,指示 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)
- 两个设备在切换信道后发送和接收数据称为一个连接事件。
- 尽管没有应用数据被发送和接收,两个设备仍旧会交换链路层数据(空包 EmptyPDU)来维持连接。
- 这个连接间隔就是指在一个连接事件(Connectionevents)的开始到下一个连接事件(Connectionevents)的开始的时间间隔。
- 连接间隔以1.25ms为单元,连接间隔的范围是6~3200既7.5ms~4s之间。
- Interval,即 ConnInterval 信息, ConnInterval= Interval *1.25ms。
- ConnInterval 在第1章和第6章均有介绍
Latency (2 octets)
- 允许Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件(Connectionevents)
- 在这些连接事件(Connectionevents)中不必回复Master(主设备)的包,这样就能更加省电。
- 范围可以是0 ~ 499
- SlaveLatency=OFF也就是SlaveLatency为0时,Master发包,Slave必须回复,如果不回复,Master就会认为Slave那边接收不正常
- SlaveLatency=ON也就是SlaveLatency不为0的时候,图中SlaveLatency为3。Master发包,Slave没有数据要回复的时候,就会忽略3个连接事件,在第4个连接事件接收到Master发送的数据之后,回复Master。
- 如果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 使用。
- EDIV, EDIV 值, Encryption 使用。
- IVm, Master 使用的 IVm值, Encryption 使用
- 在加密会话设置期间,主设备在配对期间将从设备分发的16位加密分集器值EDIV和64位随机数Rand发送到从设备。 主机的Host为链路层提供在设置加密会话时使用的长期密钥。 从机的Host接收EDIV和Rand值,并为从属链路层提供长期密钥,以便在设置加密链路时使用。 当两个设备都支持LE Secure Connections时,EDIV和Rand设置为零。 详细参考11章
7.8 LL_ENC_RSP 加密回复
- SKDs, Slave 使用的 SKD 值, Encryption 使用
- IVs, Slave 使用的 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