ホーム > カテゴリ > ロボット・電子工作・マイコン >

ESP-WROOM-02をWebサーバーにする [ステーション+アクセスポイント版]

ESP-WROOM-02を「ステーション + アクセスポイント」の混合モードでWifiに接続後、そのIPアドレスを使用してWebサーバーを起動します。

その後、パソコンでそのアクセスポイントに接続して、起動したWebサーバーへアクセスします。

今回は2重ルーターのお話にもなりますので、2重ルーターに関しては2重ルーターでネットワークに2台のルータを設置するをご覧ください。

ESP-WROOM-02がはじめての方はデータを送受信をするIoTデバイスの作り方 [ESP-WROOM-02版]を先にご覧ください。

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_STAWIFI_STA + WIFI_APの混合モード
※この親機はインターネットに接続可能です。
※このAPを利用した子機はインターネットには接続できません。
WIFI_OFFWifi機能をオフにする

「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・ラズパイ等)でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年04月27日 最終更新日:2017年05月05日
記事NO:02340