WWWからアクセス可能なESP8266 webserver
今回、IFTTTからのWebhookアクションを手軽に処理するためにWebHook先を自宅ESP8266WebServerで動かそうと考えてます。現状私のトコロではESP8266のwebServerは動作確認済みで、ブラウザからIPアドレス直指定でSPIFFSに入れたHTMLや画像を表示確認する事が可能です。で、今回は外部よりESP8266のwebServerにアクセスできる様にする手立てを考えていきます。まず、WWWからアクセス可能なWebServerと言えばグローバルIPアドレスを取得して運営するのですがグローバルIPの維持は低予算かつ速攻で計画変更する僕には無理な月間維持費が必要です。そんな中で良い方法は無いかと調べるとDDNSという仕組みがあり、ESP8266で実現する方を見つけました。wwwからESP8266へアクセスには、以下の問題点がありました。1.WWWから、何処めがけてアクセスすればいいの? Q. IFTTTのWebHookで記述する内容は「Http://~何処よ?~」を決めなければならない。 A. 無料のMyDNSで自分用ドメイン登録すればいいんじゃないか? MyDNS >> https://www.mydns.jp/ ※本来は固定IPアドレスを取得して、そのIPアドレス用のドメイン名(http://ドメイン名~)に アクセスして貰います。 しかし固定IPアドレスとドメイン名は維持管理費が必要です。 今回はMyDNSのサービスを利用して固定IPアドレスはMyDNSを使わせて頂いて、 ドメイン名(http://MyDNSドメイン/自分トコ/)でアクセスできる様にします。2.MyDNSの自分用ドメインだねうんうん。 Q. で!? どうやって使うん? Linuxサーバ系は検索すれば出てくるけど? A. MyDNSはDDNSって決まり事で、ドメイン名をwwwに登録する仕組みかな・・・・? ayushsharma82さんトコのEasyDDNSがArduinoIDEで動作するコードをありました。 https://github.com/ayushsharma82/EasyDDNS この動作コードとMyDNSの資料より、何とかなりそうです。 ※使い方はこちら=> EasyDDNSを使ってみる ※自分トコの自宅サーバのIPアドレスはインターネットプロバイダが勝手に割り振るので 何時IPアドレスが変更されるかワカりません、なので一定時間毎にMyDNSに現状の 自宅サーバIPアドレスを報告する仕組みを用意します。3.EasyDDNSでMyDNSのエントリが出来ました。 Q.iPadからターゲットにアクセスできないです。 >< A.えーっと・・・ webServerの手前にあるルータに設定が必要です。 ルータにはポート80はESP8266のIPアドレスにスルーする様にします。 ESP8266はWiFi接続なので、WiFi中継器にもスルーする設定を行います。 ※ルータにはWWWから意図しないアクセスを遮断する仕組みがあります。 普通のインターネットプロバイダ契約者は、WebServerなど構築しないので 通常はブラウザ・ダウンロードなどで使う経路だけ利用可能になっています。とは言え、この程度でグローバルなESP8266 webServerが出来ました。このソースだと寂しいwebページしか作れませんけども、htmlの要求等に対してSPIFFSからファイルを読んで応答する機能を作ると旧世代のシンプルページが出来上がります。#include <EasyDDNS.h>#include <ESP8266WiFi.h>#include <WiFiClient.h>#include <ESP8266HTTPClient.h>#include <ESP8266WebServer.h>const char* ssid = "SSID";const char* password = "PASSWORD";IPAddress localIP = IPAddress(192, 168, 1, 2);//const char* DDNSservice = "mydns"; // Enter your DDNS Service Name - "duckdns" / "noip" / "mydns"const char* DDNSMasterID = "MasterID";const char* DDNSPasswordID = "PasswordID";//ESP8266WebServer server(80);void handleNotFound();void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } WiFi.config(localIP, WiFi.gatewayIP(), WiFi.subnetMask()); Serial.print("\nLocal IP:"); Serial.println(WiFi.localIP()); // Print the IP address server.onNotFound(handleNotFound); server.begin(); EasyDDNS.service(DDNSservice); EasyDDNS.client("******.mydns.jp", DDNSMasterID, DDNSPasswordID);}void loop() { EasyDDNS.update(60000); // Check for New Ip Every 60 Seconds. server.handleClient( );}void handleNotFound(){#ifdef DEBUG Serial.println( server.uri() );#endif// if ( loadFromDataFile(server.uri()) ) return; String url = server.uri(); url.toLowerCase(); String message = "File Not Found\n\nURI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message);}2018年4月9日 ESP8266でMyDNSの公開サーバーを用意する タイトルには公開サーバーと書いてありますが、目的はIFTTTからBlynkを呼ばずに 自宅の機器を呼び出す為の踏み台サーバーの用意を考えています。 ESP8266だと最小限の機能しか実装しないのでセキュリティホールが無さそうなトコが 良い点だと思います。(問題点は誰もセキュリティを検証してくれないトコと中国製ww) そこでDDNSサーバー用のソフトを捜索してました。 するとayushsharma82さんトコにEasyDDNSがありました。 https://github.com/ayushsharma82/ でもEasyDDNSなんですが、残念ながらNoIPとDynDNSとDynuの3つ対応でMyDNSが ありません。 対応する所でアカウントを取れば普通に使えるのですが、ソースコードを 眺めてみると簡単な仕組みみたいだし、MyDNSのホームページを眺めると簡単そうなので エイヤッと作って動作確認してみました。 修正はコメント「// ######## GENERATE UPDATE URL ######## //」以下に IF~ELSE文で各DDNSサービスの呼出し記述があるので、以下のコードを追加するだけ **MyDNSのHowToUseに、呼出しについてのドキュメントがあります** else if(ddns_choice == "mydns"){ update_url = "http://www.mydns.jp/directip.html? MID="+ddns_u+"&PWD="+ddns_p+"&IPV4ADDR="+new_ip+"";} サンプルコードは以下の様に変更、MasterIDとPasswordIDはMyDNS登録時に提供される IDです。 EasyDDNS.service("mydns"); EasyDDNS.client("none","MasterID","PasswordID"); // Enter ddns Domain & Username & Password | Example - "esp.duckdns.org","username", "password" MyDNSのHowToUSEのおかげで、大した問題もなくサラリと動作しました。2019年9月 追記 QiitaにSPIFFSファイルビューワをアップしました ESP8266のSPIFFSにファイルを書き込む作業が凄く面倒だったのでWebServer 形式のファイルビューワーを作成しました。 Qiitaにてコードをアップしています。 ESP8266WebServerを使ってSPIFFSファイルビューアを作成する2022年10月追記 いざ作ってみたものの 正直こんなポンコツWebServerいらねぇよと思っていたのですが、 OTA未使用でESP8266のWiFi回りのファームウェアにセキュリティホールが 無ければ乗っ取られる心配が少ないのでは無いか?と思っています。 一瞬スマートホームの情報を表示するWebServerを考えましたが、 スマートホーム情報を全世界にあけっぴろげぇぇぇ!に気づいて自粛しました。 僕がネットワーク技術に明るければ継続もあったのですが・・・ 現状はGoogleSpreadSheetの特定セルを用いて情報伝達を行っています。