先ずは接続
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”に設定された様です。
ここからはスマホに移ります。
- スマホでWIFIを見に行くと、ESP32APが見つかります。
- それをタップしてパスワードを入れると
- 接続されます。でもインターネットは利用出来ませんも表示されます。
- ネットワークの情報を見るとこの様になっています。目の前に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をやったのですがダメでした。ホスト名ではアクセス出来ませんでした。でもアドレスを固定出来るので良しとします。