久しぶりにSさんから連絡、RTX30702枚刺しでLLMの14bモデルが動いたらしい、うらやま。RTX3060 12G早く再販されないかな~。

ここのところ、ずっとESP32のログ保存・送信部を調整してます。
Zabbixへの中継flaskへ少し大き目(5KB程度)のJSONを投げるとエラーになることが判明。JsonDocumentを文字列化し、一括POSTしていたのでスタックが足らなくなるらしい。
ESP32のデータ送信方式をJSONからファイル転送へ変更
ESP32では収集したデータをLittleFSへ蓄積する方式に変更したため、サーバー(Flask)側もファイルを直接受信できるように調整した。
当初は以下の流れで送信していた。
構造体保存データファイル(LittleFS)
↓
ファイル解析
↓
JsonDocument生成
↓
JSON文字列化
↓
HTTP POST送信
しかし、この方式では
- JSON生成処理のCPU負荷がある
- メモリ消費が増える
- 送信データ量が増える
という問題があった。
そこで、ファイルをそのままHTTP POSTで送信する方式へ変更した。
LittleFS上のファイル
↓
Fileストリーム取得
↓
application/octet-stream
↓
HTTP POST送信
ESP32側では HTTPClient::getStreamPtr() を利用してストリームを取得し、Content-Type に application/octet-stream を指定して送信する。
この方法に変更した結果、
- JSON変換処理が不要
- 送信データサイズが小さい
- 転送速度が向上
- 通信が安定
というメリットが得られた。
一方で、この方式はJSONのような標準フォーマットではないため、受信側(Flask)で独自にデータ解析を行う必要がある。
ただし、CSVや独自バイナリ形式などのデータをそのまま送信できるため、ESP32のようなリソースが限られた環境では有効な手法と考えられる。
特にESP32ではヒープやスタック不足が起きやすいので、
「JSONは人間やWeb APIには優しいが、ESP32には少し重い。ファイルをそのままストリーミング送信した方がシンプルで高速だった」
というのが今回のポイントですね。実際、6KB程度でも JsonDocument の生成や文字列化で一時的に数KB~十数KBの追加メモリを消費することがあります。