
はじめに
IoTを開発するに当たり、まずみんなが欲しいと思う機能がソフトの自動アップデート機能(OTA)です。
ESP32を使ったOTAは様々なところで紹介されていますが、そのほとんどがwifiローカルネットワーク内での更新で、リモートサーバから遠隔経由でのソフト書き込み事例はほとんどないです。
商用のものでよければ、Amazon IoTとかを利用すればいいんですけど、無料でやる方法が以下のサイトで書かれていたので実際に試してみました。
http://www.lucadentella.it/en/2018/10/27/esp32-37-ota-via-https/
ESP32のプログラム内にあらかじめソフト更新処理を仕込んでおいて、約10秒おきにサーバーのjsonファイルを参照するタスクを組み、バージョンUPを検知したらESPソフト更新を始めるというものです。
今回やることは以下となります。
要件
- ユーザが何もしなくても常に最新のソフトでIoT端末が動作
- https(SSL)経由でセキュアにソフトを更新
- 開発環境はVisual Studio Code + PlatformIO + ESP-IDF
ソースはコチラ。以下要点を記載。
WIFIの設定
wifi_functions.h に自身のwifi情報を書く。
#define WIFI_SSID "your-ssid"
#define WIFI_PASS "your-password"
OTA用にESP32のパーティション領域を確保する
costom.csvにESP32のパーティション領域の設定を書く。ざっくり説明すると、
nvs:ブートローダー領域、phy_init:python起動領域?、factory:工場出荷領域、otadata:ota情報本体、ota_0,ota_1:ソフト書き込み時のスワップ領域で二つが必要となる。順番が大事みたいで下手に順番入れ替えると動かくなるので注意。
# Name, Type, SubType, Offset, Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs, data, nvs, , 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 1M,
otadata, data, ota, , 0x2000,
ota_0, app, ota_0, , 1M,
ota_1, app, ota_1, , 1M,
SSL証明書の設定
証明書が server_certs/certs.pem にあるとすると、証明書の呼び出し方は以下となる。
// server certificates
extern const char server_cert_pem_start[] asm("_binary_server_certs_certs_pem_start");
extern const char server_cert_pem_end[] asm("_binary_server_certs_certs_pem_end");
コンパイル設定(PlatformIO Project Configuration)
platformio.iniに環境設定を書く。
・シリアルモニタのボーレートを115200に合わせて文字化け対策。
・パーティション領域の定義ファイル
custom.csvを指定。
・証明書を内包してコンパイルさせるために場合は、
certs.pemを指定。
[env:esp32dev]
platform = espressif32
framework = espidf
board = esp32dev
monitor_speed = 115200
board_build.partitions = custom.csv
build_flags =
-DCOMPONENT_EMBED_TXTFILES=server_certs/certs.pem