チラシの裏の電子工作

電子工作、PC関係の備忘録というか、チラシの裏

ESP-WROOM-02 CaptivePortal

ESP-WROOM-02でCaptive Portalを実現する方法のメモ。
(Arduino1.6.7 esp8266-2.0.0)

Captive Portalとは何ぞや
例えば、

  1. ESPをスイッチを押しながら電源を入れるとアクセスポイントとして起動
  2. PCからESPのアクセスポイントに接続する
  3. するとあら不思議、ESPの設定画面が表示される
  4. ESPが本来接続しにいくSSIDとかを設定して、電源を入れ直す

と、こんな感じの事ができます。
こんな仕掛けがあれば、SSIDをハードコーディングしなくてよくなるわけですよ。
ISPFFSを使ったりして値を保存/呼び出す手間は増えますが。

海外のサイトとか見に行くと、できるとかできないとかわちゃわちゃ言ってます。
多分、端末によってできる/できないがあるのでしょう。
自分の場合はWindows10端末では自動的に設定画面を開くところまでできました。
Android4.1端末では自動的に設定画面が開かなかったので、自分でブラウザを開く必要がありました。

で、海外のサイトに転がってたソースを眺めてたんですが、要点がよく解らないので調べてみた。


押さえておくべき要点
  • DNSサーバを動かす
  • NotFoundのハンドルで404を返してはいけない。
    htmlそのものを返すか、302あたりで他のページにリダイレクトする(今回は後者を選択)
この2点だけ。

と言うわけで、以下サンプル。

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>

ESP8266WebServer server (80);
DNSServer dnsServer;

void handleRoot(){
    server.send ( 200, "text/plain", "root" );
}

void handleSetup(){
    server.send ( 200, "text/plain", "setup" );
}

void setup(){
    Serial.begin(9600);
    
    //タクトスイッチとかで切り替えられるようにする
    bool captive=true;
   
    server.begin();
    server.on("/",handleRoot);
    server.on("/setup",handleSetup);

    if(captive){
        
        //NotFoundを設定ページに飛ばす
        server.onNotFound([]() {
            server.sendHeader("Location", "/setup", true);
            server.send(302, "text/plain", "");
        });
        
        //softAPの設定
        IPAddress apIP(192,168,4,1);
        IPAddress apMASK(255,255,255,0);
        
        WiFi.mode(WIFI_AP);
        WiFi.softAPConfig(apIP, apIP, apMASK);
        WiFi.softAP("ESP8266-SETUP");
        dnsServer.start(53, "*", apIP);
        
        //loop()の代わり
        while(1){
            dnsServer.processNextRequest();
            server.handleClient();
        }
        
    }
    
    //以下通常の処理
    server.onNotFound([]() {
        server.send ( 404, "text/plain", "notfond" );
    });
    
    WiFi.mode(WIFI_STA);
    WiFi.begin("hgoe","hoge");
    while(WiFi.status() != WL_CONNECTED){
        delay(500);
        Serial.print(".");
    }
    Serial.println(WiFi.localIP());
}


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





スポンサーサイト

カテゴリ:電子工作

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://nax9800.blog.fc2.com/tb.php/112-5da54ce1
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad