こんにちは、R&Dエンジニアの@k-tkrです。弊社で開発中しているスマートマットの通信挙動調査にSORACOM Arcを使っているので紹介させていただきます。
スマートショッピングで開発している「スマートマット」はWiFi経由で重量データをクラウドに送信するIoT機器です。 WiFi機器を設置できないなどの理由でインターネット回線に接続できない場所でもスマートマットを利用していただくために、セルラー回線経由でクラウドに情報を送る新たなスマートマットを開発しています。 このスマートマットでは下図のようにSORACOMサービスを通じてクラウドにアクセスします。
スマートマットとサーバー間での通信プログラムを開発する際に、「スマートマットのプログラム変更」「プログラムのビルド・書き込み」「クラウドと通信」「デバッグ情報を確認」という手順を踏む必要があるというのが煩わしく、また通信が失敗した際に原因がどこにあるのか(ハードウエアにあるのか通信設定の問題なのかサーバー側の問題なのか)を切り分けるのが難しかったので、PCからcurlを叩くような感覚で簡単にSORACOMサービス経由で通信を行いたいと考えていました。
昨年のSORACOM Discovery 2021 Onlineで発表されたSORACOM Arcがこの目的にちょうど合致しているようだったので今更ながら試してみたところとても便利で重宝しています。SORACOM Arcに関しては既にいろいろ記事が出ていますがWindows上でWSLからsoratunを使ったものはまだ見つからなかったので同じような環境でSORACOMを使用している方の参考になればと思っています。
バーチャルSIMを使って「PCからWiFi経由で」など任意のIPネットワークからSORACOMのプラットフォームにアクセスできるサービスです。これにより、SORACOM Air経由でSORACOMプラットフォームへアクセスしているスマートマットの動作をPCからエミュレートできるようになりました。
Windows 10 (SORACOM Arcを使っているのはWSL2上のUbuntu-20.04)
SORACOM ArcのUsersドキュメントが丁寧で充実しています。その中にあるsoratun で SORACOM API の認証キーを使用してバーチャル SIM/Subscriber をブートストラップするに沿って試してみました。soratun (sora-com tun-nel, ソラタン)はVirtualSIMの作成やSORACOM Arc経由での接続をサポートするSORACOM公式のクライアントエージェントです。
ここはドキュメント通りにSORACOMコンソールから行いました。その際に認証キーが発行されるのでコピーしておきます。ここでコピーしないと消えてしまうそうです(新しいキーを再発行することは可)。
soratunのドキュメントを読むとサポート対象がUbuntuとラズパイ、またサポート外ではあるもののmacOS Big Sur 以降で動作すると書かれていました。開発環境がWindowsなので早くもここで詰んだか、と思いましたが、最近のWindowsはWSL(Windows Subsystem for Linux)でLinux環境が充実してきているのでとりあえずWSL上のUbuntu-20.04にsoratunをインストールすることにしました。 GitHub repositoryのReleaseセクションからDLします。 soratunのバージョンは 1.1.6 で、AMD64用のファイル soratun1.1.6linux_amd64.tar.gz をダウンロードしインストールしました。
ここでVirtual SIMを作成します。SAMユーザー作成時に生成した認証キーIDと認証キーシークレットの入力を求められます。また作成するSIMのカバレッジタイプも求められます。 これでVirtual SIMが作成され構成ファイルが指定した場所に保存されました。catコマンドでファイルの中身を見てみるとSIMの情報とArcの接続情報が書かれています。
最後のステップです。ドキュメント通り
$ sudo soratun --config /path/to/arc.json up
と入力すると failed to create new tunnel: CreateTUN("soratun0") failed; /dev/net/tun does not exist というエラーが。WindowsでSORACOM Arcを利用している方がいないかと検索するとWindowsではWSL経由でもsoratunが使えないという情報がいくつか。なるほど...
SORACOM ArcのUsersドキュメントにはsoratunでの接続方法の他にWireGuardでの接続方法も記載されています(soratunの利用が推奨されていましたが)。こちらを試してみることにしました。
WireGuardの公式ページからソフトをダウンロードしWindowsにインストールします。
画面で トンネルの追加 > 空のトンネルを追加 を選択し、soratun bootstrapでSIMを作成したときに得られた構成ファイルから必要な情報をコピペします。ファイルと必要情報の対応が良く分からずなかなか動かなかったのですが、構成ファイルから以下のように情報をコピーすると動くようになりました。
[Interface]
PrivateKey = (privateKey)
Address = (arcClientPeerIpAddress)/32
[Peer]
PublicKey = (arcServerPeerPublicKey)
AllowedIPs = (arcAllowedIPs)
Endpoint = (arcServerEndpoint)
(ちなみにWireGuardでの接続方法のページにはSORACOMのコンソールからのVirtual SIM作成方法も書かれており、その手順でSIMを作成するとSIMの登録完了時に上の接続情報そのものがコンソール画面上に表示されました。)
WireGuardの有効化ボタンを押してトンネルを作成したあと、接続確認のため
$ ping pong.soracom.io
を試すと、めでたくpongが返ってきました。
スマートマットとSORACOMサービス間の通信はUDPで行っているのでPCからそれがエミュレートできるか試してみました。SORACOM BeamへUDP接続するためにncコマンド
nc -u beam.soracom.io 23080
を送り、マットから送信すべきJSON文字列を送るとSORACOM Beam経由でサーバーからレスポンスが取得できました!
実用上はこれで問題なくなったのですが、soratunが使えないのはどこか気持ち悪いので再チャレンジしてみました。 soratunのバージョンを最新の(2022年2月17日現在) 1.2.0 にしてみましたが同じエラーが返ってきました。 そこでWSL上で動いていたUbuntuをWSL2上で動くように変更してみました。
$ wsl --set-version Ubuntu-20.04 2
この際Ubuntuを起動させようとすると「実行しようとした操作は、参照したオブジェクトの種類ではサポートされていません」エラーが出るようになったので以下のコマンドを叩く必要がありました。Winsock module breaks WSL2という問題のようです。
$ .\NoLsp.exe c:\windows\system32\wsl.exe
WSL2上のUbuntu-20.04で soratun up を叩いてみたところ成功しました! この後soratunのバージョンを再度 1.1.6 に落として試してみたのですが同様に成功したのでWSLをWSL2に変更したことが効いているようです。ただ以前WSL2でもsoratunが動かなかったという情報もあったので、WSL2関連の最近のアップデートによって動くようになったのかもしれません。
SORACOM Arcを使うことでこれまで実機経由でしか試せなかった通信テストがPCから気軽に行えるようになり、通信テストのためにマイコンを触ることが最小限になったので開発効率が大きく改善しました。SORACOM公式ツールであるsoratunがWindows上から使えないのは気になっていてずっとWireGuardを使っていたのですが今回WSL2上でsoratunが動くことが確認できたのでよかったです。