06/14(日)🚙伊勢

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

Sさんグラボ2枚刺し

ここのところ、ずっと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の追加メモリを消費することがあります。

コメントする