【android bluetooth 协议分析 01】【HCI 层介绍 2】【Malformed Packet 介绍】
在实际工作中遇到了 malformed packet , 我这里来分析一下。 遇到这种问题的处理思路。
1. Malformed packet
36982 2025-04-29 14:15:34.899760 controller host HCI_EVT 4 Rcvd Role Change[Malformed Packet]Frame 36982: 4 bytes on wire (32 bits), 4 bytes captured (32 bits)
Bluetooth
Bluetooth HCI H4
Bluetooth HCI Event - Role Change
[Malformed Packet: HCI_EVT][Expert Info (Error/Malformed): Malformed Packet (Exception occurred)][Malformed Packet (Exception occurred)][Severity level: Error][Group: Malformed]
这个 HCI 事件包被 Wireshark 标记为 “Malformed Packet: HCI_EVT”(格式错误的 HCI 事件),并提示 “Exception occurred”。
1. 报文信息解析
- Frame 36982:此帧只有 4 个字节,显然是异常的。
- 协议层级结构:
Bluetooth
Bluetooth HCI H4
Bluetooth HCI Event - Role Change
(HCI 事件:角色切换)
- 错误提示:
Malformed Packet: HCI_EVT
:HCI_EVT(HCI Event)包格式不正确。Exception occurred
:Wireshark 在解析时抛出了异常,意味着它期望的数据格式不匹配或不完整。- 严重等级:Error
- 错误分组:Malformed
2. 正常的 HCI Role Change 事件结构应如下:
字段 | 长度(字节) | 说明 |
---|---|---|
Event Code | 1 | 固定为 0x0E (Command Complete)或 0x0F (Command Status)等 |
Parameter Total Length | 1 | 剩余字段总长度 |
Status | 1 | 执行结果状态 |
Connection Handle | 2 | 连接标识符 |
Role | 1 | 当前角色(0x00 主机,0x01 从机) |
一般长度应在 6~8 字节 之间,而你当前抓到的只有 4 字节,说明数据严重缺失或格式不符。
3. 常见原因分析
原因 | 描述 |
---|---|
数据捕获不完整 | HCI 设备或驱动只导出了部分数据 |
软件 Bug / 蓝牙栈异常 | 控制器或 Host 端蓝牙栈生成了不完整的数据包 |
解析器误判 | Wireshark 插件或解析器未正确处理该事件 |
HCI H4 Header 错误 | 开头的类型码(0x04)之后字段偏移错误,导致 Wireshark“错位解析” |
4. 解决建议
-
确认 HCI 抓包来源:
- 是通过 USB 抓取的 HCI 日志?(如
btmon
) - 还是 UART HCI log?(需确认 HCI H4 协议头是否正确)
- 是通过 USB 抓取的 HCI 日志?(如
-
检查前后帧是否也异常:
- 是否只有这一帧出错?是否存在连续出错,可能是串口偏移了。
-
重启抓包工具并校准字节对齐:
- 使用
hcidump
、btmon
等确认源日志是否也显示异常。 - 确认串口或日志设备没有丢包。
- 使用
-
用十六进制查看原始数据:
- 右键该帧 ->
Follow -> Raw Data
或Hex Dump
,看是否 HCI Header 部分损坏。
- 右键该帧 ->
-
检查驱动日志:
- 查看内核中 Bluetooth HCI 驱动是否有异常日志。