RS-232シリアル通信を透過的にモニタする小道具「Data Tap」を使ってみた

RS-232シリアル通信を透過的にモニタする小道具「Data Tap」を使ってみた
Page content

シリアル通信を見たい

RS-232接続で行われている2点間のシリアル通信の内容を、やんごとなき事情で読み取らなくてはならない。そんなとき、「Data Tap」というシンプルな道具が使えるらしいと知った。2点間の通信のそれぞれのTXとRXの信号を、第3の端子にRXとしてまとめて出力してくれる回路が入っているのであろう。高価な専用機器としては「RS-232Cアナライザー」というものがあるらしいがまずは安価な範囲でね……。

ウェブ検索で見つけられる手頃なData Tapは下記のようにいくつかあるようで、ここでは後者の「BB-9PCDT」を入手した。仕様がわかるデータシートも公開されている。

本記事では、初めて触るRS232 Data Tapの動作確認として、2点間の通信内容を第3の端子 (Tap Connector) から読み取るところまでやってみる。

準備するもの

種別商品名購入店
RS-232 Data TapADVANTECH ULI-252D BB-9PCDTMouser Electronics

今回のBB-9PCDTの端子形状に合う、下記のUSB-シリアル変換ケーブルも、1本+2本で計3本準備した。

UGREEN RS232C USB 変換ケーブル USB シリアル変換ケーブル [ USB A to D-Sub9ピン] USB シリアルケーブル Windows 10/8.1/8/7/XP/Linux/Mac OS対応 1M

UGREEN RS232C USB 変換ケーブル USB シリアル変換ケーブル [ USB A to D-Sub9ピン] USB シリアルケーブル Windows 10/8.1/8/7/XP/Linux/Mac OS対応 1M

UGREEN GROUP LIMITED

簡易Sniffing実験

Step-1. USB-シリアル変換ケーブルのデバイス認識を確認

  1. Ubuntu 22.04のPCに、USBハブを介してUSB-シリアル変換ケーブルを3本接続する。
  2. ケーブルがUSBデバイスとして認識されていることを確認する。
    $ lsusb | grep Serial
    Bus 001 Device 009: ID 067b:23a3 Prolific Technology, Inc. USB-Serial Controller
    Bus 001 Device 008: ID 067b:23a3 Prolific Technology, Inc. USB-Serial Controller
    Bus 001 Device 010: ID 067b:23a3 Prolific Technology, Inc. USB-Serial Controller
    
    $ ls -a /dev/ttyUSB*
    /dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2
    
  3. 補足情報として。Hardware for Linux > Prolific Technology ATEN Serial Bridgeの情報によると、067b:23a3なデバイスはUbuntu 22.04環境において接続するだけで利用できることがわかる (ドライバの別途インストール不要)。

Step-2. Data Tapの通信テスト

  1. BB-9PCDTの裏面DIP Switchを「1=ON, 2=ON, 3=ON, 4=OFF」に設定する。
  2. Ubuntu環境にminicomを導入し、sudo minicom -sして諸々お好みの設定を行い、「“dfl” に設定を保存」して最後に「Minicom を終了」を行う。ここで行った設定がデフォルトとして扱われる。今回の実験では次の内容とした。
    $ cat /etc/minicom/minirc.dfl 
    # Machine-generated file - use "minicom -s" to change parameters.
    pu baudrate         9600
    pu rtscts           No
    pu localecho        Yes
    pu addlinefeed      Yes
    pu linewrap         Yes
    
  3. 端末画面を3つ用意し、それぞれの画面で次のコマンドを起動する。下記では/dev/ttyUSB2に接続されたケーブルが第3の端子 (Tap Connector) につながっている想定であるが、ttyUSBの末尾の数字は、ケーブルの認識順や、実際のUSB端子とRS232端子との接続の組み合わせによって変わるので、各自突き止めること。
    端末名起動するコマンド (-o=–noinit, -D=–device)
    端末1minicom -o -D /dev/ttyUSB0
    端末2minicom -o -D /dev/ttyUSB1
    端末3minicom -o -D /dev/ttyUSB2 --displayhex ※ttyUSB2 = Tap Connectorの想定
  4. 次のことを確認する。なお、端末3では--displayhexしているので受信内容は16進数表記になる。
    • 端末1に文字を打ち込んだら、文字が端末1 (localecho) と端末2 (通信相手) と端末3に表示されること。
    • 端末2に文字を打ち込んだら、文字が端末2 (localecho) と端末1 (通信相手) と端末3に表示されること。
  5. さらに次のことを確認する。
    • 端末3に文字を打ち込んだら、文字が端末3 (localecho) には表示されるが、端末1と端末2には何も変化がないこと。
  6. 以上により、端末1と端末2のシリアル通信内容をTap Connectorに接続した端末3でモニターできていることと、端末1と端末2の間で行われる通信に端末3が介入できないことがわかる。
  7. 端末3でのモニター内容をファイル保存する場合は、minicom -o -D /dev/ttyUSB2 --capturefile=serial.logすればよい。通信中に別の端末4でtail -F serial.logすることも可能だ。

余談: ZMODEMあったなぁ……

昔懐かしいパソコン通信で重宝していた、ZMODEMによるファイル転送を、端末1と端末2の間でやってみることもできた。しかし今回の実験環境では、端末1からZMODEM送信を開始する際に、端末2だけではなく端末3のminicomもZMODEM受信を始めようとするので、端末3のZMODEM受信はCtrl+Cで中止する必要がある。その後は、ZMODEM通信の様子が端末3でモニターできる。

参考リンク