Hello Server(WiFi-connection)

先ずは接続

WebServerの最後にWiFi接続について説明します。WiFiへの接続は通常

  • WebServer型のインスタンスを作成。
  • mode()で接続モードを指定。
  • begin()で実際に接続。

で行います。

先ずは、WebServer型のインスタンスを作成

  • WebServer server(80); こんな感じでインスタンスを作成します。引数のportはサーバが使用するポート番号の事です。ここではWebサーバを想定しているので通常80を指定します。

次は、mode(wifi_mode_t m)関数。引数で接続のモードを指定します。引数は、WIFI_STA, IFI_AP, WIFI_AP_STAの3つです。

  • WIFI_STA:station mode(ステーションモード)で接続。簡単に言うとルーターを介した接続
  • WIFI_AP:ルーターを介さず自信がアクセスポイントとなって他の機器と繋がります。
  • WIFI_AP_STA:意味的にはステーションモードとアクセスポイントを同時に行う見たいですが、良く分かりません。どのような場合に使うのでしょうか。

最後は、begin(char* ssid, char passphrase, int32_t channel, const uint8_t bssid, bool connect)関数。これが実際に接続する関数です。

  • char* ssid: ルーターのSSIDを指定。
  • char *passphrase:ルーターのキー(パスワード)を指定。
  • int32_t channel:無線LANチャンネル。指定しない場合は、0。
  • const uint8_t* bssid:無線LANのBSSID。指定しない場合は、NULL
  • bool connect:アクセスポイントに接続するかどうか。指定しない場合は、true。

通常後半の3つは指定しないで、SSIDとパスワードの2つを指定して使います。簡単はスケッチを示します。


#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "XXXXXX";
const char* password = "YYYYYY";

WebServer server(80);

String index_HD = 
            "<!DOCTYPE html> <html>\n" 
            "<head>\n" 
            "<title>LED Control</title>\n" 
            "</head>\n"
            "<body>\n"
            "<h2>Hello ESP32</h2>\n"
            "</body>\n</html>\n";
                        
void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

void handleRoot() {
   server.send(200, "text/html", index_HD);  
}
  • 7行:WebServer server(80);
    • WebServer型の serverインスタンスを宣言。ポートは80を使用
  • 21行:WiFi.mode(WIFI_STA);
    • 接続モードをステーションモードに設定。ルータを介するタイプです。
  • 22行:WiFi.begin(ssid, password);
    • 4,5行で設定したルータのSSIDとパスワードを使用してルーターに接続します。
  • 以降は、接続が完了するとモニターにIPアドレスを表示

コンパイルして、モニターを上げて実行して下さい。モニターに表示されたIPアドレス(今回は、192.168.3.29と表示されました)をブラウザーのURL入力欄に入力すれば

と表示されます。

アドレスを固定しよう

上記の方法はIPアドレスが空いているアドレスに自動にセットされ便利ですが、どうしてもIPアドレスを指定(固定)したい場合は有ります。その場合は、config(IPAddress ip, IPAddress gateway,IPAddress netmask)関数を使います。各引数は

  • IPAddress ip:固定したいIPアドレス
  • IPAddress gateway:ゲートウェイアドレス
  • IPAddress netmask:ネットマスク

です。


#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "XXXXXX";
const char* password = "YYYYYY";

WebServer server(80);

IPAddress ip(192, 168, 3, 35);
IPAddress gateway(192, 168, 3, 1);
IPAddress netmask(255, 255, 255, 0);

String index_HD = 
            "<!DOCTYPE html> <html>\n" 
            "<head>\n" 
            "<title>LED Control</title>\n" 
            "</head>\n"
            "<body>\n"
            "<h2>Hello ESP32</h2>\n"
            "</body>\n</html>\n";
                        
void setup() {
  Serial.begin(115200);

  WiFi.config(ip, gateway,netmask); 
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

void handleRoot() {
   server.send(200, "text/html", index_HD);  
}
  • 9から11行:IPアドレス、ゲートウェイアドレス、ネットマスクの指定。IPアドレスは他と重ならない様に設定して下さい。
  • 25行:WiFi.config(ip, gateway,netmask);
    • この関数は元々、各ポートを手動で設定する時に使う関数。
    • IPアドレス、ゲートウェイアドレス、ネットマスクを手動で設定。

スケッチを実行すると、モニターに

とIPアドレスが指定した、192.168.3.35に設定されている事が分かります。

ホスト名を設定

サーバはホスト名でアクセスしたい時は、MDNS.begin(char* hostName)を使います。

  • char* hostName:設定したいホスト名を指定。

MDNS.begin()使用してスケッチ


#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>

const char* ssid = "XXXXXX";
const char* password = "YYYYYY";

WebServer server(80);

IPAddress ip(192, 168, 3, 35);
IPAddress gateway(192, 168, 3, 1);
IPAddress netmask(255, 255, 255, 0);

String index_HD = 
            "<!DOCTYPE html> <html>\n" 
            "<head>\n" 
            "<title>LED Control</title>\n" 
            "</head>\n"
            "<body>\n"
            "<h2>Hello ESP32</h2>\n"
            "</body>\n</html>\n";
                        
void setup() {
  Serial.begin(115200);

  WiFi.config(ip, gateway,netmask); 
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }
  
  server.on("/", handleRoot);
  
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

void handleRoot() {
   server.send(200, "text/html", index_HD);  
}
  • 3行:#include <ESPmDNS.h>
    • ヘッダーファイルの読み込み
  • 43から45行:ここで、ホスト名を、”esp32″と指定しています。

スケッチをコンパイル。モニターを上げて実行すると、IPアドレスは、192.168.3.35と表示されます。ブラウザを上げて、URL入力欄に、”esp32”と入力して下さい。

ちゃんと表示されました。ホスト名でアクセス出来るようになりました。

最後は、AP接続

ESP32で測定器やカメラ等を製作した時に、このモードでスマホに繋いでESP32を制御する等とても便利なモードです。mode(WIFI_AP)とsoftAP(char* ssid, char* password)を使ってつなげます。


#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "ESP32AP";
const char* password = "test1234";

WebServer server(80);

String index_HD = 
            "<!DOCTYPE html> <html>\n" 
            "<head>\n" 
            "<title>LED Control</title>\n" 
            "</head>\n"
            "<body>\n"
            "<h2>Hello ESP32</h2>\n"
            "</body>\n</html>\n";
                        
void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP());

  server.on("/", handleRoot);
  
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

void handleRoot() {
   server.send(200, "text/html", index_HD);  
}
  • 4から5行:SSIDとパスワードを指定。SSIDは何でも良いのですが、パスワードは8文字以上で指定する必要が有ります。
  • 21行:WiFi.mode(WIFI_AP);
    • WIFIのモードをアクセスポイントモードに設定。
  • 22行:WiFi.softAP(ssid, password);
    • これで、指定したSSIDとパスワードでアクセスポイントを開始
  • 25から28行:ここで、SSIDとIPアドレスが表示されます。IPアドレスは自動に設定される為、モニターで確認する必要が有ります。

コンパイルしてモニターを上げて実行して下さい。モニターに

と表示されました。SSIDは設定通りの、”ESP32AP”。IPアドレスは、”192.168.4.1”に設定された様です。

ここからはスマホに移ります。

  1. スマホでWIFIを見に行くと、ESP32APが見つかります。
  2. それをタップしてパスワードを入れると
  3. 接続されます。でもインターネットは利用出来ませんも表示されます。
  4. ネットワークの情報を見るとこの様になっています。目の前にAPが有るので電波強度は非常に強いです。

後は、ブラウザーを上げて”192.168.4.1”と入力して下さい。”Hello ESP32″と表示されます。

アドレスの固定

WiFi.softAPConfig(ip,gateway,netmask);を使えばIPアドレスを固定出来ます。


#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "ESP32AP";
const char* password = "test1234";

WebServer server(80);

IPAddress ip(192, 168, 3, 35);
IPAddress gateway(192, 168, 3, 1);
IPAddress netmask(255, 255, 255, 0);

String index_HD = 
            "<!DOCTYPE html> <html>\n" 
            "<head>\n" 
            "<title>LED Control</title>\n" 
            "</head>\n"
            "<body>\n"
            "<h2>Hello ESP32</h2>\n"
            "</body>\n</html>\n";
                        
void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(ip,gateway,netmask);
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP());

  server.on("/", handleRoot);
  
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

void handleRoot() {
   server.send(200, "text/html", index_HD);  
}
  • 9から11行:IPアドレス等の設定
  • 27行:WiFi.softAPConfig(ip,gateway,netmask);
    • ここに設定したパラメターを入れる。

これでOKです。

最後にDNSをやったのですがダメでした。ホスト名ではアクセス出来ませんでした。でもアドレスを固定出来るので良しとします。