
本文依照蓝牙核心规范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——————