ソース公開するArduinoプログラムに秘密情報を埋め込む
aoirint/RoomSystemSensorESP32: ESP32とFirebaseを使った部屋センシング・オンライン化 クライアントの開発中に Arduinoプログラム(.ino)にWiFiパスワード・APIキーなどの秘密情報を埋め込む必要が出てきた。 ここでは、Arduino IDEの主要機能を持つCLIソフトウェアarduino-cliを使う。 arduino/arduino-cli: Arduino command line interface arduino-cliの使い方については、別記事参照。 arduino-cliの使い方 - えやみぐさ 秘密情報の埋め込み 秘密情報の埋め込みには、以下のようなシェルスクリプトcompile.shを作成するのが楽でよい。 DEFINES=の部分の-Dから=までの文字列が定数名、=の右辺が定数値として 定義された状態でソースコードがコンパイルされる。 ここでは同ディレクトリの.envファイルを読み込んで使用する。 .envファイルのフォーマットはよくあるものと同じで、 改行で区切られ、#から始まる行を無視するKEY=VALUE形式のテキストファイル。 ボードへの書き込みには以下のupload.shのようなスクリプトを使うとよい。 screenコマンドをラップするスクリプトserialmon.shもおいておく。 compile.sh #!/bin/bash set -eu if [ -f .env ]; then echo "Found .env file." export $(cat .env | sed 's/#.*//g' | xargs) fi # ESP32-DevKitC FQBN="esp32:esp32:esp32" # Arduino UNO # FQBN="arduino:avr:uno" DEFINES="-DSECRET_WIFI_SSID=$WIFI_SSID" DEFINES="${DEFINES} -DSECRET_WIFI_PW=$WIFI_PW" DEFINES="${DEFINES} -DSECRET_FIREBASE_HOST=$FIREBASE_HOST" DEFINES="${DEFINES} -DSECRET_FIREBASE_AUTH=$FIREBASE_AUTH" SKETCH="$(basename $PWD).ino" arduino-cli compile \ -b "$FQBN" \ --build-properties \ "build.defines=${DEFINES}" \ "$SKETCH" "$@" プログラム側では以下のようにする。#xはコメントではないので注意(文字列リテラルとして展開するマクロ)。 ...