自宅用通知マシン作成(2)

自宅用通知マシン作成(1)で自宅用の予約通知端末がとりあえずできたので、次は家から店に呼び出しできる機能を作る。

今は携帯で呼び出しているけど、ゆるふわろぼっとに呼び出された方が雰囲気的にも店を一時抜け出しやすそうなのでスタックチャンぽいやつで作ることにする。

書いている途中でみつけた。こちらのイメージなやつ

ハードは息子がしばらく使っていないM5Stack Basicがあったのでそいつを使用。同じ時期に買ったやつの紙にCore1.0と書いてあるので1.0なのかな。いずれにせよだいぶ古いバージョン。

開発環境構築

Arduino IDE2.3.2を使用しているけどかど開発環境出来ていなかったのでインストール。

File->Prefarence->Additional boards manager urlsに公式のURLを追記

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

tools->boods:hogeを選びboards managerからm5stack by m5stack officialをインストール

tools->boods:hogeからM5stack->m5coreを選択

file->examples->m5stack->Basics->FactoryTestを選びUploadを実行。なんとなく動いて要るっぽいことを確認する。

とりあえず顔をだす(M5avatar準備)

顔がないと始まらないので準備。こちらを参考にライブラリインストール。(と思ったら古いのがすでにいたので新しいものに上書き)

最近は、M5Stack.hみたいに機種ごとのライブラリをインクルードするのではなく、大体の機種をカバーしているM5Unified.hをインクルードして作るらしい。今のM5Avatarもそれを使っているということだろう。

M5Unifiedはライブラリマネージャーから入れられるとのことなのでインストール。#include <M5Stack.h>#include <M5Unified.h>に変更しコンパイル&アップロードで動いた。

ずいぶんコンパイルが重い。と思ったら、二度目から軽くなった。IDE1系の時と違い設定しなくてもコンパイル結果キャッシュするようになったのかな?普段重いものコンパイルしないから気づかなかった。

とりあえず声を出す

M5UnifiedのExampleに音声再生があったのでそれで試す。

File->Example->M5Unified->Advanced->Speaker_SD_wav_fileを選択。

MP3_with_ESP8266Audio.inoというのが開いた。中身もmp3用っぽいけど細かいことは気にしない。

/// need ESP8266Audio library. ( URL : https://github.com/earlephilhower/ESP8266Audio/ )

サンプルソースに上のコメントがある。昔入れたと思われるのが入っていたのでそれを使う。はいっていたのは下のlibrary.propertiesで今日時点で最新ぽい。ただコミットに合わせてバージョン上げてはいなそう。

name=ESP8266Audio
version=1.9.7
/// set your mp3 filename
static constexpr const char* filename[] =
{
  "/mp3/file01.mp3",
  "/mp3/file02.mp3",
  "/mp3/file03.mp3",
  "/mp3/file04.mp3",
};

mp3ファイル4つ(手元にたまたまあったやつ)をサンプルソースに書いてある上記のファイル名にリネームしてをSDカードに放り込み実行。

とりあえず音は割れまくりだが動いたっぽい。試しに他のM5Stackに入れたら音は(比較すると)ほぼ割れなかった。その後、音が変なM5Stackのアンプに直接、代わりのスピーカーを繋げたらそっちはきちんと聞こえた。スピーカー自体がお亡くなりっぽい。

サンプルソースの中身を理解する作業メモはこちらに置いておいた。

この先はこちら

ESP Touchがつながらない時のチェックポイントメモ

なかなかつながらなくて調べたのでメモ。未検証も含む

接続先Wifiが分離モードになっていないか

分離モード(呼び名は色々ある)になっているとつながらなそう

WPAの世代が古くないか

古い親機でWPAが昔のタイプだとセキュリティが弱いのでそのままだとつながらない

してやるかそれでもダメな場合はESP8266のライブラリをver.2.0.0まで戻す。

esp-touchでブロードキャスト、マルチキャストを変更してみる

スマホアプリ側でブロードキャスト、マルチキャストを変更してみる。理由はわからないがこれで動いた。

「chan_shutdown_read: channel 1: shutdown() failed for fd 7 [i0 o0]: Not a socket」と怒られる

chan_shutdown_read: channel 1: shutdown() failed for fd 7 [i0 o0]: Not a socket

ubustsuのlinuxサーバ(VPS)からgithubにつなげようとしたら上記メッセージが出てうまくいかなかった。

※2024/3/15手順追記

環境

サーバ

  • Ubuntu 22.04.4 LTS \n \l
  • OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

操作端末

  • Windows11

原因

おそらくこちらにあるWindows側でのssh-agentが悪さしているよう。

事象的にはWindows側のssh-agentがForwardAgent yes設定にてカギをもってサーバに入っているけどそいつが見れなくなって要るっぽい

きちんと直すならばこちらの対応でいけたそう

対処

Windows側のssh-agentの問題らしいのでベータに変えたら解消したっぽい。(細かい原因追っていないのでちょっと怪しい)

手順としては管理者権限のPowerShellで以下を順次実施

インストール済みOPENSSHの削除

Microsoft.OpenSSH.Betaのインストール

※2024/3/15手順追記

1週間ほどしたらvscodeターミナルからsshが通らなくなっていた。パスを確認したところ昔のC:\Windows\system32\OpenSSHを指していて、今のC:\Program Files\OpenSSHを指していない。

個人用環境変数にC:\Program Files\OpenSSHを追加した。

細かいところで、1週間ぐらいたって通らなくなったのでWindowsアップデート等で書き換わった可能性もある。C:\Windows\system32\OpenSSHはシステム全体の環境変数に入っていたので、そちらがまた書き換わる可能性を考え個人用の環境変数の方に入れてみた。(どれだけ効果あるかや本当にWindowsUpdate絡みか確認していない。またおかしくなったらこれみて思い出す)

自宅用通知マシン作成(1)

店の予約が入ったときすぐ気づきたいとか、店から自宅に呼び出しかけたりとか細々としたとこ改善したいので自宅用通知マシンを作成開始する。

第一段階としては、店に予約が入ったときにすぐ気づけるように予約が入ったら通知としてLEDを光らせる機能をつくる。

予約が入ったらじゃらんとかアソビューから通知メールが飛んでくる。数分以内に気づけたら十分なので、自宅側の通知マシンから定期的に通知メールがあるか確認する方式にする。

ちなみにメールサーバは自前(VPS)でpostfix&dovecotなのでそっちで一部処理しておく。自宅側の端末はESP8266(ESP-WROOM-02)で作成する。秋月で現在420円するので今ならESP-WROOM-32とほとんど値段変わらないのでそっち使ってもよい。(200円台の時に買ったのが数10個余っているので消費もかねて)

全体構成

  1. VPS上メールサーバのdovecotに予約メールが入ったときに、表題をみてメールを指定フォルダに振り分け。使用ツールはseive
  2. メールサーバ上にpythonで立てた未読予約メールカウント返却APIを準備。(最前面はnginx)
  3. espからAPIを定期的に呼び出し、未読の予約メールがあったらLEDを光らせて通知する。(既読にするのはPC上のメーラーで)

メールサーバサイド

seiveの設定

seiveで予約メールが届いた際に指定フォルダ(今回はINBOX.ジム.予約)に振り分け。(seiveのインストールは手順まとめていない。)

予約メールはとりあえず件名で判断。設定ファイルは以下。件名がXXだったらYYフォルダに振り分ける。

APIの準備

以前書いていた。こちら

APIのサービス化

/etc/systemd/system/mailapi.service作成

※ ~/apiをベースパスにしていたけどgit cloneの時のパスがずれたので後ほど~/yobidashi/server/apiに変更

一応メールアカウントとパスワードは外部から読み出しに(/home/yoshitake/api/mailapi.conf)

サービスに登録

ArduinoIDE2系のLittleFSプラグインインストール

ESP8266(とRaspberryPI picoもらしい)で使える簡易ファイルシステムLittleFS用のプラグインをインストールする。ちなみに手順はArduinoIDE2系用。こちらのページのインストール手順実施記録。

1系はこちら

まずはリリースページからvsixファイルをダウントード。

C:\Users\<username>\.arduinoIDEにpluginsフォルダを作ってその中にダウンロードしたvsixをいれる。

その後、ArduinoIDE再起動。

スケッチのあるフォルダにdataという名前でフォルダ作成。

IDEのToolsメニューから自分のマイコンにあったフラッシュメモリのサイズを選択。

[Ctrl] + [Shift] + [P]から ‘Upload Little FS to Pico/ESP8266‘ を選択し、(リセットボタン押したりするプログラム書き込みモードで)アップロード実行。

PermissionError発生(文字化けしているところは「アクセスできません」のはず)。とりあえず、flashの容量確認。

容量も想定通り。

色々調べてる途中で気づいた。動作確認のためIDEのシリアルモニター起動したけどこいつが握っているせいでファイルシステム書き込み側のesptool.pyが握れていないだけだった。

IDEのシリアルモニタの窓を閉じたのちに再度実行したら書きこめた。

ESP8266用(BearSSL_CertStore.ino)のSSL接続用ファイル更新

ESP8266(ESP-WROOM-02)の内容。ESP-WROOM-32ではないので注意。

コマンドプロンプトにて

足りないメッセージが出た。

Traceback (most recent call last):
  File "C:\Users\kitam\Documents\ArduinoData\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WiFi\examples\BearSSL_CertStore\certs-from-mozilla.py", line 28, in <module>
    raise Exception("You need the program 'ar' from xtensa-lx106-elf found here: (esp8266-arduino-core)/hardware/esp8266com/esp8266/tools/xtensa-lx106-elf/xtensa-lx106-elf/bin/ar")
Exception: You need the program 'ar' from xtensa-lx106-elf found here: (esp8266-arduino-core)/hardware/esp8266com/esp8266/tools/xtensa-lx106-elf/xtensa-lx106-elf/bin/ar

ar.exeのコピー

メッセージとパスがだいぶ違うけど下にいた。microsoftストアから入れると触れないところにあるかも。

C:\Users\kitam\AppData\Local\Arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.1.0-gcc10.3-e5f9fec\xtensa-lx106-elf\bin

公式のexampleフォルダの中で作業したくないので、exampleのBearSSL_CertStore.inoをとりあえずデスクトップに保存。 デスクトップに作ったフォルダにar.exeを保存

opensslのインストール

実行したら、opensslもいると

メッセージにあるURLにwindowsのバイナリなかったのでこちらから落とす。とりあえず最新の3.2.1のexe。

ダブルクリックしてインストール。path通すと他のツール類と重なりそうなのでとりあえずパスの設定は一時的。

pythonの動作文字コード一時変更

一見動いてそうに見えたけどエラー出ている

C:\Users\kitam\Desktop\BearSSL_CertStore>python certs-from-mozilla.py > out.txt
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Warning: Reading certificate from stdin since no -in or -new option is given
Traceback (most recent call last):
  File "C:\Users\kitam\Desktop\BearSSL_CertStore\certs-from-mozilla.py", line 64, in <module>
    print(names[i] + " -> " + certName)
UnicodeEncodeError: 'cp932' codec can't encode character '\xf3' in position 24: illegal multibyte sequence
 C:\Users\kitam\Desktop\BearSSL_CertStore\data のディレクトリ

2024/02/29  13:54    <DIR>          .
2024/02/29  13:54    <DIR>          ..
2024/02/29  13:54             1,463 ca_000.der
2024/02/29  13:54               837 ca_001.der
2024/02/29  13:54             1,349 ca_002.der
2024/02/29  13:54               442 ca_003.der
2024/02/29  13:54               502 ca_004.der
2024/02/29  13:54             1,011 ca_005.der
2024/02/29  13:54               784 ca_006.der
2024/02/29  13:54               617 ca_007.der
2024/02/29  13:54               959 ca_008.der
2024/02/29  13:54             1,494 ca_009.der
2024/02/29  13:54             1,476 ca_010.der
2024/02/29  13:54             1,560 ca_011.der
2024/02/29  13:54             1,523 ca_012.der
              13 個のファイル              14,017 バイト
               2 個のディレクトリ  21,649,969,152 バイトの空き領域

data/certs.arというファイルが一つできるはずだが中間ファイルの生成途中で終わっている。

pythoの文字コードを一時UTF8に。

改めて実行。

できた模様。

アップロードの手順はこちら

ArduinoIDEのRasberry Pi PicoボードマネージャーとWindowsの組み合わせでフォルダを握りっぱなしになっている

環境

  • Windows 11 Home 22H2 22621.3155
  • Arduino IDE 2.3.2(おそらく2.2.2-nightly-20230909が自動アップデートかかったもの)
  • python3.10(PCのやつでなくボードマネージャー個別のpythonが指定されていた)
  • Rasberry Pi Pico/PR2040 3.7.2(ボードマネージャー) <- 調査完了してないがこいつが原因
  • python3.7.2(PCのやつでなくボードマネージャー個別のpython)

状況

調査の過程でボードマネージャーからRasberry Pi Pico/PR2040をアンインストール(remove)と再インストールした時点で再現しなくなってしまったので再現待ち。多分根本解決していない。

事象

ArduinoIDEでスケッチを開いた後にスケッチの入っているフォルダを移動させようとすると「別のプログラムがこのフォルダーまたはファイルを開いているので操作を完了できません」というメッセージが表示される。リソースモニターから見るとpython3が握っていることになっている。

なお、リソースモニターはwindowsの下タブにある検索に perfmon.exe /res と入力すると起動できる。(初回はなにか選択画面出たかも)CPUタブの下にある関連付けされたハンドルにフォルダの古パスを入力すると握っているプロセス名とPIDがわかる。

取り急ぎリソースモニターの下の関連付けられたハンドルに出てきたプロセスを右クリックで終了させると解放されるけど気持ち悪い。

調査(中)

プロセス確認

MSのプロセスツリーを確認できるツールをダウンロード&解凍。dosからたたいてプロセス確認。

IDE起動中にPID9552でpythonが起動していたが、閉じたところ

単独でプロセスがのこってしまっている。

ネットをパッと見る限り情報なさそう。

ちなみに以前使っていたArduinoIDE1.8.19を起動したところ1.8.19では発生せず。2になる時に根本的に変わっているので2系の問題っぽい。

上のプロセスツリーを見る限りArduino IDEが動かしているarduino-cliが動かしているpython3がフォルダをにぎりっぱになっているのだろう。

とりあえずタスクマネージャーから引っ張ってきた怪しげなところの起動時引数が下。

名前 PID 状態 ユーザー名 CPU メモリ (アクティブなプライベート ワーキング セット) コマンド ライン アーキテクチャ 説明
arduino-cli.exe 10208 実行中 kitam 00 88,832 K "C:\Users\kitam\AppData\Local\Programs\Arduino IDE\resources\app\lib\backend\resources\arduino-cli.exe" daemon --port 0 --config-file c:\Users\kitam\.arduinoIDE\arduino-cli.yaml -v x64 arduino-cli.exe
名前 PID 状態 ユーザー名 CPU メモリ (アクティブなプライベート ワーキング セット) コマンド ライン アーキテクチャ 説明
python3.exe 15928 実行中 kitam 00 4,112 K C:\Users\kitam\AppData\Local\Arduino15\packages\rp2040\tools\pqt-python3\1.0.1-base-3a57aed/python3 -I C:\Users\kitam\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.7.2/tools/pluggable_discovery.py x86 Python

rp2040といっているのでraspi pico用のやつが悪さしているっぽい。

試しにボードマネージャーからRasberry Pi Pico/PR2040をアンインストール(remove)するとpythonのプ℟セス立ち上がらなくなり閉じたあともきちんと解放されるようになった。

ちなみに以下のjsonで指定しているもの。

原因ソース

多分こちら。スレッドのグローバル変数を外部から操作する思想みたいだが、操作元がいない模様。

どうしよう。

と、思っていたところ再インストールした時点で予想外に再現しなくなったので再現待ち。多分解決しておらず、なにかトリガーになるアクションを踏んでいない。

BrokenPipeError: [Errno 32] Broken pipe調査

ESP8266(ESP-WROOM-02)の内容。ESP-WROOM-32ではないので注意。

事象

esp8266 -> nginx(proxy) -> python(HTTPServer)という構成でサーバへespからサーバーへリクエストを投げたところ、かなりの確率で以下のログがpythonで吐かれていた。

Exception occurred during processing of request from ('127.0.0.1', 48024)
Traceback (most recent call last):
  File "/usr/lib/python3.10/socketserver.py", line 316, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python3.10/socketserver.py", line 347, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python3.10/socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.10/socketserver.py", line 747, in __init__
    self.handle()
  File "/usr/lib/python3.10/http/server.py", line 433, in handle
    self.handle_one_request()
  File "/usr/lib/python3.10/http/server.py", line 421, in handle_one_request
    method()
  File "/home/yoshitake/api/mail_api.py", line 26, in do_GET
    self.wfile.write(response_content)
  File "/usr/lib/python3.10/socketserver.py", line 826, in write
    self._sock.sendall(b)
BrokenPipeError: [Errno 32] Broken pipe

直接のメッセージは、pythonがリクエスト元に書きこもうとしたら相手がすでに受信待ち状態を終了しているような場合に起きるやつ。esp側では接続したもののヘッダーも取得せずにすぐに終了している。

ちなみにnginxのaccess.logには以下のようにステータス499と(pythonのHTTPServer他で使われている非標準の)クライアントが先に閉じたよというのが残っている。

150.9.94.220 - - [26/Feb/2024:11:31:56 +0900] "GET /api/reserve_count HTTP/1.0" 499 0 "-" "ESP8266"

直接の原因箇所

リクエストを送るesp側でデータの受信待ちをしなくてすぐに閉じているのが直接の原因

delay(1000);とかを入れたらとりあえず動く。

とはいえ、リクエストを送ったのちにデータ受信後の終了信号的なものをみたらまたはタイムアウトでクローズの方がよさそう。

また、同じ接続方式でself-signed.badssl.comにリクエストを送るとレスポンスがきちんと取得できているのでサーバサイドにも何か改善点がありそう。

根本解決

クライアントサイド(ESP8266)

取り急ぎavailable()では接続できたかしか確認していない。 WiFiServerSecureBearSSL.cpp(サーバの方)を間違えてみていた。

改めてWiFiClientSecureBearSSL.cpp確認。

字面で見る限りなんか入ってたら0以外が入って、なにも入っていないとサーバ側が準備中でも一番下に入って0がくるっぽい。だいぶ中の方に書いてあるので内部データを見ると色々多変そうなので最初のデータ来るかタイムアウトまでの待ち処理を入れるのがよさそう。断続的にデータがくるならちゃんと終端処理を見た方がよいかも。

本体から、書き出しメソッド呼び出し。

サーバサイド(nginx+pythonのHTTPServer)

こちらは単純にレスポンスが早く返りだすかどうかで違いが出ていたっぽい。レスポンスが早いという理由だった場合はクライアント側の処理で解決すべき話なので深く追わない。

ESP8266用(BearSSL_Validation.ino)のSSL接続用ファイル更新

ESP8266(ESP-WROOM-02)の内容。ESP-WROOM-32ではないので注意。

こちらのBearSSL_Validation.ino事前準備の手順。試している環境はWindows11。

前提

BearSSL_Validation.inoと同じディレクトリにあるcerts.hだが、サーバ側の証明書が更新されているとつながらなかったりする。(レポジトリ側の更新タイミング次第ではつながったりつながらなかったりだと思う)

certs.hを見ると下のように書いてあり

// this file is autogenerated - any modification will be overwritten
// unused symbols will not be linked in the final binary
// generated on 2023-03-20 23:02:42
// by ['../../../../tools/cert.py', '-s', 'www.example.com', '-n', 'SSL']

して更新するらしい。他のドメイン用に作る場合もおそらくcert.pyをたたけばよいと思う。

なお、cert.pyのファイル先頭コメント

#!/usr/bin/env python3

# Script to download/update certificates and public keys
# and generate compilable source files for c++/Arduino.
# released to public domain

Windowsのはまりポイント

WindowsでMS Storeからインストールするとツールは見れない場所にありそう。(MS Storeから入れたソフト類のディレクトリは見れない模様)インストーラー直ダウンロードしたIDE場合多分下みたいな配置。

C:\Users\hoge\Documents\ArduinoData\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WiFi\examples\BearSSL_Validation

だと下にある

C:\Users\hoge\Documents\ArduinoData\packages\esp8266\hardware\esp8266\3.1.2\tools

MS Storeからインストールして見れない人は、レポジトリのソース一式ダウンロードしたら多分中に入っているcert.pyを使える。

環境構築

cert.pyはpython3なので必要ならインストール。

ライブラリインストール

ないと下みたいなメッセージ

python  '../../../../tools/cert.py' '-s' 'www.example.com' '-n' 'SSL'                            
Traceback (most recent call last):
  File "C:\Users\kitam\Documents\ArduinoData\packages\esp8266\hardware\esp8266\3.1.2\tools\cert.py", line 15, in <module>
    from cryptography import x509
ModuleNotFoundError: No module named 'cryptography'

もしかしたら

もいるかも。

import re
import ssl
import sys
import socket
import argparse
import datetime

あたりは元々使えると思うけど必要ならそいつらも

証明書生成実行

パスにユーザ名入っているので適宜書き換え。

出力ファイル名(test.h)も適宜書き換え

結果

PS C:\Users\kitam\Documents\ArduinoData\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WiFi\examples\BearSSL_Validation> python  '../../../../tools/cert.py' '-s' 'www.example.com' '-n' 'SSL' > test.h
C:\Users\kitam\Documents\ArduinoData\packages\esp8266\hardware\esp8266\3.1.2\tools\cert.py:44: CryptographyDeprecationWarning: Properties that return a naïve datetime object have been deprecated. Please switch to not_valid_before_utc.
  print('// not valid before:', xcert.not_valid_before)
C:\Users\kitam\Documents\ArduinoData\packages\esp8266\hardware\esp8266\3.1.2\tools\cert.py:45: CryptographyDeprecationWarning: Properties that return a naïve datetime object have been deprecated. Please switch to not_valid_after_utc.
  print('// not valid after: ', xcert.not_valid_after)

なんか余計な警告出ているけどchatgpt先生によると以下らしいのでとりあえず無視

この警告は、Cryptography ライブラリが提供する一部の機能において、適切なタイムゾーン情報が欠如している(naïveな)datetimeオブジェクトを返すプロパティが非推奨であることを示しています。代わりに、not_valid_before_utcというプロパティを使用することが推奨されています。

ino修正

修正目的

ExampleのBearSSL_Validation.inoを任意フォルダ(今回はデスクトップ)に保存。

その後、cert.hの中身を先ほど出力したtest.hに変更

そのまま実行すると

C:\Users\kitam\Desktop\BearSSL_Validation\BearSSL_Validation.ino: In function 'void fetchCertAuthority()':
C:\Users\kitam\Desktop\BearSSL_Validation\BearSSL_Validation.ino:15:14: error: 'cert_DigiCert_TLS_RSA_SHA256_2020_CA1' was not declared in this scope; did you mean 'cert_DigiCert_Global_G2_TLS_RSA_SHA256_2020_CA1'?
   15 | #define CERT cert_DigiCert_TLS_RSA_SHA256_2020_CA1
      |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\kitam\Desktop\BearSSL_Validation\BearSSL_Validation.ino:15:14: note: in definition of macro 'CERT'
   15 | #define CERT cert_DigiCert_TLS_RSA_SHA256_2020_CA1
      |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

exit status 1

Compilation error: 'cert_DigiCert_TLS_RSA_SHA256_2020_CA1' was not declared in this scope; did you mean 'cert_DigiCert_Global_G2_TLS_RSA_SHA256_2020_CA1'?

出力されたtest.hにあるcert_DigiCert_Global_G2_TLS_RSA_SHA256_2020_CA1が元ヘッダーファイルにあったcert_DigiCert_TLS_RSA_SHA256_2020_CA1から変わっている。ちなみに、cert_DigiCert_Global_Root_G2とcert_DigiCert_Global_Root_CAも変わっている。

証明書のCNからcert.pyで自動命名しているのでしょうがない。

長期運用するならcert.pyをいじるか出てきたヘッダーの命名を書き換えて固定にした方が良いかも。深く考えないで取り急ぎinoの方を修正する。(15行目)

動作確認は元のページ

ESPのWiFiClientSecureでサーバから情報をもらう時サーバでContentsLength指定していないと面倒

ESP8266(ESP-WROOM-02)の内容。ESP-WROOM-32ではないのでがおおよそ同じと思う。

現象

ESP8266のWiFiClientSecureでサーバからデータを取得しようとした。本来レスポンスの本体(ペイロード本文)は”[0]“を期待していたが以下の下3行のようにレスポンスが期待していたものと違う形になっていた。

Connecting to https://hoge.co.jp/api/fuga
Connected to server
Server: nginx
Date: Wed, 21 Feb 2024 05:21:47 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close

3
[0]
0

理由

これはTransfer-Encoding: chunkedになっていてペイロード本文

データ1のバイト数\r\nデータ1\r\n0\r\n

というフォーマットになっているため。長いもの送る場合は

データ1のバイト数\r\nデータ1\r\nデータ2のバイト数\r\nデータ2\r\n…データxのバイト数\r\nデータx\r\n…0\r\n

となる。なおデータのバイト数は16 進数表記。

対処

その1

対処としてそういうものとして読み込んでもよいけど、マルチバイトの場合データ1,2の間でぶった切られるのでつなげるのとか面倒。

その2

可能ならサーバ側で送る際にTransfer-Encoding: chunkedじゃなくしたい。

今回はサーバ側はpythonのBaseHTTPRequestHandlerを使っているがレスポンスにContent-Lengthをつけてやれば自動でTransfer-Encoding: chunkedじゃなくなった。「とりあえず、Content-Lengthついてないからchunkedでおくとっくわ」という仕様だったっぽい。(明示的にヘッダー付けた場合に消えるかは未確認)

http1.1の仕様的にはTransfer-Encoding: chunkedの時にはContent-Length不要らしい。