M5Stack CORE2にドメイン名でアクセスする

M5Stack CORE2 mDNS

WiFiでローカルエリア接続しているM5Stack CORE2をmDNS(マルチキャストドメインネームシステム)を使い、IPアドレスではなくドメイン名でアクセスできるようにします。

目次

mDNSとは何か

先ずDNSとは「192.168.1.25」のようなIPアドレスと「abcd.com」などのドメイン名を紐づけるシステムです。どのように使われているかというと、WebブラウザのURLバーにドメイン名abcd.comと打ち込むとインターネット上にあるDNSサーバーにアクセスされ、ここでIPアドレス192.168.1.25に変換されて相手先に接続しています。

mDNSは、同じローカルエリアネットワーク内で外部のインターネット上のDNSサーバーを使わないでもドメイン名を使えるようにするものです。

今回はアクセスするM5Stack CORE2に「my-m5core2」というドメイン名を設定し、「192.168.1.25」というIPアドレスではなく、名前でアクセスできるようにします。

また、トップドメインは「.local」になるのでWebブラウザのURLアドレスバーに「http://my-m5core2.local」と打ち込みます。

mDNSを実装する

ヘッダ「ESPmDNS.h」の中で「MDNSResponder」クラスのインスタンス「MDNS」が定義されていますのでこれを使います。

ESPmDNS.h はこちら↓

 https://github.com/espressif/arduino-esp32/blob/master/libraries/ESPmDNS/src/ESPmDNS.h

プログラムには下記の内容を実装します。

  • ヘッダ「ESPmDNS.h」を追加する。
  • ターゲット端末のESP32のドメイン名を定義する。
  • メンバ関数「addService()」でmDNSサービスを登録する。
  • メンバ関数「begin()」でサービスを開始する。引数はドメイン名。

お試しプログラム

arduinoIDEのサンプルスケッチ「mDNS_Web_Server.ono」を参考に、以前作成したプログラム(こちらリンク)にmDNSを追加しました。setup()関数の中に下記を追加しています。

  • ヘッダ「ESPm DNS.h」を追加(4行目)
  • ドメイン名の設定とmDNSの開始を追加(60〜68行目)
  • mDNSサービスを追加(76行目)
  • IPアドレス確認用のLCD表示は削除(9、56〜58行目)
#include <M5Unified.h>
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h> //mDNS追加

const char *ssid = "**************"; //Your WiFi SSID
const char *password = "*************"; //Your WIFi パスワード

//IPAddress ip; //IP address
WebServer server(80); //WebServerクラスのインスタンス生成(HTTPのポート番号)

void handleRoot() {
  server.send(200, "text/plain", "Response from M5Stack CORE2. \n...Root Test mDNS");
}
void handleSub1() {
  server.send(200, "text/plain", "Response from M5Stack CORE2. \n...Sub1 Test mDNS");
}
void handleSub2() {
  server.send(200, "text/plain", "Response from M5Stack CORE2. \n...Sub2 Test mDNS");
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  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);
}

void setup(void) {
  auto cfg = M5.config();
  M5.begin(cfg);

  M5.Display.fillScreen(TFT_WHITE);
  M5.Display.setTextColor(TFT_BLACK, TFT_WHITE);
  M5.Display.setTextSize(2);
  M5.Display.print("\n** Test WebServer mDNS **\n\n");
  M5.Display.print("Connecting");

  WiFi.mode(WIFI_STA); //ステーションモード。M5Stackを子機として接続
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Display.print(".");
  }

  M5.Display.print("\n\nWiFi connected!\n\n");
  //M5.Display.print("IP address: ");
  //ip = WiFi.localIP(); //IP address取得
  //M5.Display.print(ip); //IP address表示

  String DomainName = "my-m5core2"; //ドメイン名 my-m5core2.local
  M5.Display.printf("\nDomainName: %s",DomainName); //ドメイン名表示

  if (!MDNS.begin(DomainName)) {
    M5.Display.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }

  server.on("/", handleRoot); //IPアドレスのルートにアクセスされたとき
  server.on("/sub1", handleSub1); //Sub1にアクセスされたとき
  server.on("/sub2", handleSub2); //Sub2にアクセスされたとき
  server.onNotFound(handleNotFound); //存在しないリソースにアクセスされたとき

  server.begin(); //Webサーバー開始
  MDNS.addService("http", "tcp", 80); //mDNSサービス追加(サービス, プロトコル, ポート)
}

void loop(void) {
  server.handleClient(); //クライアントのリクエスト待ち
}

ドメイン名でアクセスした

M5Stack CORE2を起動した状態(写真1)で、Webブラウザ(Chrome)のURLバーに「http://my-m5core2.local」と打ち込むと設定したテキストが返送されてきました(写真2)。ちなみに「.local」を付け忘れるとアクセスできずエラーになります。

M5core2 mDNS
<写真1:M5Stack起動中>
<写真2:ドメイン名でアクセス>

また、同時に設定した「sub1」と「sub2」のディレクトリも「http://my-m5core2/sub1」、「http://my-m5core2/sub2」と打ち込むと正常に設定したテキストが返送されました(写真3)。

<写真3:ドメイン名でSub1にアクセス>

まとめ

同一のローカルネットワーク内にM5Stackが接続されている場合、mDNSを使うことで設定したドメイン名にてアクセスが可能になります。M5StackのESP32ではMDNSResponderクラスを実装します。WebブラウザかM5StackにアクセスするときにあらじめIPアドレスを調べておく必要がなくなります。

目次