2021年3月6日土曜日

UPnPでESP32から自動でルータのポート開放してみた。

 インターネットに繋いだESP32からクラウドにデータを上げたりする分にはルータのポートを開けなくてもデータをサーバに蓄積することができるんだけど、ESP32-CAMのようにESP32自体をサーバにして運用するときはどうしてもルータのポートを開けないとインターネット越しにアクセスできない。

ESP32側から簡単にポートを開けられるようにUPnPでルータのポートを開けてみた。これならいちいちルータの設定画面を開かなくてもいいし、手軽に設置できるはず。

使用させてもらったライブラリはUPnP_Generic Library

これはArduino上のいろんなデバイスに対応しているUPnPライブラリで、ESP32とかESP8266用に開発されたTinyUPnPを改良して対応ボードを増やした形らしい。最近のルーターはだいたい対応していると思うけどポートを開けたい対象のルーターはUPnP対応ルータが必要。あと2重ルータになってたりするとうまくいかないかも。

SimpleServerESP32のサンプルスケッチを動かしてみたがポートがうまく開かない…

他のライブラリを使ってみたりとかはしてみたんだけども、どうにもルータのUPnPには到達できてるのにうまくポートが開かない。ルータ側で見ていると一瞬開いてるようにも見えるんだけどすぐ消えてしまう状態…

フォーラムを読んでいると同じようにハマっている人がいるようで、最終的にはLEASE_DURATIONを0にすることでうまく動かすことができた。サンプルスケッチのデフォルトでは36000(秒)に設定されていた。ルータとの相性もあるのかもしれないけど、DD-WRT環境化ではこれを0にすることでうまくポートが開けられるようになった。LEASE_DURATIONは有効期限なので、0にすると有効期限無しの設定になってしまうが、ESP32側から不要になったら消すようにすればいいかもしれない。

ルータ側で設定を削除した場合は、一旦UPnPを無効にして有効にし直すか再起動しないともう一回追加できなかった。これはDD-WRTの仕様かも。

あとはDDNSとかでIPアドレス変わったのに対応できればサーバとして一通りの機能が搭載できるんじゃないかな…

DDNS自体は定期的にURL読み込めば良さそうだし。

0 件のコメント:

コメントを投稿