🌡️

SORACOM Arc への接続情報をスケッチに書かないための方法

2021/08/31に公開

WireGuard-ESP32 について

M5 Stack や M5 Stick など ESP32 系のマイコンから、SORACOM Arc に接続したい時には、Ida さんこと @ciniml さん作成の WireGuard-ESP32 があります(有用なライブラリ、ありがとうございます!!)。

https://github.com/ciniml/ESP32_WireGuard
https://github.com/ciniml/WireGuard-ESP32-Arduino

自分は今だに Arduino IDE で書くことが多いので、Arduino Lib 版を使わせていただいております。

何か作ってみよう

さて M5StickC PlusENV II HAT を組み合わせて、小型のセンサーノードとして使おうということで、3セット購入しました。

WireGuard-ESP32-Arduino のサンプルコードを見ていただければ分かる通り、WiFi の接続情報や WireGuard の初期化に必要なパラメータがいくつかあります。

uptime_post.ino から抜粋
// WiFi configuration --- UPDATE this configuration for your WiFi AP
char ssid[] = "ssid";
char password[] = "password";

// WireGuard configuration --- UPDATE this configuration from JSON
char private_key[] = "(Private Key) ";  // [Interface] PrivateKey
IPAddress local_ip(1,2,3,4);            // [Interface] Address
char public_key[] = "(Public Key)";     // [Peer] PublicKey
char endpoint_address[] = "link.arc.soracom.io";    // [Peer] Endpoint
int endpoint_port = 11010;              // [Peer] Endpoint

WireGuard の接続情報は SORACOM ユーザーコンソールで Virtual Subscriber を払い出す時に出てきますので、これをプログラムで指定することで SORACOM Arc への接続が可能となります。

プログラムを更新するたびに、コメントアウトを駆使して、個体ごとに異なる WireGuard の接続情報を切り替えてスケッチを書き込んでいたのですが、途中で間違えた接続情報を書いちゃったりして、パニックになってしまいました。

プログラムコード内に秘密情報を入れちゃうのもあんまりよくないなぁということで、接続情報をスケッチに書かずに別の場所に書いておけないかなぁと思いました。

WiFiManager というのがあるらしい

ESP8266/ESP32で、WiFi 接続情報の設定や自動接続を管理するライブラリとして、WiFiManager というものがあるようです。
https://github.com/tzapu/WiFiManager/

下記の Qiita の記事を参考にして、いろいろ試してみたところ、手元の M5 StickC で動かせました。
https://qiita.com/mhama/items/ff5ae397a853aa4f8d48

これをベースに WiFiManager ライブラリの ParamsChildClass example を参考にして、WireGuard 情報を追加で入力・保存できるようにしてみたのが、こちらのサンプルスケッチです。

https://github.com/j3tm0t0/auto-arc-esp32

初期化処理の部分を見ていただくと、接続処理の部分がシンプルになってるのがわかります。

auto-arc-esp32.ino より抜粋
void setup()
{
  Serial.begin(115200);
  Serial.println("M5StickC started.");
  M5.begin();
  setupArc();
}

使い方

起動時に電源ボタンを押すと設定モードに入り、アクセスポイントになりますので、スマホなどで接続します。
ESP32_ で始まる AP に接続します。

すると、キャプティブポータル(ログイン画面)として、設定画面にアクセスできるので、Configure WiFi を選びます。

SSID をリストから選び、パスフレーズを入れた後、WireGuard の接続情報を入れていきます。

Save を押すと設定情報が EEPROM に保存され、次回起動時には EEPROM から保存した設定情報が読み出されて自動的に WireGuard に接続されます。

とっても簡単でしょう?

IDE からスケッチを更新したとしても(EEPROM に保存されたデータのフォーマットが変わらなければ)、そのまま自動的に接続することができます。便利!

TODO

  • 初期状態の問題
    一番最初に起動した時にはメモリ上のゴミを拾ってしまうので、ヘッダーとして "ARC" のような文字列を入れておいてチェックをするようにしたい。

  • セキュリティ
    残念ながら安全ではありません。EEPROM の内容を抜き出すようなプログラムを動かすことで、保存されている情報に簡単にアクセス出来てしまいます(その前にシリアルのデバッグログにも出しちゃってますが)。なんらかの方法でせめて難読化はしておきたいところです。
    現状は、あくまでもスケッチに書かなくて良い、という点だけをクリアしていますので、ご注意ください!

で、センサーノードの方はどうなった?

一応動いてはいるんですが、WiFiManager 対応や、省電力(間欠動作)の対応がまだ出来てないので、完成したら公開します!

Discussion