2021年12月31日金曜日

espr2② (SPIFFS, SoftAP, mDNS,)

 SPIFFS  ----------------------------------------------

https://www.mgo-tec.com/spiffs-filesystem-uploader01-html に詳しい

その応用がhttps://msr-r.net/espr-wifi-robot-1/で詳述(1〜5)

-----------------esp8266 SoftAccessPoint Webserever-------------

これは家庭内LANでなく、独自のAPをたてるので、Wifiでesp8266をえらび12345678を

入れるとOK 自宅内で監視サーバ(各種)をたてるのに便利

https://programresource.net/2020/02/26/3006.html を参照した 

mDNSはウィンドウズではうまくいかんというサイトをみかけた Ubuntuでは成功した

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#include <ESP8266mDNS.h>

#include <DNSServer.h>

//無線LANの設定 アクセスポイントのSSIDとパスワード

const char* ap_ssid = "ESP8266AP";      //APのSSID

const char* ap_password = "12345678";   //APのパスワード 8文字以上

IPAddress ip(192, 168, 1, 100);

IPAddress subnet(255, 255, 255, 0);

const byte DNS_PORT = 53;

DNSServer dnsServer;

ESP8266WebServer server(80);

 String toStringIp(IPAddress ip) {

    String res = "";

    for (int i = 0; i < 3; i++) {

        res += String((ip >> (8 * i)) & 0xFF) + ".";

    }

    res += String(((ip >> 8 * 3)) & 0xFF);

    return res;

}

 

void captivePortal() { //無効リクエストはすべてESP8266に向ける

    server.sendHeader("Location", String("http://") + toStringIp(server.client().localIP()), true);

    server.send(302, "text/plain", "");

    server.client().stop();

}

 

bool handleUrl(String path) {

    if (path.endsWith("/")){

         char chbuffer[64];

         sprintf(chbuffer,"Hello ESP8266");

         server.send(200,"text/plain",chbuffer);

        return true;

    }

    return false;

}

 

void setup() { //無線LAN接続APモード

    WiFi.mode(WIFI_AP);

    WiFi.softAPConfig(ip, ip, subnet);

    WiFi.softAP(ap_ssid, ap_password);

    dnsServer.start(DNS_PORT, "*", ip);

    WiFi.setSleepMode(WIFI_NONE_SLEEP);

 

    server.onNotFound([]() {

        if (!handleUrl(server.uri())) {

            captivePortal(); //ESP8266のページにリダイレクトする capative portalの仕組み

        }

    });

    server.begin();

}

 

void loop() {

    dnsServer.processNextRequest();

    server.handleClient();

}

面白かったのは、espr developper では、SoftAPをえらぶとデフォルトで

192.168.4.1と固定されること!

----------------------------ST mode-------------------------------------------------

localIPでブラウザするとLEDが2秒間だけ点灯

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#define SSID ""

#define PASS ""

//80番ポートのWEBサーバー

ESP8266WebServer server(80);

void setup(){

  Serial.begin(9600);

  pinMode(13,OUTPUT);

  //WiFiに接続

  WiFi.begin(SSID, PASS);

  while(WiFi.status() != WL_CONNECTED){

    delay(500);

    Serial.print(".");

  }

  Serial.println("WiFi connected");

  Serial.println(WiFi.localIP());

   //WEBサーバー起動

  server.on("/", handleRoot);

  server.begin();

  Serial.println("Web Server started");

}

 void loop(){

  server.handleClient();  

}

void handleRoot(){

  server.send(200, "text/plain", "LED on about 2 second");

   digitalWrite(13,HIGH);

  delay(2000);

  digitalWrite(13,LOW);

---------------- ST with mDNS ------------------------------------------
https://www.petitmonte.com/robot/smartphone_led_server.html
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
const char* ssid     = "";
const char* password = "";
 
// 文字列ではなく、数値配列です。
IPAddress ip(192, 168, 3, 33);
IPAddress gateway(192, 168, 3, 1);
IPAddress netmask(255, 255, 255, 0);
 
const int PIN_LED = 5;
String html = "";
 
ESP8266WebServer server(80);
 
void setup(void){
  html = "<!DOCTYPE html>\
<html>\
<head>\
<meta charset=\"UTF-8\">\
<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1\">\
</head>\
<body>\
<br>\
<br>\
<br>\
<input type=\"button\" value=\"オン\" style=\"font-size:32px;\" onclick=\"location.href='/led-ON';\">&nbsp;&nbsp;&nbsp;\
<input type=\"button\" value=\"オフ\" style=\"font-size:32px;\" onclick=\"location.href='/led-OFF';\">\
</body>\
</html>";
 
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, LOW);
 
  Serial.begin(115200);
 
  // WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway,netmask);    
  WiFi.begin(ssid, password);
  Serial.println("");
 
  // Wifi接続ができるまで待機
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("IPアドレス: ");
  Serial.println(WiFi.localIP());
  
  // ローカルネットワーク内のみ有効のmDNS(マルチキャストDNS)を開始
  // bool MDNSResponder::begin(const char* hostname){}
  if (MDNS.begin("petitmonte")) {
    Serial.println("mDNSレスポンダーの開始");
  }
 
  // トップページ
  server.on("/", [](){
    // HTTPステータスコード(200) リクエストの成功
    server.send(200, "text/html", html);     
  });
  
  // LEDをオン
  server.on("/led-ON", [](){
    digitalWrite(PIN_LED, HIGH);
    // HTTPステータスコード(200) リクエストの成功
    server.send(200, "text/html", html);      
  });
 
  // LEDをオフ
  server.on("/led-OFF", [](){
    digitalWrite(PIN_LED, LOW);
    // HTTPステータスコード(200) リクエストの成功
    server.send(200, "text/html", html);      
  });
 
  // 存在しないURLを指定した場合の動作を指定する
  server.onNotFound([](){
    // HTTPステータスコード(404) 未検出(存在しないファイルにアクセス)  
    server.send(404, "text/plain", "404");
  });
 
  server.begin();
  Serial.println("Webサーバーの開始");
}
 
void loop(void){  
  // Webサーバの接続要求待ち
  server.handleClient();
}

0 件のコメント:

コメントを投稿