链路层数据包格式汇总(二)
- 数据信道pdu
- LL control pdu
- LL_CONNECTION_UDPATE 连接参数更新
- CHANNEL_MAP_IND 信道图指示
- LL_TERMINATE_IND
- LL_ENC_REQ
- LL_ENC_RSP
- LL_REJECT_IND
- LL_START_ENC_REQ
- LL_UNKNOWN_RSP
- LL FEATURE REQ 、LL_FEATURE_RSP
- LL_PAUSE_ENC_REQ 、LL_PAUSE_ENC_REQ
- LL_VERSION_IND
- LL_REJECT_IND
- LL_PERIPHERAL_FEATURE_REQ
- LL_CONNECTION_PARAM_REQ、LL_CONNECTION_PARAM_RSP
- LL_REJECT_EXT_IND
- LL_PING_REQ、LL_PING_RSP
- LL_LENGTH_REQ 、 LL_LENGTH_RSP
- LL_PHY_REQ 、LL_PHY_RSP
- LL_PHY_UPDATE_IND
- LL_MIN_USED_CHANNELS_IND
- LL_CTE_REQ
- LL_CTE_RSP
- LL_PERIODIC_SYNC_IND
- LL_CLOCK_ACCURACY_REQ and LL_CLOCK_ACCURACY_RSP
- LL_CIS_REQ
- LL_CIS_RSP
- LL_CIS_IND
- LL_CIS_TERMINATE_IND
- LL_POWER_CONTROL_REQ
- LL_POWER_CONTROL_RSP
- LL_POWER_CHANGE_IND
- LL_SUBRATE_REQ PDU
- LL_SUBRATE_IND PDU
- LL_CHANNEL_REPORTING_IND
- LL_CHANNEL_STATUS_IND
- LL_PERIODIC_SYNC_WR_IND
- 恒定音调扩展
- ISO(同步等时流)
蓝牙文章链接直达: 👇
1.profile层(待更新)
2.属性协议层(ATT)(待更新)
4.通用访问协议层(GAP)(待更新)
5.通用属性协议层(GATT)(待更新)
11.蓝牙应用
在上述文章中我们已经讲述了广播信道的相关Pdu,接下来我们对链路层的相关数据包进行详细的介绍:
数据信道pdu
- 以上是数据信道的pdu,数据信道的分类会根据payload中的操作码去划分,以上格式是针对链路层的格式,数据信道的每个pdu都会包含。
- 数据信道的pdu主要有数据头、payload和完整性校验(MIC)组成。
参数类型 | 参数含义 |
---|---|
LLID | 逻辑链路标识符,用来判断数据报文属于下列种类型 0b00,保留 0b01,来白L2CAP的延续帧,或者是一个空包.高层报文延续 0b10,来自L2CAP的开始帧,或者是一个完整的报文,高层报文开始 0b11,控制报文,管理连接 |
NESN(1bit) | 预期序列号 |
SN(1bit) | 序列号 |
MD(1bit) | 更多数据 |
CP(1bit) | 是否包含CTEinfo |
RFU(3bit) | 保留 |
length(8bit) | 长度 |
CTEinfo(8bit) | 指明Constant Tone Extension的类型和长度 |
Payload | 数据,长度为0到251字节, |
MIC | 消息完整性校验,4个字节,可选 |
LL control pdu
- 上图就是数据信道中的payload数据,payload中根据不同的Opcode类型,分为以下多种PDU:
Opcode | LL Control PDU Name | Opcode | LL Control PDU Name |
---|---|---|---|
0x00 | LL_CONNECTION_UPDATE_IND | 0x16 | LL_PHY_REQ |
0x01 | LL_CHANNEL_MAP_IND | 0x17 | LL_PHY_RSP |
0x02 | LL_TERMINATE_IND | 0x18 | LL_PHY_UPDATE_IND |
0x03 | LL_ENC_REQ | 0x19 | LL_MIN_USED_CHANNELS_IND |
0x04 | LL_ENC_RSP | 0x1A | LL_CTE_REQ |
0x05 | LL_START_ENC_REQ | 0x1B | LL_CTE_RSP |
0x06 | LL_START_ENC_RSP | 0x1C | LL_PERIODIC_SYNC_IND |
0x07 | LL_UNKNOWN_RSP | 0x1D | LL_CLOCK_ACCURACY_REQ |
0x08 | LL_FEATURE_REQ | 0x1E | LL_CLOCK_ACCURACY_RSP |
0x09 | LL_FEATURE_RSP | 0x1F | LL_CIS_REQ |
0x0A | LL_PAUSE_ENC_REQ | 0x20 | LL_CIS_RSP |
0x0B | LL_PAUSE_ENC_RSP | 0x21 | LL_CIS_IND |
0x0C | LL_VERSION_IND | 0x22 | LL_CIS_TERMINATE_IND |
0x0D | LL_REJECT_IND | 0x23 | LL_POWER_CONTROL_REQ |
0x0E | LL_PERIPHERAL_FEATURE_REQ | 0x24 | LL_POWER_CONTROL_RSP |
0x0F | LL_CONNECTION_PARAM_REQ | 0x25 | LL_POWER_CHANGE_IND |
0x10 | LL_CONNECTION_PARAM_RSP | 0x26 | LL_SUBRATE_REQ |
0x11 | LL_REJECT_EXT_IND | 0x27 | LL_SUBRATE_IND |
0x12 | LL_PING_REQ | 0x28 | LL_CHANNEL_REPORTING_IND |
0x13 | LL_PING_RSP | 0x29 | LL_CHANNEL_STATUS_IND |
0x14 | LL_LENGTH_REQ | 0x2A | LL_PERIODIC_SYNC_WR_IND |
0x15 | LL_LENGTH_RSP |
LL_CONNECTION_UDPATE 连接参数更新
- 连接参数更新pdu中的参数在连接pdu已提过,此处只多了一个Instant,瞬时参数,表示主从设备更改连接参数的起始位置。
- 在连接过程中,主从设备都会维护一个连接事件计数器(connEventCounter),更新连接参数时,约定当计数值等于Instant,主从设备就会使用新的连接参数进行交互。
- (但需要注意的是,蓝牙协议规定了主设备必须保证6次的数据发送机会,如果从设备延迟(lantency)为200ms的话,Instan值必须设置为1.2S之后的某个值。)
CHANNEL_MAP_IND 信道图指示
- 信道图(ChM)在之前已描述过,5字节每一位表示0~39信道是否可用,0表示不可用,反之表示可用,
- 这里的瞬时值(Instant)跟上述连接参数更新包中瞬时值含义一致。
LL_TERMINATE_IND
终止连接指示
- 错误码列表,具体含义可参考核心协议卷1Part F
Error Code | Name | Error Code | Name |
---|---|---|---|
0x00 | Success | 0x01 | Unknown HCI Command |
0x02 | Unknown Connection Identifier | 0x03 | Hardware Failure |
0x04 | Page Timeout | 0x05 | Authentication Failure |
0x06 | PIN or Key Missing | 0x07 | Memory Capacity Exceeded |
0x08 | Connection Timeout | 0x09 | Connection Limit Exceeded |
0x0B | Connection Already Exists | 0x0C | Command Disallowed |
0x0D | Connection Rejected due to Limited Resources | 0x0E | Connection Rejected Due To Security Reasons |
0x0F | Connection Rejected due to Unacceptable BD_ADDR | 0x10 | Connection Accept Timeout Exceeded |
0x11 | Unsupported Feature or Parameter Value | 0x12 | Invalid HCI Command Parameters |
0x13 | Remote User Terminated Connection | 0x14 | Remote Device Terminated Connection due to Low Resources |
0x15 | Remote Device Terminated Connection due to Power Off | 0x16 | Connection Terminated By Local Host |
0x17 | Repeated Attempts | 0x18 | Pairing Not Allowed |
0x19 | Unknown LMP PDU | 0x1A | Unsupported Remote Feature |
0x1B | SCO Offset Rejected | 0x1C | SCO Interval Rejected |
0x1D | SCO Air Mode Rejected | 0x1E | Invalid LMP Parameters / Invalid LL Parameters |
0x1F | Unspecified Error | 0x20 | Unsupported LMP Parameter Value / Unsupported LL Parameter Value |
0x21 | Role Change Not Allowed | 0x22 | LMP Response Timeout / LL Response Timeout |
0x23 | LMP Error Transaction Collision / LL Procedure Collision | 0x24 | LMP PDU Not Allowed |
0x25 | Encryption Mode Not Acceptable | 0x26 | Link Key cannot be Changed |
0x27 | Requested QoS Not Supported | 0x28 | Instant Passed |
0x29 | Pairing With Unit Key Not Supported | 0x2A | Different Transaction Collision |
0x2B | Reserved for future use | 0x2C | QoS Unacceptable Parameter |
0x2D | QoS Rejected | 0x2E | Channel Classification Not Supported |
0x2F | Insufficient Security | 0x30 | Parameter Out Of Mandatory Range |
0x31 | Reserved for future use | 0x32 | Role Switch Pending |
0x33 | Reserved for future use | 0x34 | Reserved Slot Violation |
0x35 | Role Switch Failed | 0x36 | Extended Inquiry Response Too Large |
0x37 | Secure Simple Pairing Not Supported By Host | 0x38 | Host Busy - Pairing |
0x39 | Connection Rejected due to No Suitable Channel Found | 0x3A | Controller Busy |
0x3B | Unacceptable Connection Parameters | 0x3C | Advertising Timeout |
0x3D | Connection Terminated due to MIC Failure | 0x3E | Connection Failed to be Established / Synchronization Timeout |
0x3F | Previously used | 0x40 | Coarse Clock Adjustment Rejected but Will Try to Adjust Using Clock Dragging |
0x41 | Type0 Submap Not Defined | 0x42 | Unknown Advertising Identifier |
0x43 | Limit Reached | 0x44 | Operation Cancelled by Host |
0x45 | Packet Too Long | 0x46 | Too Late |
0x47 | Too Early |
LL_ENC_REQ
加密请求,用于SM层
- 当产生加密回话时,外围设备发送随机数Rand和加密分发器EDIV,用于区分长期密匙(LTK)。
- SKD_C是中心设备的密匙分发器的部分,IV_C是中心设备初始化向量的部分。
- SKD_C、IV_C都是设备产生的随机数,作为密匙标识符,用于检验LTK是否合法。
LL_ENC_RSP
加密响应,用于SM层
- SKD_P是外围设备的密匙分发器的部分,IV_P是外围设备初始化向量的部分。
- 这两者与中心设备的对应随机数共同组成了SKD和IV,这两者作为输入参数,LTK作为key输送给密匙引擎产生当前的会话密匙sessionkey。
LL_REJECT_IND
ErrorCode见上述表格
LL_START_ENC_REQ
开始加密请求,用于SM层,没有data数据
LL_UNKNOWN_RSP
未知响应,由于操作码错误引起
LL FEATURE REQ 、LL_FEATURE_RSP
链路层特征请求,请求告知有哪些功能
下面是feature每个位代表的功能:
LL_PAUSE_ENC_REQ 、LL_PAUSE_ENC_REQ
暂停加密请求,在连接建立后使用新密实会用到
LL_VERSION_IND
version字段表明当前协议栈属于蓝牙协议哪个版本,具体含义如下:
LL_REJECT_IND
数据包被拒绝,权限不足会发生
LL_PERIPHERAL_FEATURE_REQ
与上述特征描述一致
LL_CONNECTION_PARAM_REQ、LL_CONNECTION_PARAM_RSP
LL_REJECT_EXT_IND
扩展包被拒绝,权限不足会发生
LL_PING_REQ、LL_PING_RSP
链路响应包,用于判断连接是否正常,没有data数据
LL_LENGTH_REQ 、 LL_LENGTH_RSP
最大/最小接收长度请求
发送者连接的最大接收/发送字节,不能少于27字节,最大/发送接收时间不得小于328 μs,
LL_PHY_REQ 、LL_PHY_RSP
请求PHY调制速率,发送和传输:1M,2M,code_S2,code_S8
不同位代表不同的PHY:
LL_PHY_UPDATE_IND
PHY_C_TO_P指明中心设备要求外尾设备需要使用哪种PHY,另外则相反,Instant则表明在多久之后需要使用更新的PHY进行通信。
LL_MIN_USED_CHANNELS_IND
MinUsedChannels表示了最小的使用信道,范围在2~37。
LL_CTE_REQ
恒定音调扩展请求包,用于AOA蓝牙精准定位技术,MinCTELenReq表示最小请求数据长度,单位是 8 µs,MinCTELenReq的value值应该在2~20。
- CTETypeReq指明是哪种请求包,格式如下:
LL_CTE_RSP
没有控制数据
LL_PERIODIC_SYNC_IND
- 此PDU用于PAWR,。id字段用于标识主机,SyncInfo与扩展广播字段里含义相同;
- connEventCount记录了连接事件数量;
- lastPaEventCounter用于决定SyncInfo的内容;SID与扩展广播字段相同。
- AType记录地址类型,0为公共地址,1为随机地址。
- SCA、PHY、AdvA都与扩展广播字段含义相同。
- syncConnEventCount同步连接事件数量,用于同步锚点。
LL_CLOCK_ACCURACY_REQ and LL_CLOCK_ACCURACY_RSP
时钟精度pdu,用于指示中央或外围设备最差睡眠时钟精度,防止两端因温漂导致通信锚点不一致,导致连接断开,所以需要外围设备在每个连接事件中使用此pdu更新时钟精度。
LL_CIS_REQ
Connected Isochronous Group (CIG),已连接的等时流数据组标识;(Connected Isochronous Stream)CIS,已连接的等时流数据。顾名思义,CIG中会包含多个CIS。 PHY_C_To_P和 PHY_P_To_C已在上面介绍过,都是指示对方要使用何种PHY。Max_SDU_C_To_P表明主机要求从机的的最大SDU。Framed则表示是否存在数据帧(无数据帧时也会发包,只不过是空包)。
-
SDU_Interval_C_To_P指示了中心设备两个SDU间的间隔,以微妙为单位。
-
Max_PDU_C_To_P指示了最大的有效载荷,大小为0-251字节。
-
NSE是每个CIS事件中的最大子事件的数量,值应该在1-31数量之间。
-
Sub_Interval设置为同一CIS事件中该CIS的一个子事件开始到下一个子事件开始之间的时间,以微秒为单位。如果NSE字段设置为1,则该值应设置为0;否则,该值应至少为400µs,且应小于ISO_间隔值。
-
BN_C_To_P应设置为从中央到外围设备使用的BN参数值。该值应在0到15之间,BN和FT值规定了CIS事件的传输数据。FT值在1-255之间。 ISO_Interval设置为两个连续CIS锚点之间的时间,单位为1.25 ms。该值应在4和3200之间(即5 ms至4s)。
-
CIS_Offset_Min应设置为连接事件的ACL锚点之间的建议最小时间,以微秒为单位,CIS_Offset应该设置为连接事件的ACL锚点到第一个CIS锚点的时间(以微秒为单位),连接事件由connEventCount引用。该值应至少为500µs。
-
CIS_Offset_Max应该被设置为建议的最大时间,以微秒为单位,CIS_Offset应该设置为连接事件的ACL锚点到第一个CIS锚点的时间(以微秒为单位),连接事件由connEventCount引用。
-
connEventCount是连接事件的计数器。
LL_CIS_RSP
LL_CIS_RSP中参数含义与LL_CIS_REQ相同。
LL_CIS_IND
CIS_Offset应该设置为连接事件的ACL锚点到第一个CIS锚点的时间(以微秒为单位),连接事件由connEventCount引用。CIG_Sync_Delay和CIS_Sync_Delay设置为同步时间参数,以毫秒为单位,使应用层的数据能够同步。
LL_CIS_TERMINATE_IND
CIG_ID与 CIS_ID表示为被终止的CIG和CIS标识,errcode是链路层错误码,已在上述定义,翻看上面PDU错误码。
LL_POWER_CONTROL_REQ
PHY字段表明请求使用的是何种PHY,如下图所示:
- Delta字段表示为请求更改接收方的发送功率等级,单位为dB,数值为正表示需要增加,相反表示要减,0x7f 表示需要将发射功率调至最大值。
- TxPower字段表示发射方的功率水平,以dB为单位。设置为127表示不可用。
LL_POWER_CONTROL_RSP
- 发射功率响应包中Min和Max置1表示设备处于最小或最大发射功率,Delta与TxPower与请求包含义相同。
- APR((Acceptable Power Reduction)应设置为在对端设备输出功率电平中最大减少值,以dB为单位,设置为0xFF时,表示发送方无法决定值。
LL_POWER_CHANGE_IND
各字段含义与上述PDU相同
LL_SUBRATE_REQ PDU
- LL_SUBRATE_REQ PDU属于增强型连接事件中的PDU,connSubrateFactor即基于connSubrateBaseEvent的间隔,可以允许只使用部分连接事件。数值的大小即连接事件的大小。例如connSubrateFactor为5,则设备会忽略前4个连接事件并在第五个连接事件响应。
- Max_Lantency是从机延时的最大时间。
- ContinuationNumber连续数是指连续的有效的数据包数量。
- Timeout监控超时时间。
LL_SUBRATE_IND PDU
此PDU是针对LL_SUBRATE_REQ的回复,以确定各参数值。
LL_CHANNEL_REPORTING_IND
Enable表明对端设别是否应该禁用信道报告。
Min_Spacing应设置为以200 ms为单位,表示在发送下一个LL_CHANNEL_STATUS_IND PDU之前上一个包的最小时间间隔。该值应介于5 (1秒)到150 (30秒)之间。
LL_CHANNEL_STATUS_IND
10字节的 Channel_Classification分为每2位一个单位,每个单位表示一个信道,每单位值有以下定义:
LL_PERIODIC_SYNC_WR_IND
- CtrData of LL_PERIODIC_SYNC_IND即前面已描述过的PDU内容。
- 此PDU用于新推出的PAWR广播。
- numSubevents子事件数目,subeventInterval以1.25ms为单位,从第一个子事件的第一个插槽开始。
- responseSlotDelay意义与subeventInterval相同,即响应时间。
- responseSlotSpacing代表以0.125ms为单位的第一个响应槽到下一个响应槽的时间。
恒定音调扩展
此处的CTE
ISO(同步等时流)