WSL2でintdash Edge Agentを動かしてみました

f:id:aptpod_tech-writer:20201022201659p:plain

エンベデッドチーム 久保田です。

開発環境をWSL2 (Windows Subsystem for Linux)へ移行しました。 タイミングよく、「WSL2でUSBデバイスを使ってみよう」という記事が出回っていたので、aptpod CAN-USB Interface (AP-CT2A) もWSL2で動かせるのではないかという期待からintdash Edge Agent 含めて動作環境を整えてみましたのでご紹介します。

元記事

Adding USB support to WSL2
https://github.com/rpasek/usbip-wsl2-instructions

USB support to WSL2
http://ktkr3d.github.io/2020/07/06/USB-support-to-WSL2/

intdash Edge Agent とは

intdash Edge Agentは、intdash Edgeの基本機能を提供するエッジデバイス用のエージェントソフトウェアです。ユーザーは、接続するデバイスに応じたプラグインであるDevice Connectorを実装するだけで、様々なデバイスをintdashに接続することができます。このソフトウェアを使用すれば、intdash Edge が提供する自動再送、データ流量の制御といった、エッジ側の基本機能を利用したクライアントアプリケーションを、最小限の追加実装で開発することが可能となります。

アイコン

aptpod CAN-USB Interface - AP-CT2A とは

CANバスをターミナルアプライアンスに接続し、CAN、J1939などの制御信号を取得するためのインターフェイスデバイス

アイコン

  • 分岐線を使用して同時に2チャンネルのCANバスに接続可能
  • CANデータに対する高精度なハードウェアタイムスタンピングが可能
  • クロックの共有機構により、複数のCAN-USB Interface間のタイムスタンプを同期
  • 外部計測装置などへの同期信号の出力が可能

動作構成

f:id:aptpod_tech-writer:20201023064727p:plain
動作構成

WSL2 (Ubuntu 20.04)には、intdash Edge Agent, AP-CT2A device driverをbuild, installします。
WSL2は現時点(2020/10)で、残念ながらUSBデバイスの直接接続をサポートしていませんので、USB over IP経由でWindows側のAP-CT2Aを接続してみます。

WSL2とは

WSL2は、Linux 用 Windows サブシステムが Windows 上で Linux バイナリを実行できるようにしたLinux 用 Windows サブシステム アーキテクチャの新しいバージョンです。 WSL1との違いは、ファイル システムのパフォーマンスを向上すること、システム コールの完全な互換性を追加することです。
WSL2 の初期リリースでは、ハードウェア アクセスのサポートが制限され、GPU、シリアル、USB デバイスに直接アクセスすることはできません。

アイコン 図. WSL1 と WSL2 の命令実行の比較

「WSLのアーキテクチャ https://roy-n-roy.github.io/Windows/WSL%EF%BC%86%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A/Architecture/ 」から

USB over IPとは

USB over IPは、USBコマンドをIPパケットによってカプセル化するデバイス制御方法です。

f:id:aptpod_tech-writer:20201022184524p:plain
USB/IP Design

「USB/IP PROJECT http://usbip.sourceforge.net/」から

手順

Windows側

USB/IPのstubドライバを配布サイト (https://github.com/cezanne/usbip-win) からダウンロードします。
https://github.com/cezanne/usbip-win/releases/tag/v0.1.0

PS C:\usbip-win\0.1.0> dir


    ディレクトリ: C:\usbip-win\0.1.0


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2020/07/11     14:05         551472 usb.ids
-a----        2020/07/11     14:05        1434112 usbip.exe
-a----        2020/07/11     14:07        1364992 usbipd.exe
-a----        2020/07/11     14:05            762 usbip_stub.cer
-a----        2020/07/11     14:05           1951 usbip_stub.inx
-a----        2020/07/11     14:07          58384 usbip_stub.sys
-a----        2020/07/11     14:05           2486 usbip_test.pfx
-a----        2020/07/11     14:05           2316 usbip_vhci.cat
-a----        2020/07/11     14:05            762 usbip_vhci.cer
-a----        2020/07/11     14:05           1960 usbip_vhci.inf
-a----        2020/07/11     14:05          87344 usbip_vhci.sys

バイナリをダウンロードしたディレクトリでstubドライバをインストールします。

PS C:\usbip-win\0.1.0> .\usbip.exe install

AP-CT2AをWindowsのUSBポートに接続すると、usbipコマンドでUSB接続が表示されます。

PS C:\usbip-win\0.1.0> .\usbip.exe list -l
 - busid 1-123 (32b2:0100)
   unknown vendor : unknown product (32b2:0100)    <= これ
 - busid 1-138 (8087:0a2b)
   Intel Corp. : unknown product (8087:0a2b)
 - busid 1-99 (093a:2510)
   Pixart Imaging, Inc. : Optical Mouse (093a:2510)
 - busid 1-236 (5986:111c)
   Acer, Inc : unknown product (5986:111c)

usbipコマンドでUSB/IPの接続登録を実行します。

PS C:\usbip-win\0.1.0> .\usbip.exe bind -b 1-123
usbip: info: bind_device: bind device on busid 1-123: complete

usbipdコマンドでWSL2側からの接続待ちにします。

PS C:\usbip-win\0.1.0> .\usbipd.exe -d -4
usbipd: info: starting usbipd (usbip 1.0.0)
usbip: debug: C:\work\usbip-win\userspace\src\usbipd\usbipd_sock.c:38:[build_sockfd] opening 0.0.0.0:3240
usbip: info: listening on 0.0.0.0:3240    

WSL2側

Windows側で待ち受けているポートへ接続します。

$ sudo usbip attach --remote=192.168.1.8 --busid=1-123

接続が完了すると、WSL2側にAP-CT2Aが現れます

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 32b2:0100 aptpod, Inc. AP-CT2A
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

動作結果

f:id:aptpod_tech-writer:20201022185803p:plain
動作結果

CANを流してみると、無事受信できました。
USB/IP経由することでCPU負荷が大きくなるかと考えていましたが、PCがCore i7なので余裕でした。
・・・が、何かのきっかけで受信が0になります。エラーとなるわけではないので、USB/IPドライバの不具合かと。正常に動かすには調整が必要なようです。

まとめ

WSL2でのintdash Edge Agentの動作手順を簡単に紹介しました。
結果AP-CT2Aは正常に継続動作しませんでしたが、intdash Edge Agentの動作は問題ありません。
CPUがパワフルなので、AP-CT2AのWindowsネイティブドライバがあれば、CANデータをTCPで転送してDevice Connectorで回収する手段も取れなくはなさそうです。
WSL2のUSBデバイス正式対応に期待しましょう。

参考 (WSL2の導入)

WSL2導入|WinアップデートからWSL2を既定にするまでのスクショ
https://qiita.com/tomokei5634/items/27504849bb4353d8fef8

WSL2におけるVcXsrvの設定
https://qiita.com/ryoi084/items/0dff11134592d0bb895c

WSL2によるホストのメモリ枯渇を防ぐための暫定対処
https://qiita.com/yoichiwo7/items/e3e13b6fe2f32c4c6120