WCH BleAnalyzer BLE 抓包解码框架 — 完整解码流程说明
本文介绍了蓝牙BLE抓包解码框架的完整流程,分为四个层级:原始输入、基础工具层、包类型判断层和具体协议解析层。基础工具层提供字节读取、格式转换等公共功能。包类型判断后分为四条路径:调试旁路用于数据导出、自定义2.4G包、广播包解析(包括6种ADV类型)和连接包解析。连接包进一步分为链路层控制包(11种Opcode)和数据包(ATT/GATT协议)。整个框架采用模块化设计,支持从物理层到应用层的完整
BLE 抓包解码框架 — 完整解码流程说明
WCH BleAnalyzer BLE 抓包解码框架 — 完整解码流程说明
—


| 后缀 | 全称 | 含义 | 通信模式 |
|---|---|---|---|
| IND | Indication | 指示/告知 | 单向通知。一方主动告知对端某个状态变更或即将执行的操作,不需要对方回复确认(或说不期待一个专门的 Response 包回复) |
| REQ | Request | 请求 | 双向握手。发起方请求操作,必须等待对方回复 |
| RSP | Response | 响应 | 对 Request 的回复,成对出现 |
BLE 抓包解码框架 — 完整解码流程说明
第一层:原始输入
抓包硬件捕获空中 BLE 无线帧,得到原始字节流 Raw Bytes,作为整个解码框架的输入。
第二层:基础工具层 mDefine.txt
所有解码工作的地基,提供以下公共能力:
- 字节读取器
read_uint/read_int— 从缓冲区按位读取无符号或有符号整数 - 格式转换器
hexDump/binaryToHexStr— 原始字节转可读 HEX 字符串 - 小端序转换器
leBytesToUint64— Little-Endian 字节序转 64 位整数 - 元信息提取器
getIndex/getRSSI/getDirection/getChannel/getMacAddr/getPayload— 从帧中提取信号强度、信道号、设备物理地址等元数据 - 基础对象构造器
decoder/context/ret— 构建解码上下文与返回值容器
第三层:包类型判断 PKT_TYPE_NAME
依据帧头字段识别包类型,分四条路径:
路径 A — 调试旁路 dbg_trans.txt
不做协议解码,专注数据导出:
dbg_run_transcation— 过滤指定 MAC 地址,将时间戳、RSSI、方向、信道等写入 CSVdbg_run_end— 安全关闭 CSV 文件句柄
路径 B — 自定义 2.4G 包 userdef24.txt
decode()注册USER_DEFINE_PKT类型处理函数- 解析
data0/data1两字节自定义结构,供用户自行扩展
路径 C — 广播包 adv.txt
首先解析 PDU Header(PDU Type / TxAdd / RxAdd / Length),再按 ADV PDU Type 细分:
| ADV 类型 | 说明 | 解析字段 |
|---|---|---|
ADV_IND |
可连接非定向广播 | AdvA + AdvData(AD Structure 循环解码,含设备名/UUID/TxPower) |
ADV_DIRECT_IND |
可连接定向广播 | AdvA + TargetA |
SCAN_REQ |
扫描请求 | ScanA + AdvA |
SCAN_RSP |
扫描响应 | AdvA + ScanRspData(AD Structure 循环解码) |
CONNECT_IND |
连接请求 | InitA + AdvA + LLData(AccessAddress / CRCInit / WinSize / Interval / Latency / Timeout) |
ADV_EXT_IND |
扩展广播(BLE 5.0) | Extended Header / AdvMode / AuxPtr / ADI / TxPower / ACAD |
路径 D — 连接包 conn.txt
首先解析 Data PDU Header(LLID / NESN / SN / MD / CP / Length),再按 LLID 分两条子路径:
子路径 D-1 — LLID = 3,链路层控制包 LL_Control.txt
读取 Opcode 操作码,查表 handlers_control_data,按 Control Opcode 细分:
| Opcode | 说明 | 解析字段 |
|---|---|---|
LL_CONNECTION_UPDATE_IND |
连接参数更新指示 | WinSize / WinOffset / Interval / Latency / Timeout / Instant |
LL_CHANNEL_MAP_IND |
信道映射更新指示 | ChM 5字节37bit + Instant |
LL_TERMINATE_IND |
连接终止指示 | ErrorCode |
LL_ENC_REQ/RSP |
加密协商请求/响应 | Rand / EDIV / SKDm / IVm(用于协商 LTK 长期密钥) |
LL_VERSION_IND |
版本信息指示 | VersNr / CompId / SubVersNr |
LL_FEATURE_REQ/RSP |
特性集合协商 | FeatureSet 8字节64bit |
LL_PHY_REQ/RSP / LL_PHY_UPDATE_IND |
物理层 PHY 协商 | TX_PHYS / RX_PHYS / Instant(1M/2M/Coded PHY) |
LL_LENGTH_REQ/RSP |
数据长度协商 | MaxRxOctets / MaxRxTime / MaxTxOctets / MaxTxTime |
| 其他 | PING / UNKNOWN / CTE 等 | 对应结构体解码 |
子路径 D-2 — LLID = 1/2,链路层数据包 LL_Data.txt
解析 L2CAP Header(Length / CID),再按 CID 信道标识符 分三条子路径:
CID = 4,ATT 属性协议信道 LL_Data_ATT.txt
读取 Opcode 操作码,查表 handlers_attribute_opcode,按 ATT Opcode 细分:
| Opcode | 说明 | 解析字段 |
|---|---|---|
ATT_ERROR_RSP |
错误响应 | ReqOpcode / Handle / ErrorCode |
ATT_FIND_INFO_REQ |
查找属性信息请求 | StartHandle / EndHandle |
ATT_FIND_INFO_RSP |
查找属性信息响应 | Format + UUID 列表(16bit 或 128bit) |
ATT_READ_REQ |
读取属性请求 | AttributeHandle |
ATT_READ_RSP |
读取属性响应 | AttributeValue(hexDump 显示) |
ATT_WRITE_REQ/CMD |
写入请求/命令 | Handle + Value(REQ 需确认,CMD 无需确认) |
ATT_HANDLE_VALUE_NTF/IND |
服务端通知/指示 | Handle + Value(NTF 无需确认,IND 需 ATT_CONFIRM 回复) |
ATT_READ_BY_TYPE_REQ/GROUP_REQ |
按类型/组批量读取 | StartHandle / EndHandle / UUID(用于 GATT 服务与特征发现) |
| 其他 | PREPARE_WRITE / EXECUTE_WRITE 等 | 对应结构体解码 |
CID = 5,L2CAP 信令信道 LL_Data_SIG.txt
读取 Code 命令码 + ID + Length,查表 handlers_sig_cmd_fmt,按 SIG Command Code 细分:
| Code | 说明 | 解析字段 |
|---|---|---|
CONNECTION_PARAM_UPDATE_REQ/RSP |
连接参数更新请求/响应 | IntervalMin / IntervalMax / Latency / Timeout |
LE_CREDIT_BASED_CONN_REQ/RSP |
基于信用的 L2CAP 连接(CoC) | SPSM / MTU / MPS / InitialCredits |
FLOW_CONTROL_CREDIT_IND |
流控信用点数指示 | CID + Credits |
DISCONNECTION_REQ/RSP |
L2CAP 信道断开请求/响应 | DestCID + SourceCID |
| 其他 | COMMAND_REJECT 等 | 对应结构体解码 |
CID = 6,SMP 安全管理信道 LL_Data_SMP.txt
读取 Code 命令码,查表 handlers_SMP_code,按 SMP Code 细分:
| Code | 说明 | 解析字段 |
|---|---|---|
PAIRING_REQUEST/RESPONSE |
配对请求/响应 | IOCapability / OOB / AuthReq / MaxKeySize / InitiatorKeyDist / ResponderKeyDist(协商 JustWorks / Passkey / OOB 配对方式) |
PAIRING_CONFIRM |
配对确认值 | Confirm Value 16字节(验证配对参数一致性) |
PAIRING_RANDOM |
配对随机数 | Random Value 16字节(用于生成 STK 短期密钥) |
ENCRYPTION_INFORMATION |
加密信息分发 | LTK 长期密钥 16字节(重连时恢复加密) |
MASTER_IDENTIFICATION |
主机标识信息 | EDIV + Rand(配合 LTK 识别密钥) |
IDENTITY_INFORMATION |
身份解析信息 | IRK 身份解析密钥 16字节(解析私有地址 RPA) |
IDENTITY_ADDRESS_INFORMATION |
身份地址信息 | AddrType + Address(公共或静态随机地址) |
| 其他 | SIGNING_INFO / SECURITY_REQ 等 | 对应结构体解码 |
第四层:输出汇总
各路径解码完成后,统一将结果写入 ret 对象,返回上层调用方,输出内容包含:
- 结构化协议字段(字段名 + 解析值)
- 原始 HEX 字节数据(hexDump 格式)
- 供 UI 渲染展示或写入日志记录
更多推荐




所有评论(0)