ESP-WROOM-02をWebサーバーにする [ステーション+アクセスポイント版]
ESP-WROOM-02を「ステーション + アクセスポイント」の混合モードでWifiに接続後、そのIPアドレスを使用してWebサーバーを起動します。
その後、パソコンでそのアクセスポイントに接続して、起動したWebサーバーへアクセスします。
1. ネットワークの概要

既存のネットワークを「192.168.1.0/24」として、ESP-WROOM-02で新しいネットワーク「192.168.2.0/24」を形成します。
ESP-WROOM-02のWAN側のIPアドレスは192.168.1.33として「192.168.1.0/24」のネットワークに接続します。LAN側が新しいネットワークとなります。
ESP-WROOM-02(192.168.2.1)でWebサーバーを起動します。このサーバーは「192.168.1.0/24」のネットワークからはアクセスできませんので注意して下さい。上記の例でアクセスできるのは新しいネットワークのみです。
次にパソコンまたはスマートフォンで新しいネットワークの「アクセスポイント」(ESP-WROOM-02)へ接続します。接続が確立されましたら、Webサーバーへアクセスします。
2. ESP-WROOM-02のWiFi.mode()
モード | 内容 |
---|---|
WIFI_STA | ステーションモード(無線LAN子機) ※インターネットに接続可能です。 |
WIFI_AP | アクセスポイントモード(無線LAN親機) ※この親機、子機はインターネットに接続できません。 |
WIFI_AP_STA | WIFI_STA + WIFI_APの混合モード ※この親機はインターネットに接続可能です。 ※このAPを利用した子機はインターネットには接続できません。 |
WIFI_OFF | Wifi機能をオフにする |
「WIFI_AP」は親/子機の両方ともインターネットに接続できませんが、ネットワークを形成できます。親機でWebサーバーを起動すれば、子機のブラウザからhttp://192.168.x.x/などにアクセス可能です。
「WIFI_AP_STA」の場合は、親機のみインターネットに接続可能です。子機はインターネットに接続できませんが、親機でWebサーバーを起動して、親機経由でインターネットにアクセスが可能です。
3. スケッチ(プログラム)
SSID、パスワード、IP情報を各自の環境に合わせてください。
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> // 既存のネットワーク用 const char* ssid = "xxx"; const char* password = "xxx"; IPAddress ip(192, 168, 1, 33); IPAddress gateway(192, 168, 1, 1); IPAddress netmask(255, 255, 255, 0); // 新しいネットワーク用(SoftAP用) const char* ap_ssid = "ESP_AP"; const char* ap_password = "ESP_AP_PASSWORD"; IPAddress ap_ip(192, 168, 2, 1); IPAddress ap_gateway(192, 168, 2, 1); ESP8266WebServer server(80); void setup() { Serial.begin(115200); delay(10); // アクセスポイント(無線LAN親機) + ステーション(無線LAN子機) WiFi.mode(WIFI_AP_STA); // 既存のアクセスポイント(ネットワーク)に接続する WiFi.config(ip, gateway,netmask); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); // SoftAPを開始する WiFi.softAPConfig(ap_ip,ap_gateway,netmask); WiFi.softAP(ap_ssid, ap_password); IPAddress myIP = WiFi.softAPIP(); Serial.print("SoftAPのIPアドレス(LAN側): "); Serial.println(myIP); // http://192.168.2.1/ server.on("/", [](){ server.send(200, "text/html", "<h1>Hello!</h1>"); }); // http://192.168.2.1/get // ※http://www.petitmonte.com/rss.xmlにアクセスして内容を表示します。 server.on("/get", [](){ WiFiClient client; const int httpPort = 80; const char* host = "www.petitmonte.com"; const char* path = "/rss.xml"; if (!client.connect(host, httpPort)) { Serial.println("接続に失敗しました。"); return; } // サーバにリクエストを送信 client.print(String("GET ") + path + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> タイムアウトしました。"); client.stop(); return; } } // HTTPヘッダを含むデータの読み取り(1行毎) String raw = ""; while (client.available()) { raw = raw + client.readStringUntil('\n') + '\n'; delay(1); } // HTTPヘッダの削除 int index = raw.indexOf("\r\n\r\n"); raw = raw.substring(index + 4); server.send(200, "application/xml", raw); }); // 404エラー server.onNotFound([](){ server.send(404, "text/plain", "404"); }); server.begin(); } void loop() { // Webサーバの接続要求待ち server.handleClient(); }
4. 実行例
パソコンでアクセスポイントへ接続
スケッチで定義した「ap_ssid」「ap_password」を使用して、新しい無線LANのアクセスポイントへ接続します。
http://192.168.2.1/ へアクセス

http://192.168.2.1/get へアクセス
親機のWebサーバー側でhttp://www.petitmonte.com/rss.xmlにアクセスしてファイルをそのまま吐き出しています。
[Chrome]

[IE11]

※このブログのRSSですので日時によっては内容が異なります。
5. 無線電波の範囲を拡大する
ESP-WROOM-02を複数用意して中継として使えば可能です。
関連記事
ESP-WROOM-02をWebサーバーにする [ステーション版]
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
前の記事: | Wifi経由でArduinoスケッチをマイコンに書き込む [OTA/ESP-WROOM-02] |
次の記事: | SoftwareSerialの「文字化け」や「受信データの破損」対策をする [Arduino/ESP-WROOM-02] |