USB-CDC(ACM)の通信をのぞき見する

Seeed K.K.の松岡です。
花粉症ツライ日々です。😣

今回はUSB CDC(ACM)をWireshark + USBPcapでのぞき見する方法を紹介します。(Windowsで書いています。MacOSやLinuxの方、ごめんね。)

WiresharkでUSBをのぞき見できる

みなさんはセンサーの測定値がうまく取れないときにどうやって調べていますか?コードを凝視したり、配線を何度も確認したりと苦労が絶えないことと思います。わたしはロジックアナライザを(I2CやSPI、UARTなどに)繋いで通信をのぞき見して、原因を絞り込み、特定しています。異常時に限らず、正常に動作しているときも、より一層の安心を得るためにロジックアナライザで通信を確認しています。ロジックアナライザすばらしい。これで夜もぐっすり眠れます。

しかしながら、最近、Seeed Studio XIAO ESP32C3を触っていてちょっと困ったことがありました。パソコンとXIAO ESP32C3の通信が不安定で原因を調べようとしたときです。これ、パソコンとXIAO ESP32C3はUSB直結でUSB CDC(ACM)というプロトコルで通信しています。これをロジックアナライザで見ることも出来なくはないですが、、、プロトコルの脳内解析が大変で現実的ではありません。

でも、心配することはありません。みんな大好きWiresharkにUSB関連のプロトコルを解釈する機能があるのです。すばらしい。

OSにUSBに流れているデータをのぞき見するドライバ(WindowsであればUSBPcap)を加えてWiresharkへ送り、Wireharkでプロトコル解析することで、USBの通信を読みやすく可視化できます。

やってみよう

事前準備

Seeed Studio XIAO ESP32C3

1秒周期にUSB CDC(ACM)へ送信するスケッチを入れておきます。USB CDC(ACM)といっても、特別な関数を使うわけではありません。Serial.println()を実行すると、USB CDC(ACM)でパソコンへ送信してくれます。

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println(millis());
  delay(1000);
}

Wireshark

WiresharkをインストールするときにUSBPcapもインストールします。(既にWiresharkがインストールされている環境でUSBPcapだけを追加インストールする方法は、、、わかりません。がんばって調べてください。)

のぞき見

XIAO ESP32C3をパソコンに接続します。Arduino IDEのシリアルモニタやTeraTermといったターミナルソフトを起動して、Seeed Studio XIAO ESP32C3から送られてくるUSB CDC(ACM)のメッセージをパソコンに表示させておきます。

WiresharkでUSBPcapのパケットキャプチャを開始します。キャプチャするインターフェースはUSBPcapのいずれかです。キャプチャしてみて、うまく取れるインターフェースを探しましょう。わたしの環境ではUSBPcap2を選ぶとXIAO ESP32C3の通信がキャプチャできました。

特定デバイスだけ表示

実際にやってみると、XIAO ESP32C3以外のUSB通信も大量にキャプチャされることがわかります。この状況でXIAO ESP32C3の通信だけを見るのは至難の業です。

Wiresharkの表示フィルタ機能を使って、XIAO ESP32C3の通信だけを表示するようにしてみましょう。

まず、XIAO ESP32C3のアドレスを調べます。表示フィルタに(usb.bInterfaceClass == 0x0a) && (usb.data_len >= 1)を設定して、USB CDCでデータ有りのパケットだけを表示します。Source列でアドレス(bus.device.endpoint)が分かります。

次に、表示フィルタにアドレス(bus.device.)を設定します。たとえば、Source列に2.13.02.13.1と表示されていたときは、表示フィルタにusb.addr matches "^2.13."と入力すれば、XIAO ESP32C3の通信だけに絞り込まれます。

通信データを見やすく

USB CDC(ACM)のメッセージは、上部のサマリをクリックすると右下のダンプで確認できます。メッセージが多いときには操作が手間なので、Wiresharkを設定変更してサマリにメッセージを表示しましょう。

サマリの列見出しで右クリックして、列の設定画面を表示します。+ボタンをクリックして、列を追加します。

追加した列の見出しで右クリックして、列の編集をクリックします。種別をCustom、フィールドをusb.capdataに変更します。

ATのプロトコル解析が邪魔をするので、無効化します。メニューの 分析 > 有効化したプロトコル... を選んで、ATのチェックを外します。

良い感じに表示できました。

参考リンク

変更履歴

日付 変更者 変更内容
2023/3/10 松岡 作成