pythonでDoIP ~①事前検討~
今回はpythonでDoIPプロトコルの実装と、実際にローカル上でTCP/IPを使用したDoIP通信を実施したいと思います。
DoIPは3年ほど前に業務で取り扱った車載イーサネット用の診断プロトコルになるのですが、この度wiresharkがDoIP通信に対応していたことを知ったのでこちらも併せて紹介します。
DoIPとは
DoIP (Diagnostics over Internet Protocol)とは、メンテナンス用の外部テスト装置(診断機)と車両間の診断通信規格であり、ISO 13400 として標準化されています。
本通信は主にTCPとUDPを使用して接続した車両から情報を抽出したり、車両に対して要求(ファームウェアアップデート、管理情報更新等)を行うために使用します。
もともと車両用の通信診断プロトコルとして、CAN通信を前提としたUDS(Unified Diagnostic Services)が存在しております。
車両がイーサネット通信に対応を始めたことからDoIPが使用されるようになりました。
また、現状はDoIPプロトコルのペイロード部分にそのままUDSプロトコルを乗せることで、往来のUDSによる診断処理と互換性を持たせたまま車両の診断通信実施が行われております。
車載イーサネットについては少し以下で触れたので良ければこちらも参考にしてみてください。
略称がDo IP(IPを行う)なのも考案者のセンスが感じられてとても好きです。
今回はたまたま手元にあったISO 13400-2:2012(最新は2019)をもとに通信プロトコルの実装を行います。
wiresharkのアップデートについて
DoIPプロトコルの対応
組み込み機器にDoIPプロトコルを実装していた当時は、通信試験時の通信データ確認に難儀しておりました。
この度、最新のwiresharkではDoIPプロトコルがサポートされておりました。また驚いたのは、DoIPプロトコルの中のUDSプロトコルにまで対応してくれているところです。
もう少し早く対応してくれていればと思いつつも有り難く利用させていただきます。
ローカルネットワークのキャプチャ
今回は通常のPC内のローカルネットワーク(127.0.0.1等)で通信試験を実施するので、wiresharkのキャプチャ対象も通常のIFとは異なっております。
幸いこちらも最新のwiresharkでは対応済みでした。
使い方などは以下を参考にしてください。
実装イメージ
前提としてDoIPサーバとDoIPクライアントそれぞれを作成し通信を行います。
DoIPプロトコルはTCPとUDP両方使うため、サーバ側では両プロトコルにおける接続処理を、クライアント側では待ち受け処理を作成する必要があります。
また、今後応用が利くようにIPアドレスや各種パラメータの変更が出来るようなGUIに対応します。