文章目录
- 一、ble 空口包简介
- 二、Uncoded PHY 包格式(LE 1M 或 LE 2M PHY)
- 三、Coded PHY 包格式(LE 1M PHY)
- 四、Advertising Channels PDU
- 五、Date Channels PDU
- 1. Header
- 2. Payload
- a. LL Data PDU
- b. LL Control PDU
- i. 0x00 - LL_CONNECTION_UPDATE_IND
- ii. 0x01 - LL_CHANNEL_MAP_IND
- iii. 0x02 - LL_TERMINATE_IND
- iv. 0x03 - LL_ENC_REQ
- 0x04 - LL_ENC_RSP
- 0x05 - LL_START_ENC_REQ
- 0x06 - LL_START_ENC_RSP
- 0x0A - LL_PAUSE_ENC_REQ
- 0x0B - LL_PAUSE_ENC_RSP
- v. 0x07 - LL_UNKNOWN_RSP
- vi. 0x08 - LL_FEATURE_REQ
- 0x09 - LL_FEATURE_RSP
- 0x0E - LL_PERIPHERAL_FEATURE_REQ
- vii. 0x0C - LL_VERSION_IND
- viii. 0x0D - LL_REJECT_IND
- 0x11 - LL_REJECT_EXT_IND
- ix. 0x0F - LL_CONNECTION_PARAM_REQ
- 0x10 - LL_CONNECTION_PARAM_RSP
- x. 0x14 - LL_LENGTH_REQ
- 0x15 - LL_LENGTH_RSP
- xi. 0x16 - LL_PHY_REQ
- 0x17 - LL_PHY_RSP
- 0x18 - LL_PHY_UPDATE_IND
- xii. 0x19 - LL_MIN_USED_CHANNELS_IND
- 3. MIC
一、ble 空口包简介
BLE 工作在非授权的 2.4 GHz ISM 频段,采用跳频的方式来对抗干扰和衰落,定义了两种调制方式:
- 强制调制方式:使用整形的二进制频率调制来最小化收发器的复杂性,符号率为 1 Msym/s,是设备必须支持的,支持两种 PHY:
- LE 1M:Uncoded PHY,数据传输率为 1 Mb/s
- LE Coded:Coded PHY,Access Address、Coding Indicator、TERM1 数据传输率为 125 kb/s(S=8 coding),Payload 数据传输率为 125 kb/s(S=8 coding) 或 500 kb/s(S=2 coding),由于引入了 FEC 编解码以及 Pattern Mapper 和 Demapper,虽然增加了接收机复杂度降低了传输速率,但使得蓝牙设备能更远距离的传输数据,从而更好地适应物联网应用
- 可选调制方式:与强制调制方式类似,符号率为 2 Msym/s,是设备可选支持的,只支持一种 PHY:
- LE 2M,Uncoded PHY,数据传输率为 2 Mb/s
二、Uncoded PHY 包格式(LE 1M 或 LE 2M PHY)
1. Preamble
前导部分,是最先传输的部分,用于接收方进行频率同步,符号时序评估和自动增益控制训练,如果在 LE 1M PHY 上传输数据包长度为 1B,在LE 2M PHY 上传输数据长度为 2B
Preamble 是 1010 或者 0101 的序列,根据 Access Address 的 LSB 来决定,LSB 是1,则前导是 1010,否则是 0101
2. Access Address
接入地址,空口包中标识设备身份,根据 Access Address 的不同,空口包分为两种类型:
- advertising channels PDU:固定为 0x8E89BED6,ADV_IND, SCAN_REQ, SCAN_RESP, CONNECT_IND 只能在 37/38/39 信道上传输
- date channels PDU:一个 32bit 的随机值,只在其余37个数据信道上传输,是连接成功后两设备用于数据收发的
3. PDU
空口包数据部分,长度 2 - 258 字节,包括 advertising channels PDU 和 date channels PDU
4. CRC
包含 PDU 域的 CRC 24 的数据
5. Constant Tone Extension
这个域是 BLE 5.1 新增的,最主要的功能是 AoA/AoD (蓝牙定位)的应用,是一个可选的数据项
三、Coded PHY 包格式(LE 1M PHY)
-
preamble
不编码,共 80 bits,(重复 10 次 00111100 ) -
CI(Coding Indicator)
-
PDU
同 Uncoded PHY,因 CI/TERM1/TERM2 占用了 1 个字节,其长度 2 - 257 字节
四、Advertising Channels PDU
使用广播信道的包有多种,如 ADV_IND, SCAN_REQ, SCAN_RESP, CONNECT_IND, 其 AA 为特定值 0x8E89BED6,PDU 包括 Header 和 Payload
1. Header
a. PDU Type
b. ChSel
- 0 - 设备不支持信道选择算法2
- 1 - 设备支持信道选择算法2
c. TxAdd
- 0 - 设备地址是 public 类型
- 1 - 设备地址是 random 类型
d. RxAdd
- 0 - 对端设备地址是 public 类型
- 1 - 对端设备地址是 random 类型
e. Length
后面 Payload 的长度,1 - 255 字节
2. Payload
a. Advertising PDU
i. ADV_IND
可连接的,可扫描的,不定向的广播包,是经典和常用的广播包
可连接:其它设备可以发送 CONNECT_IND
可扫描:其它设备可以发送 SCAN_REQ,本设备也会回复 SCAN_RSP
- AdvA:本机即广播者设备地址,由 header 中的 TxAdd 指示类型
- AdvData:广播数据,0 - 31 字节,可由本机即广播者 Host 设置
ii. ADV_DIRECT_IND
可连接的,不可扫描的,定向的广播包
定向的:广播包是专门给某个指定设备用的,所以携带了对端的设备地址,因此也不再需要携带广播数据
- AdvA:本机即广播者设备地址,由 header 中的 TxAdd 指示类型
- TargetA:对端设备地址,由 header 中的 RxAdd 指示类型
iii. ADV_NONCONN_IND
不可连接,不可扫描,不定向的广播包,没有实际作用,只是在向空口发广播包
- AdvA:本机即广播者设备地址,由 header 中的 TxAdd 指示类型
- AdvData:广播数据,0 - 31 字节,可由本机即广播者 Host 设置
iv. ADV_SCAN_IND
不可连接,只可扫描,不定向的广播包
- AdvA:本机即广播者设备地址,由 header 中的 TxAdd 指示类型
- AdvData:广播数据,0 - 31 字节,可由本机即广播者 Host 设置
b. Scanning PDU
i. SCAN_REQ
当扫描设备收到可扫描的广播包后,扫描设备可发送 SCAN_REQ(active scanning 会发起扫描请求,passive scan 只接收广播包不会发送扫描请求)
- ScanA:本机即扫描者设备地址,由 header 中的 TxAdd 指示类型
- AdvA:对端设备即广播者设备地址,由 header 中的 RxAdd 指示类型
ii. SCAN_RSP
广播设备收到 SCAN_REQ,则发送扫描响应 SCAN_RSP
- AdvA:本机即广播者设备地址,由 header 中的 TxAdd 指示类型
- ScanRspData:扫描响应数据,0 - 31 字节,可由本机即广播者 Host 设置
c. Initiating PDU
i. CONNECT_IND
Initiating state 设备可以向 Advertising state 设备即广播者发送 CONNECT_IND,然后进入连接态,成为 Central,广播设备成为 Perpheral
-
InitA:本机即发起连接的设备地址,由 header 中的 TxAdd 指示类型
-
AdvA:对端设备即广播者设备地址,由 header 中的 RxAdd 指示类型
-
LLData:建立连接的链路信息
- AA:ACL 连接的 Access Address,由 Master 生成,是一个随机数
- CRCInit:ACL 连接的 CRC 计算初始值,由 Master 生成,是一个随机数
- WinSize:用于计算 transmitWindowSize(WinSize * 1.25 ms)
- WinOffset:用于计算 transmitWindowOffset(WinOffset * 1.25 ms)
- Interval:用于计算 connInterval(Interval * 1.25 ms)
- Latency:用于计算 connPeripheralLatency(Latency)
- Timeout:用于计算 connSupervisionTimeout(Timeout * 10 ms)
- ChM:Channel Map,表示哪些 date channels(0 - 36)可用,bit 置 1 - 可用,bit 置 0 - 不可用
- Hop:hopIncrement,取值 5 - 16,为了连接的稳定性,双方需要不断的切换信道进行跳频,下一次交互选择哪个信道是由算法决定的,hopIncrement 即是算法的参数
- SCA:centralSCA,表示 Central 的时钟精度
五、Date Channels PDU
1. Header
- LLID : 指示后面 payload 是数据面的还是控制面的,0b01 - 数据面,L2CAP后续分包,0b10 - 数据面,L2CAP 起始分包,0b11 - 控制面
- NESN:下一个期望的对端包的 Sequence Number
- SN:当前包的 Sequence Number,与 NESN 一起决定了数据包是否传输 OK,进行重传和流控处理
- MD:More Data,表示后面是否跟有更多的数据,有了这个 MD 对端才会打开接收窗口继续接收数据
- CP:CTEInfo Present,1 - 表示 PDU header 有 CTEInfo,packet 有 Constant Tone Extension,0 - 表示没有
- Length:Playload + MIC 数据长度,0 - 255(payload:0 - 251,MIC:4)
- CTEInfo:packet 中 Constant Tone Extension 的类型和长度
2. Payload
a. LL Data PDU
数据面数据包,Header LLID 是 0b01 或 0b10,整个 Payload 都是上层 L2CAP 数据
由于空口包中 Payload 最大长度为 251,由此计算 ATT_MTU 最大值为 247(251 - L2CAP Header(4))
由 LE_Read_Buffer_Size 返回的 Link Layer acl buffer 大小为 251,由此计算 ATT_MTU 最大值为 247(251 - L2CAP Header(4))
因此,最终 ATT_MTU 值应该为 min(Payload - 4, acl_buffer_size - 4),即两者的较小值
b. LL Control PDU
控制面数据包,Header LLID 是 0b11。当 Connection 建立完成后,很多参数都固定下来了,如 transmitWindowSize,transmitWindowOffset,connInterval,connPeripheralLatency,connSupervisionTimeout 等,如何更改这些连接的参数呢,或者如何获取对端设备的一些信息呢?
控制面包就是用于连接建立后进行数据交互的,此时 Payload 由 Opcode 和 CtrData 构成
i. 0x00 - LL_CONNECTION_UPDATE_IND
更新已建立的连接的参数,各字段值与 CONNECT_IND 中 LLDate 意义相同
ii. 0x01 - LL_CHANNEL_MAP_IND
更新已建立的连接的 Channel Map,即可用于数据传输的信道(0 - 36)
- ChM: 1- 信道可用,0 - 信道不可用
- Instant:代表在多少个 Event 的时候,双方一起更新 Channel Map
iii. 0x02 - LL_TERMINATE_IND
向对端设备发出断开连接请求
iv. 0x03 - LL_ENC_REQ
- Rand: 随机数,由 Host 生成
- EDIV: encrypted diversifier
- SKD_C: Central’s session key diversifier
- IV_C: Central’s initialization vector
0x04 - LL_ENC_RSP
- SKD_P: Peripheral’s session key diversifier
- IV_P: Peripheral’s initialization vector
0x05 - LL_START_ENC_REQ
0x06 - LL_START_ENC_RSP
0x0A - LL_PAUSE_ENC_REQ
0x0B - LL_PAUSE_ENC_RSP
没有CtrData数据
v. 0x07 - LL_UNKNOWN_RSP
- UnknownType:收到的不能识别的 Opcode
vi. 0x08 - LL_FEATURE_REQ
- FeatureSet:Central Link Layer 支持的 features 集合
0x09 - LL_FEATURE_RSP
- FeatureSet:Peripheral Link Layer 支持的 features 集合
0x0E - LL_PERIPHERAL_FEATURE_REQ
- FeatureSet: Peripheral’s Link layer 支持的 features 集合
vii. 0x0C - LL_VERSION_IND
viii. 0x0D - LL_REJECT_IND
0x11 - LL_REJECT_EXT_IND
扩展的 reject 命令,如果对端设备 link layer不支持该命令(feature set bit is 0), 则需要使用 LL_REJECT_IND
ix. 0x0F - LL_CONNECTION_PARAM_REQ
0x10 - LL_CONNECTION_PARAM_RSP
x. 0x14 - LL_LENGTH_REQ
0x15 - LL_LENGTH_RSP
- MaxRxOctets: 发送设备的 connMaxRxOctets,不小于 27B
- MaxRxTime: 发送设备的 connMaxRxTime,不小于 328us
- MaxTxOctets: 发送设备的 connMaxTxOctets,不小于 27B
- MaxTxTime: 发送设备的 connMaxTxTime,不小于 328us
xi. 0x16 - LL_PHY_REQ
0x17 - LL_PHY_RSP
- TX_PHYS:发送设备首选的发送 PHY
- RX_PHYS:发送设备首选的接收 PHY
0x18 - LL_PHY_UPDATE_IND
- PHY_C_TO_P:Central 向 Peripheral 发送数据包使用的 PHY
- PHY_P_TO_C:Peripheral 向 Central 发送数据包使用的 PHY
- Instant:代表在多少个 Event 的时候,双方一起更新 PHY
xii. 0x19 - LL_MIN_USED_CHANNELS_IND
- PHYS: Peripheral 使用的 PHYs
- MinUsedChannels:Peripheral 使用的 PHYs 最小信道个数,取值 2 - 37
3. MIC
非加密的ACL连接,或者加密的ACL连接但payload长度为0的时候,不包含该字段