在實際工作中經常會遇到需要分析USB報文的情形。比如對比不同廠家4G/5G模塊。解決實際IP over USB傳輸效率低下問題。 這時候如果能抓取到 USBMOM 總線的報文將會大有裨益。畢竟所有host(Linux/Windows)與外設(USB)交互的信息都是經由 USB 總線才發送到設備上。
如上,我們計划抓取 USB 總線上的報文信息。但是怎么做呢?
Wireshark
Wireshark 是最簡單最熟悉的方案。在Windows 上靠USBPCAP 組件抓USB,這需要在Wireshark 安裝時候選擇安裝上。
在Linux 上依賴於操作系統 USBMON 驅動。Linux 發行版可以直接modprobe -a usbmon來加載 USBMON 驅動(默認不加載),然后打開 Wireshark 就能看到 usbmon1,usbmon2...
如下圖,選中設備對應的總線就可以抓了

tcpdump
tcpdump 抓取 USB 報文和抓取網卡語法是一樣的, 如下圖

在嵌入式設備/Android上這里會有個坑。就是用tcpdump -D能看到 usbmon 節點。但是,執行tcpdump -i usbmon1類似的命令時候會提示 usbmon1 不存在???
這是因為操作系統被裁剪掉了 udev,導致沒有生成設備節點。我們可以用mknod命令來手動創建這些節點!

如何確定總線
太簡單了!!! 既然要抓LOG,肯定有目標,知道要抓哪個設備的。比如你知道外設的 VID&PID,那么通過 lsusb 就可以看到! 總線1 就是usbmon1,總線 2 就是usbmon2...

那么如果我是嵌入式系統,沒有lsusb、urb-devices這樣的命令怎么辦???
好吧! 其實你可以這么看:

如果這個命令也失敗了。。。。 那么你需要檢查你的系統 usbmon 驅動相關的是否都打開了。
如何分析報文
參見小伙伴寫的另一個博客:詳解 usbmon 抓取的 log 各字段的含義
