在實際工作中遇到了 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 驅動是否有異常日志。