RS-232シリアル通信を透過的にモニタする小道具「Data Tap」を使ってみた
Page content
シリアル通信を見たい
RS-232接続で行われている2点間のシリアル通信の内容を、やんごとなき事情で読み取らなくてはならない。そんなとき、「Data Tap」というシンプルな道具が使えるらしいと知った。2点間の通信のそれぞれのTXとRXの信号を、第3の端子にRXとしてまとめて出力してくれる回路が入っているのであろう。高価な専用機器としては「RS-232Cアナライザー」というものがあるらしいがまずは安価な範囲でね……。
ウェブ検索で見つけられる手頃なData Tapは下記のようにいくつかあるようで、ここでは後者の「BB-9PCDT」を入手した。仕様がわかるデータシートも公開されている。
- RS-232 ComProbe II for Serialtest; Monitors and captures Asynchronous RS-232 Serial Communications
- BB-9PCDT - Advantech
本記事では、初めて触るRS232 Data Tapの動作確認として、2点間の通信内容を第3の端子 (Tap Connector) から読み取るところまでやってみる。
準備するもの
種別 | 商品名 | 購入店 | |
---|---|---|---|
RS-232 Data Tap | ADVANTECH ULI-252D BB-9PCDT | Mouser Electronics |
今回のBB-9PCDTの端子形状に合う、下記のUSB-シリアル変換ケーブルも、1本+2本で計3本準備した。
- UGREEN 20201 (USB to DB9 RS-232 Female Adapter Cable, 1.5 Meter): 1本
- UGREEN 20210 (USB to DB9 RS-232 Male Adapter Cable, 1.0 Meter): 2本
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-シリアル変換ケーブルのデバイス認識を確認
- Ubuntu 22.04のPCに、USBハブを介してUSB-シリアル変換ケーブルを3本接続する。
- ケーブルが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
- 補足情報として。Hardware for Linux > Prolific Technology ATEN Serial Bridgeの情報によると、
067b:23a3
なデバイスはUbuntu 22.04環境において接続するだけで利用できることがわかる (ドライバの別途インストール不要)。
Step-2. Data Tapの通信テスト
- BB-9PCDTの裏面DIP Switchを「1=ON, 2=ON, 3=ON, 4=OFF」に設定する。
- 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つ用意し、それぞれの画面で次のコマンドを起動する。下記では
/dev/ttyUSB2
に接続されたケーブルが第3の端子 (Tap Connector) につながっている想定であるが、ttyUSB
の末尾の数字は、ケーブルの認識順や、実際のUSB端子とRS232端子との接続の組み合わせによって変わるので、各自突き止めること。端末名 起動するコマンド (-o=–noinit, -D=–device) 端末1 minicom -o -D /dev/ttyUSB0
端末2 minicom -o -D /dev/ttyUSB1
端末3 minicom -o -D /dev/ttyUSB2 --displayhex
※ttyUSB2 = Tap Connectorの想定 - 次のことを確認する。なお、端末3では
--displayhex
しているので受信内容は16進数表記になる。- 端末1に文字を打ち込んだら、文字が端末1 (localecho) と端末2 (通信相手) と端末3に表示されること。
- 端末2に文字を打ち込んだら、文字が端末2 (localecho) と端末1 (通信相手) と端末3に表示されること。
- さらに次のことを確認する。
- 端末3に文字を打ち込んだら、文字が端末3 (localecho) には表示されるが、端末1と端末2には何も変化がないこと。
- 以上により、端末1と端末2のシリアル通信内容をTap Connectorに接続した端末3でモニターできていることと、端末1と端末2の間で行われる通信に端末3が介入できないことがわかる。
- 端末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でモニターできる。