NAT配下のWebサーバ等をインターネットからアクセスできるようにトンネリングをするngrokというサービスがあります。
これを使って、3Dプリンタの監視画像をインターネットから取得できないか試してみました。
テスト環境は以下のとおりです。
| WiFi Router | 192.168.10.1 | +---- TTGO T-Camera | 192.168.10.2 | 80/TCP Web, 81/TCP Streaming | +---- Raspberry Pi(Raspbian Lite) 192.168.10.3
まず、ngrok公式サイトからサインアップをします。サインアップすると、「Setup & Installation」という画面に移行しますので、これに沿って操作していきます。
まず、ngrokのダウンロードですが、Linux(ARM)のURLをコピーして、wgetでzipファイルを取得します。(下記はURLを書き換えてありますので、必ずURLをコピーしてください)
~$ wget https://bin.equinox.io/c/xxxxxxxxxx/ngrok-stable-linux-arm.zip
ダウンロードしたら、②、③に沿って展開とトークンの取得を行います。トークンの取得は③のところのコマンドラインをコピー&ペーストして実行するだけです。
~ $ unzip ngrok-stable-linux-arm.zip Archive: ngrok-stable-linux-arm.zip inflating: ngrok ~ $ ./ngrok authtoken xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Authtoken saved to configuration file: /home/pi/.ngrok2/ngrok.yml
トークンを取得したら、 ~/.ngrok2/ngrok.yml にある設定ファイルを作成します。
authtoken: xxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxx tunnels: ttgo: addr: 192.168.10.2:80 proto: http auth: "user:password" bind_tls: true
1行目の内容はトークン取得で作成されている内容です。2行目以降が追加した内容になります。
tunnels: ttgo: <-------- トンネルにつけた名前です addr: 192.168.10.2:80 <---- アクセスされた際の転送先です proto: http <---- httpプロトコルを指定します auth: "user:password" <---- アクセスの際の認証を追加します bind_tls: true <---- TLSで暗号化を強制します
作成したら、
~ $ ./ngrok start --all
で起動します。(終了すると tunnel も消滅するので screen と併用するとよいかと思います)
ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Account XXXXXXXXXXXXXXXXX (Plan: Free) Version 2.3.27 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding https://b3d16323.ngrok.io -> http://192.168.10.2:80 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
という感じで状態が表示されます。この状態でインターネット側から https://b3d16323.ngrok.io にアクセスするとBASIC認証が求められ、設定したユーザー名とパスワードを入力すると、TTGO T-Cameraへアクセスすることができました。アクセスすると上記の状態の下にHTTPリクエストの状態がリストで表示されます。なお、b3d16323の部分は起動する度にランダムに変わります。有料プランにするとこの部分を固定にすることができるようです。
実際にGet Stillをクリックすると、
という感じで実際に画像を取得できました。なお、ストリーミングについては異なるポート(81/TCP)でのアクセスが必要なのですが、ngrokのコンフィグファイルでは複数のポートの設定も記述できるものの、ポートごとに異なるURLが割り付けられます。このため、うまくいきませんでした。有料プランにするとURLを指定できるので、うまく行く方法があるのかもしれません。