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」を付け忘れるとアクセスできずエラーになります。


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

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

