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] |
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









