Ⅶ. 遠隔地からESP32を制御する

 これまでにESP32で作成したWebサーバーは、もっぱらローカルネットワーク環境で動作検証を行ってきました。最終回では、これらのWebサーバーを外部に公開して、遠隔地からコンタクトして制御してみましょう。
 このためにトンネリングツールを使って、図のように物理的に離れた2点間にトンネルを掘って(仮想の専用回線をつないで)、あたかも同一地点であるかのように扱えるようにします。具体的な方法として、ローカルサーバーをLANの外側からアクセスさせる際に便利なソフト、ngrokという無料ツールを導入します。そして、前回実験したリレーモジュールON/OFF制御用のWebサーバーを、遠隔地のスマートフォンで操作してみましょう。



1.ESP32側の準備

 電子メールやWebサイト閲覧システムは、利用者が操作するクライアントがサーバーにアクセスして要求を伝え、それにサーバーが応答する「クライアント/サーバー型」システムです。クライアントがサーバーに接続する際には、サーバーのIPアドレスとあわせて、電子メールやWebアプリケーションなどの種類を識別するためのポート番号が必要になります。一般に、WebサーバーのHTTP通信ではデフォールトのポート番号が80に設定されています。
 ここでは、テストで使用するWebアプリケーションでポートとして8888を使用することにします。そこで、前回のスケッチのHTTP_PORTを次のように変更します。
    #define HTTP_PORT 80
        ↓
    #define HTTP_PORT 8888

 スケッチをアップロードしたら動作を確認してみましょう。起動時にシリアルモニターに表示されるIPアドレスをメモして、WebブラウザーからIPアドレスとポート番号を次のように入力します。
    http://192.168.X.XXX:8888  ("X.XXX"は表示されたIPアドレスの下位部分)
 前回にテストした画面が正しく表示されて、ボタンを操作するとサーバーに接続されたリレーをON/OFF制御できることを確認します。

2.ngrokの導入(Windows版)

 先に述べたように、ngrokというツールを使うと、ローカル環境のWebサーバーに外部からアクセスすることができます。インストールも操作もきわめて簡単で、SSLを導入しなくてもhttpsでアクセスすることができる優れものです。
 ngrokには有料版と無料版がありますが、ここでは無料版を使用します。無料版の制約はURLを固定できない点です。ngrokのコマンド実行時に、毎回払い出されるURLのドメイン部が変更されてしまいます。したがって、Webサーバーを再起動したり、ngrokを閉じたときはドメインが消失するので、ngrokコマンドで新たなURLを取得して再接続する必要があります。
 後で示すダウンロード画面でわかりますが、ngrokは複数のOSに対応していて、Mac OS, Windows, Linux, FreeBSDで使用することができます。当方はWindows10の環境で開発しているので、まずはWindows版で進めることにします。

 ①ngrokへのアカウント登録

 次のサイトにアクセスして [Get started for free]ボタンをクリックします。
    → https://ngrok.com/

 「Sign Up」画面が表示されるのでアカウント登録をします。これは必須ではないのですが、アカウント登録をしないと接続時間が制約されるらしいので登録しました。

 ②認証トークン(Authtoken)の取得

 ngrok画面が現れるので、左側の[Authentication]-[Your Authtoken]とクリックします。下図のように49文字の認証トークンが表示されるのでメモしておきましょう。[Copy]ボタンで取り込んでメモ帳やエディターソフトに貼り付けて保管することができます。

 ③ngrokソフトのダウンロード

 続いて左側の[Setup & Installation]を選択するとダウンロード画面に変わります。開発環境のOSに対応したものをダウンロードします。[Download for Windows]をクリックすると、次のWindows 64ビット版がダウンロードされました。
   ファイル名: ngrok-stable-windows-amd64.zip


④ngrokのセットアップ

 ダウンロードしたngrok-stable-windows-amd64.zipを適当な場所へ移動して解凍すると、ngrok.exeが現れます。ngrok.exeをダブルクリックして起動するとターミナルウインドウが開くので、次のような書式で自分のIPアドレスとポート番号、認証トークンを指定します。
    ngrok tcp MY_IP_ADDRESS:PORT_NUMBER --authtoken YOUR_AUTHTOKEN
              ↓
    ngrok tcp 192.168.x.xxx:8888 --authtoken 先ほど入手した認証トークン
 セットアップが成功すると、「ngrok by @inconshreveable」で始まる画面が表示されます。Forwardingの項目に示されるURLのドメイン部を使って動作検証することができます。


⑤authtokenの登録

 ngrok tcpコマンドなどで毎回長い認証トークンを指定するのは面倒なので、発行されたAuthtokenを登録することができます。
> ngrok authtoken 先ほど入手した認証トークン Authtoken saved to configuration file: C:\Users\user_name/.ngrok2/ngrok.yml
 登録したAuthtokenはユーザーフォルダー配下のngrok.ymlという設定ファイルに書き込まれ、次のようにコマンド入力を簡略化できます。
    ngrok tcp 192.168.x.xxx:8888


3.ngrokの導入(Linux版)

 次にLinux版のインストールを行ってみます。手元に遊んでいるRaspberry Pi 3 Model B+があるので、これにインストールしてみます。OSは最新のRaspbian Busterです。
 ①ngrokへのアカウント登録

 下図は、ngrokのドキュメントページ https://ngrok.com/docsです。まだアカウント登録をしていない場合は[SIGN UP →]ボタンをクリックして登録することができます。
 すでにWindows版でサインアップ済みの場合は、[SIGN UP →]左の[LOGIN]をクリックしてログインします。

 Windows版と同じ「Sign Up」画面が表示されます。

 ②認証トークン(Authtoken)の取得

 サインアップまたはログインするとWindowsの場合と同じ画面が表示されるので、左側の[Authentication]-[Your Authtoken]を選択して認証トークンを取得します。すでにWindows版で取得している場合は同じものが表示されるだけです。初めての場合は[Copy]ボタンで認証トークンをコピーして、メモ帳やエディターソフトに貼り付けて保管しましょう。

③ngrokソフトのダウンロード

 Raspberry PiのLXTerminalまたはSSH Terminal Emulatorからngrokのダウンロードとインストールを行います。次のようにwgetでダウンロードしてunzipで解凍し、/usr/local/binへ移動します。最後に動作確認をするためにバージョンを表示させています。必要ならrmで.zipファイルを削除してください。
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip $ unzip ngrok-stable-linux-arm.zip $ sudo mv ngrok /usr/local/bin/ $ ngrok version ngrok version 2.3.35

④ngrokのセットアップ

 Windows版と同様に、次のように自分のIPアドレスとポート番号、認証トークンを指定します。
    ngrok tcp 192.168.x.xxx:8888 --authtoken 先ほど入手した認証トークン
 セットアップが成功すると、「ngrok by @inconshreveable」で始まる画面が表示されます。Forwardingの項目に示されるURLのドメイン部を使って動作検証することができます。


⑤authtokenの登録

 ngrok tcpコマンドなどで毎回長い認証トークンを指定するのは面倒なので、Windows版と同様に、発行されたAuthtokenを登録することができます。
$ ngrok authtoken 先ほど入手した認証トークン Authtoken saved to configuration file: /home/pi/.ngrok2/ngrok.yml

 登録したAuthtokenはngrok.ymlという設定ファイルに書き込まれ、次のようにコマンド入力を簡略化することができます。
    ngrok tcp 192.168.x.xxx:8888


4.動作検証

 以上でngrokの導入が終わり、authtokenの取得と登録が完了していることを前提に動作検証を行います。なお以降の作業はLinux環境で行っています。
 (1)ESP32をTCPサーバーとして立ち上げる

 まずTCPサーバーとして立ち上げてみましょう。ngrokのターミナルウィンドウで
    ngrok tcp 192.168.X.XXX:8888
と入力すると(192.168.X.XXXはESP32のローカルIPアドレス)、次のような画面に切り替わります。

 赤枠部分の0.tcp.ngrok.ioは固定で、続くポート番号が毎回ランダムに割り振られます。PCのブラウザーを開いてアドレスバーに「http://0.tcp.ngrok.io:16737」を入力すると、次のような「Web Switch」が表示されます。ボタンを押して、ESP32に接続したリレーのON/OFF動作を確認することができます。

(2)Basic認証付きでWebサーバーを立ち上げる

 Webサーバーを立ち上げる一般的な方法は
    nrog http 192.168.x.xxx:8888
のように、httpコマンドでESP32のローカルIPアドレスとポート番号を指定します。これと合わせて、ngrokではBasic認証用のユーザー名とパスワードを設定することができます。一般的な書式と実際の入力は次のとおりです。
$ ngrok http -auth="ユーザ名:パスワード" ポート       ↓ $ ngrok http -auth="Marchan:hogepwd" 192.168.X.XXX:8888
 ngrokはきわめて簡単にどこからでも接続できるので、最低限のセキュリティー対策としてBasic認証だけは組み込むようにしましょう。

 Forwarding欄の「http://~~.ngrok.io」を控えて、ブラウザーのアドレスバーに入力します。Basic認証を指定していればログインダイアログが開きます。

 認証されると「Web Switch」画面に切り替わります。

 もちろん、スマートフォンでも同じようにして接続することができます。

 こうして、今や世界のどこからでも、部屋の片隅に置いたESP32をコントロールできるようになりました。しかしこれは実験レベルでのことです。実際に危険性をともなう装置や設備の制御は、当然のことながらハード面の安全対策が不可欠です。さらにネットワークセキュリティについても、Basic認証用だけでは脆弱であり、アプリケーション側での安全性強化の仕組みが必要になります。そのあたりは十分にご注意ください。

 長らくお付き合いいただきまして、ありがとうございました。
 2019年4月に『ESP32による近距離無線通信の実験』を始めて1年少々ですが、この間にも通信技術の新たな展開が日々報じられています。本当に活気に満ちたおもしろい世界ですね。近距離から少し距離を延ばしてLPWA(Low Power, Wide Area)への取り組み、特にLoRaには強い興味を感じているのですが、ESP32やRaspberry Piで使える国内規格(利用可能帯域)準拠のパーツはなお高価ですね。で、近距離無線通信の実験はこれで一区切りといたします。一連の実験から何かヒントを得たり、応用面へと発展させていただければ大変嬉しいです。
 折しも新型コロナウィルスの感染対応で大変な状況ですが、皆様のご健闘を願っています。