はじめに
要素技術習得のため、21年度の社内勉強会のテーマとして、ラズパイを用いてEthernet評価ツールを開発しました。メンバー5名にアドバイザーをいれて、毎週1時間程度の頻度で活動を実施。Raspberry Pi4に、Python言語(C言語)を使ったEthernet送受信機能を実装し、PCの表示系としてGUIによる設定ツールを実装しました。
概要
21年4月~9月の活動では、Ethernet評価時に対向となる送受信機能を持ったツールを開発。
- 受信機能:受信元/先のIPアドレスやMACアドレス、受信データなどを表示
- 送信機能:UDPによる固定フレーム送信。TCP/IPは未実装
21年10月~22年3月の活動では、上期成果物のブラッシュアップとして、GUI、ログリプレイ送信、周期送信、エコーバック機能を追加。また、開発言語をC言語からPython言語に変更。
Pythno言語では、便利なライブラリが用意されており、開発効率が良いため使用言語を変更しました。
開発成果物
動作環境
Raspberry Pi4のEthernetインターフェースを使用して、Ethernet Socket通信を実装。
PCからは、VNC Viewer経由でRaspberry Pi4をリモート操作しつつ、WiresharkでEthernetをモニタするシステム構成です。Windows PCとの通信では多数のパケットが流れて通信が確認しづらいため、状況に応じてRaspberry Pi同士で通信を確認しました。
Ethernet評価ツール機能
周期送信機能
- UDPパケットを周期的に送信(ミリ秒単位で送信可能)
- 送信したいデータはCVSファイルで設定、ユーザー変更可能
注意事項としては、Python仕様のため、オフセット設定は非対応。また、約0.01msの送信遅延が発生します。
エコーバック機能
- 受け取ったメッセージをそのまま返送する機能
想定する使用用途としては、評価対象基板の送信/受信の確認など。
ただ、高頻度メッセージには対応できないため、導通確認として使用するイメージです。
ログリプレイ機能
- ログファイル(*.pcap)を送信
- フレームの送信間隔はログの送信間隔に準拠
- どのインターフェース(LANポート含む)から送信するか選択可能
注意点としては、フレームの送信間隔は実際のログと比べて、1ms程度の誤差があります。またバースト送信は非対応で、フレームの最小送信間隔は2msとなり、2ms以下のログ間隔の場合は、2ms間隔に延長されます。
GUIツール
Ethernet評価ツールの設定用GUIツールを作成しました。
# | 項目 | 機能概要 |
1 | モード設定 | 送受信モードを選択 |
2 | リプレイファイル | リプレイ送信に使用するpcapファイルを読込み入力 |
3 | 周期ファイル | 周期送信に使用するcsvファイルを入力読込み入力 |
4 | iface | 送受信で使用するインターフェースを選択 |
5 | Period(ms) | 周期送信の周期時間を設定 |
6 | Offset(ms) | 周期送信の送信開始までのoffset時間を設定 |
7 | IPaddress | 送信先のIPアドレスを入力設定 |
8 | Port Num | 使用するポート番号を入力設定 |
9 | Run | 実行開始ボタン |
10 | Stop | 実行中止ボタン |
開発環境
当初、C言語を用いて開発していましたが、Python言語では便利なライブラリが用意されているため途中からPython言語に変更しました。
Pythonで活用したライブラリ
- Pandas
データ解析支援ライブラリ。
主にCSVファイル読み込みに使用。 - Scapy
コンピュータネットワーク用のパケット操作ライブラリ。
主にWiresharkによるパケットキャプチャログの読み込みやパケット送受信に使用。
まとめ
苦労した点
- 周期送信の処理内にthreadでは実行できない処理があり、別途対応が必要になった。
- 管理者権限がないとScapyでは送信できない。それに気づくのに時間がかかった。
- Pandasのデータフレーム(構造体配列のようなもの)から目的のデータを取り出すことが上手くいかず、解決に苦労した。
- thread機能を仕様して周期送信を実現しようとしたが、設定した周期で送信されない。
→ 周期送信用のPython単体で動作した場合は問題なく動作するが、GUIから動作した場合、周期が乱れる。 - Python言語を使用したことがなかったため環境構築から動作確認まで理解するのに苦労した。
今後の課題
- ログリプレイ機能で送信するログを加工する方法がないことが課題。例えば、チェックサム異常等の異常系を確認しようとしても、それらのログが用意できないため、ログリプレイ送信で確認できない。
- ログリプレイ送信でフレームの整合性を保つように自動で補正する機能があれば良い。例えば、UDPでペイロードを変更した時にチェックサムを修正しなくても自動でログリプレイ送信側で補正など。
- 周期送信機能のオフセット対応と送信遅延処理を修正したい。
所感
- 送受信のみならず、様々な機能を追加してGUI操作できるツールに仕上がった。一方、プロトコルなど基本的なところは、まだ勉強の余地あり。副次的にではあるが、Pythonの理解も深まった。
- Linuxのシステムコールの方法を調査する必要があり、そこに苦労した。また、汎用OS上でSocketを使用している関係で、高頻度のフレームやシビアな時間要件には対応できないので、そのあたりが課題。
- GUIの操作と送受信の処理を同時に行う上で、threadの使用方法を理解することが難しかった。tkinterを使用したGUI作成の知識が深まったので今後活用していきたい。
- Scapyの理解が深まった。今後、Ethernetの動作確認を行う際に活用したい。
- 今回の活動を通じてPythonに触れられたのは良かった。また、いろいろな開発環境(VScodeやWSL)も使用したので今後の開発でも使用していきたい。
- 知見者に意見を求めながらツールを開発できたので、短い工数で良いツールが完成したと思う。反面、Ethernetのプロトコルについては深掘りできなかったので、今後深掘りしていきたい。