TP-LINK Tapo P105/P110M のKlapプロトコル対応版 (Windows/Linux)

お待たせしました!って誰も待ってないか...v(-_-;)

P105/P110MのKlapプロトコル(最新ファーム)対応版を作ってみた。

【対応ファームウェア】
P110M: 1.1.0 Build 231009 Rel.155719 以降
P105: 1.4.1 Build 20231103 Rel. 36519 以降

※ESP32対応版は下記を参照。
TP-LINK Tapo P110M のKlapプロトコル対応版 (ESP32)

ちなみにKlapプロトコル専用なので古いファームには下記投稿のコマンドを使用する必要がある。
TP-LINK TAPO P100/P105/P110をLinux/Windowsから直接制御する

【既知の問題】
現状ではセッション開始後の最初のリクエストがときどきHTTP-403エラーになるという不具合が残されている。セッション開始のためのハンドシェーク処理は成功するもののその後のリクエストがなぜかエラーになってしまいハンドシェークからやり直さないとリカバリーできないという現象でリクエストが成功した場合にはその後も問題はない。時間をかけて調べてみたが今のところ原因不明...orz

【セッション復元機能】
試験では通常0~2回、まれに最大5回までのリトライで成功してはいるがコマンド実行毎に新たにセッションを開始するとリトライにより実行時間にかなり悪影響を与えてしまう。

改善策としてセッション情報を保存/復元できるようにしてみたところ効果バツグン。通常ならコマンド実行毎に3回の通信が必要なところセッション復元できれば1回の通信で済むから3倍速となる。

セッション情報は次の場所に”tapo2-xxx.xxx.xxx.xxx”の名前でデバイス毎に保存され間違って削除されても問題はない。

linux: /var/tmp
windows: TEMP或いはTMP環境変数が示すフォルダ

【参照ライブラリ】
libb64は変更なし。(というか変更してはいけない)
json-developを3.11.3にアップデート。
mbedtlsを2.28.6にアップデート。

※mbedtlsの現在の最新はV3系であるが環境依存ファイルを生成するためにpythonやperlが必須となってしまったため断念しV2系の最新にアップデート。

【コンパイルの事前準備】
適当なフォルダにsources.zipを展開する。展開されたmbedtls-2.28.6フォルダに入って次のコマンドを実行する。

linux: make no_test
windows(MSYS2-MinGW): make CC=gcc no_test WINDOWS=1

【コンパイル】
展開先フォルダでmakeを実行する。再コンパイルするときはmakeする前にmake cleanを実行する。

【ダウンロード】
sources.zip
tapo2.exe (windows-x64)

【修正履歴】
2024-03-18
HiroさんよりCrypt::random()が落ちるというフィードバックあり。ググッてみたらmbedtlsのmbedtls_ctr_drbg_seed()にメモリリークの可能性があるらしいのでとりあえずrand()関数による実装に変更。おまけとしてVisual C++でもコンパイルできるようなコードに修正してみた...試してないけど。(-_-;)

2024-01-13
昨日からP105を回し続けているがエラーもなく別端末からの排他制御エラー(-1012)も発生しなくなったようだ。ということは現状でOKということかな?ふと気になって参考にさせて頂いたplugp100で試してみたらP105の電源オンオフは出来なかった。もしかして世界初のP105のKlapプロトコル対応?...それはともかく昨日はお天気も良くロケットも気持ちよさそうに飛び立っていって良き日であった。(^o^)
と思っていたらいきなりP105がエラーばかり起こして何もできなくなった。TAPOアプリからの操作も出来ない。でも暫く待ってたら復旧した。普段はそう頻繁にオンオフすることはないだろうという前提であれば大丈夫なのかな...(-_-;)

2024-01-12
P105の挙動が怪しい。HTTPリクエストの送信処理を変更してみたところだいぶましにはなったような気もするがごくまれにP105がハングアップしてしまうことがある。P105にはタイミングバグがあるのかな?もしそうだとすると厄介だ。P110Mは一日中ぶん回しても問題ないのに...
P105の-1301エラーは処理遅延の警告みたいであるが頻繁に出てウザイので無視するように修正。

2024-01-11
昨日はうまく動作していたP105が今日はなぜか-1012エラーで動かない...orz
そういえばP105のon/off操作にはterminalUUID指定が必要なことを思い出し実装を追加してみたところうまく動作するようにはなったが端末Aからon/off操作した後に端末Bからon/off操作しようとしても2分経過しないと-1012エラーになってしまう。なぜだろう?
とりあえず動作するようにはなったので再公開。(-_-;)
ちなみにP105はHWの処理能力が足りないのか不安定っぽい。これから購入する人はP110Mのほうが安定してるのでお勧め。

2024-01-10
mbedtlsの使い方のミスによるメモリーリークの修正、及び、通信毎にソケットを接続切断するように修正。
★★★昨日までにDLした方は入れ替えをお願いします。★★★

2024-01-09
httpclint.hが、ごちゃごちゃしてだいぶ見苦しなってきたので整理整頓&修正を行った。

2024-01-08
細かな改良。

2023-12-28
HTTP処理を改良しリトライの処理時間を短縮してみた。リトライしたのがわからないぐらいにはなった。かな。

2023-12-26
軽微なバグを修正。RaspberryPi/Ubuntu/Windowsで動作を確認。

2023-12-25
セッションタイムアウト値が間違っていたので修正。

【ソースコード】