一、link layer数据包格式
1.Uncoded Phys
1M/2M Phys
| Preamble|AccessAddress |PDU| CRC| Constant Tone Extension|
其中前4部分是强制的,最后一部分cte是可选的,用于AoA等用途。
Preamble:4Bytes, 这个是为了接收机来同步频率等用途的,每种无线通信都必须必须包含的。是固定的01序列,
并且对于1M PHY 是1字节,2M PHY是2字节。取值取决于之后的访问码地址最低位。简言之,就是Preamble取值是为了与相邻的AccessAddress域有明显的位跳变。具体取值如下:
如果访问码b0是1,则Preamble取以0结束的值,即0xAA/0xAAAA;
如果访问码b0是0,则Preamble取以1结束的值,即0x55/0x5555.
因为整包数据传输工作在1Msybs 或者 2M sybs,所以在不包括CTE的情况下,整包数据传输需要44us~2128us时间。
AccessAddress
在我个人看来,accessAddress更多的是标识一个物理通道,通信双方约定好在哪个通道上碰头交换信息。另外对于监听的设备,只需要通过判断该域就可以判断是否是自己感兴趣的数据。
PDU
PDU分为三大类,
primary广播通道/Secondary广播通道以及周期广播通道上的packet使用广播通道Adv PDU;
数据通道上使用数据通道 Data PDU;
Isochronous通道上使用Isochronous PDU.
1. 广播通道
包括Primary/Secondary/Periodic广播通道PDU格式如下:
ChSel/TxAdd/RxAdd 对于不同的type可能有不同的含义,如果不包含该域,则认为是保留域。
Length: 表示之后的数据Payload的长度,取值1~255字节。
这里着重说一下扩展广播包:
扩展广播的payload的数据使用 Common Extended Advertising Payload Format。
Extended Header Length 取值范围在0~63之间,实际取决于Extended Header.
AdvMode:
0b00 - 不可扫描不可连接广播包
0b01 - 可连接不可扫描
0b10 - 不可连接可扫描
0b01 - reseved.
Extended Header Flags: 位map,域映射,分别对应之后的AdvA ~ TxPower域。如果某位为1,说明该域存在。
AdvA 和 TargetA含义和之前广播header含义一致,分别代表广播发出者地址和广播接收者地址。并且类型受广播header种的TxAdd 和 RxAdd约束。
CTEInfo: 表明该包是否包含 Constant Tone Extension(额外的16~160us).
AdvDataInfo(ADI) : 由advertiser设置用于表明广播集信息。
SID: 用于区分不同的广播集
DID: 广播数据ID。scanner可以据此来区分是不是重复数据包。
AuxPtr:
如果存在该域,就说明至少有部分甚至所有广播数包是存在于随后的辅助广播包里(subsequent auxiliary packet)。但是接下的数据包会在什么时间什么地点发送呢?该域就是描述辅助包的。
Channel Index,表示可能在哪些通道上发辅助包。
offset Units, Aux Offset域对应数值的时间单位。
0 - 30us,
1- 300us
AUX Offset, 表明从参考点到辅助包开始发送的时间便宜。参考点是指包含该AuxPtr的数据包开始时间。offset = AUX Offset * offset Units. 这个offset至少要大于该包整包发送时间+T_MAFS. 如果Aux Offset小于 245,700 µs, Offset Units需要设置为0. 辅助包的发送时间点不应该早于参考点之后的Aux Offset,并且不晚于参考点之后的Aux Offset + Offset Units。其实就是限制辅助包在参考点+ Aux Offset之后的 offset Units时间内发出去。
Aux Phy: 辅助包使用的phy
00 - 1M 01 - 2M 10 - Coded 11 - reseved
CA , Clock Accuracy,表示Adevertiser在该包与辅助广播包之间将会使用的时钟精度。
0 : 51ppm ~ 500ppm 1: 0ppm ~ 50ppm
2.Data通道
在以下2种情况下可能不存在MIC,
- 未加密的acl链路
2)加密但是payload长度为0
流控机制
connection建立时初始化NESN 和 SN均为0,
NESN:next expected sequence number,
SN : sequence Number
本地维护两个变量transmitSeqNum 和 expectedSeqNum,
Tx时, 设置SN = transmitSeqNum
Rx时,判断接收包的SN是否等于expectedSeqNum, 如果相等则说明对端已经确认收到了last packet,此时将transmitSeqNum加1.
- Constant Tone Extention and IQ sample
- Isochronous physical channel
CIS 数据包:
A Connected Isochronous PDU (CIS PDU) shall be either a CIS Data PDU or a CIS Null PDU. A CIS Data PDU is used to carry isochronous data. A CIS Null PDU is used when there is no data to be sent.
BIS包:
A Broadcast Isochronous PDU (BIS PDU) shall be either a BIS Data PDU or BIG Control PDU. A BIS Data PDU is used to carry isochronous data. A BIG Control PDU is used to send control information for a BIG.
BIG控制包:
目前BIG控制包只包括2个实际的opcode:
0x00 - BIG_CHANNEL_MAP_IND
0x01 - BIG_TERMINATE_IND