本文依照蓝牙核心规范Core_v4.2和核心规范补充Css_v10展开。
链路层包格式如下图,用于广播通道和数据通道。
Preamble
:前导码,一般情况下,协议栈会自动处理这个字段;
Access Address
:接入地址,广播通道的时候使用0x8E89BED6
这个固定值,数据通道的时候使用随机值;
PDU
:协议数据单元,又分为广播通道PDU和数据通道PDU,其中前2个字节是数据头字段;
CRC
:检验,一般情况下,协议栈会自动处理这个字段。
Header
:包头;
Payload
:数据。PDU Type
:用于指示包的类型;
RFU
:保留;
TxAdd
:发送地址;
RxAdd
:接收地址;
Length
:Paylaod的数据长度,范围在6到37之间;
RFU
:保留。
(1)广播PDU:
ADV_IND
:可连接的非定向广播(最常用的就是这个);
ADV_DIRECT_IND
:可连接的定向广播;
ADV_NONCONN_IND
:无连接非定向的广播(iBeacon就是这个);
ADV_SCAN_IND
:可扫描非定向广播。这种广播不能用于发起连接,但允许其他设备扫描该广播设备。
(2)扫描PDU:
SCAN_REQ
:扫描请求;
SCAN_RSP
:扫描回复。
(3)初始化PDU:
CONNECT_REQ
:连接请求。
Header
:包头;
Payload
:数据;
MIC
:数据一致性校验。
各个字段说明如下:
LLID
:指示了包是LL 数据PDU还是LL控制PDU;
MESN
:下一个期待的序列号;
SN
:序列号;
MD
:更多数据;
RFU
:保留;
Length
:长度,Payload和MIC(如果MIC存在)的长度。
——————END——————