イケダム時計が一度バッテリーが切れて再起動すると、ひたすらおかしな時刻を指し示しているのが気の毒になってきたので、NTP に対応することにするのでした。
NTP を使うにはもちろんインターネット接続が必要で、 WiFi を使うことになります。
いまやぼくの中で聖典になっている m5paper-dashboard では WiFi へ接続するための ESSID とパスワードがソースコードに直書きになっているのだけれど、コード内にパスワードを書いてうっかり Github にアップロードすると大惨事なので、とここは変えたいなあと思って調べました。
SmartConfig という方法があって、設定待機モードに入って Android アプリの SmartConfig か iPhone アプリの Espressif Esptouch というアプリで無線設定ができるらしい。
のだけれど、これどういう仕組でスマホアプリからM5Paperに無線の情報を送るのかがイマイチ分からない。
M5Paper が一時的に AP になってそこにつなぎに行って、そこで無線の情報を送る…ということじゃないかなという気はするけれども、ちゃんとその辺の説明をしている資料が見つからない。
平文で送っていると書いてあるページもあったりして、うさんくさく感じたのでとりあえず今回は見送り。
(試してもいない)
M5Paper_FactoryTest では WiFi のアクセスポイントをリストアップして、選ぶとパスワード入力画面に行って…とできる画面があるので、それを流用できればいいのだけれど、なにぶん、再利用可能な形のコードになっていないのでした。
自前で UI を作ると大事業になるので、とりあえずは M5Paper の UI 上でアクセスポイントを選択できるようにするのは将来の目標にして、ソースコードには含めない形で設定をアップロードする、という方針としました。
M5Paper が使っているチップの esp32 のシリーズには SPIFFS という eps32 組み込みの Flash 領域をファイルシステムとして使えるようになっているので、以下の方針としました:
* PC から、ESSID とパスワードを書いたファイルを SPIFFS にアップロードする。
* イケダム時計は SPIFFS から WiFi への接続情報を読み込む
ただやっぱり WiFi のパスワードを平文で Flash に置くのは避けたいなあ…
と思って、なんとかならんかーというのも調べました。
少し調べると、パスワードを書かずに、ESSID とパスワードから計算される PSK (Pre shared key) を計算して書くという方法を案内している方もいるけれども、これってこの PSK を使ったら WiFi には接続できるわけで、意味ないんじゃないのかなあ。
最終的に、esp32 で暗号化を行う関数 esp_aes_crypt_cbc というのが提供されていることが分かったので、これで暗号化することとしました。
* PC から、ESSID とパスワードを書いたファイルを平文で SPIFFS にアップロードする。
* イケダム時計は SPIFFS から WiFi への接続情報を読み込む
* 設定情報が平文だったら、esp_aes_crypt_cbc() で暗号化して保存し直す。
* 設定情報が暗号文だったら、esp_aes_crypt_cbc() で複号して使う。
こんな感じの動作。
「保存し直す」とやったときに、前回の平文のデータがちゃんと上書きされているのか…は不明。