Asynch Web Server automatisches öffnen von IP bei Verbindung mit softAP

Hallo,

ich habe einen kleinen Asynch Webserver mit dem ich 2 Inputs an meinen Arduino senden kann und wenn beide gesendet wurden, beendet der Server. Soweit so gut.

Jetzt würde ich gerne wenn ich mich mit dem Server per Wlan verbinden, dass die IP im Browser automatisch geöffnet wird und wenn der Server beendet wird soll sich die Seite im Browser automatisch schließen.

Wäre jemand so nett mir da zu helfen bzw. Tips zu geben wie ich das mache?

Danke!!!

Hier mal mein Code soweit:

#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#else
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h>

AsyncWebServer server(80);

IPAddress local_IP(192, 168, 4, 22);
IPAddress gateway(192, 168, 4, 9);
IPAddress subnet(255, 255, 255, 0);

const char *ssid = "MyESPAP";
const char *password = "testpassword";

const char* PARAM_INPUT_1 = "Pfalnze";
const char* PARAM_INPUT_2 = "ID";

const char* inputMessage;
const char* input[1];

int taster = 7;
int tasterstatus = 0;
int count_jump = 0;


// HTML web page to handle 3 input fields (input1, input2, input3)
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <title>ESP Input Form</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  </head><body>
  <form action="/get">
    input1: <input type="text" name="Pfalnze"><br>
    input2: <input type="text" name="ID"><br>
    <input type="submit" value="Submit"><br>
  </form><br>
</body></html>)rawliteral";

void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}


void setup() {
  Serial.begin(115200);
  Serial.print("Setting soft-AP configuration ... ");
  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");

  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP(ssid, password) ? "Ready" : "Failed!");

  Serial.print("Soft-AP IP address = ");
  Serial.println(WiFi.softAPIP());

  server.begin();
  server.onNotFound(notFound);

  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/html", index_html);
  });

  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest * request) {
    int params = request->params();
    for (int i = 0; i < params; i++) {
      AsyncWebParameter* p = request->getParam(i);
      if (p->isFile()) { //p->isPost() is also true
        Serial.printf("FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
      } else if (p->isPost()) {
        Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
      } else {
        inputMessage = ("GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
        String input_string = inputMessage;
        Serial.println("Input string");  //debuging
        Serial.println(inputMessage); //debuging
        Serial.println("Länge Input string"); //debuging
        int str_len = input_string.length(); //debuging
        Serial.println(str_len);
        Serial.print("i ");  //debuging
        Serial.println(i); //debuging
        if (str_len == 0 && i == 0) {
          Serial.println("Pflanze keine eingabe");
          request->send(200, "text/html", "Pflanze ist leer<br> Send Data to sensor again"
                        "<br><a href=\"/\">Send Input</a>");
          count_jump = count_jump - 1;
          Serial.print("count_jump ");  //debuging
          Serial.println(count_jump); //debuging
        }
        else if (str_len == 0 && i == 1) {
          Serial.println("ID keine eingabe");
          request->send(200, "text/html", "ID ist leer<br> Send Data to sensor again"
                        "<br><a href=\"/\">Send Input</a>");
          count_jump = count_jump - 1;
          Serial.print("count_jump ");  //debuging
          Serial.println(count_jump); //debuging
        }
        else {
          Serial.println("Input Message const char*"); //debuging
          Serial.println(inputMessage); //debuging
          input[i] = inputMessage;
          Serial.println("Input[] const char*"); //debuging
          Serial.println(input[i]); //debuging
          count_jump = count_jump + 1;
          Serial.print("count_jump ");  //debuging
          Serial.println(count_jump); //debuging
          if (count_jump == 2) {
            Serial.println("Wifi disconnect");
            WiFi.disconnect();
            Serial.println("Server end");
            server.end();
            Serial.print("Input[0]");
            Serial.println(input[0]); //debuging
            Serial.print("Input[1]"); //debuging
            Serial.println(input[1]); //debuging
            //Serial.print("Input[2]"); //debuging
            //Serial.println(input[2]); //debuging
          }
        }
      }
    }
    //request->send(200, "text/html", index_html);
  });
}

void loop() {}

danke
schönen tag euch!

gibts fertig.
Suche nach Captive Portal ESP32

Hey,

danke für die Antwort.

ja ok, versteh dort aber nicht wie ich meine request bzw das Get einbauen soll, da ich mich erst damit beschäftigen anfange.

Du meinst dieses Bsp?

#include <DNSServer.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include "ESPAsyncWebServer.h"

DNSServer dnsServer;
AsyncWebServer server(80);

class CaptiveRequestHandler : public AsyncWebHandler {
public:
  CaptiveRequestHandler() {}
  virtual ~CaptiveRequestHandler() {}

  bool canHandle(AsyncWebServerRequest *request){
    //request->addInterestingHeader("ANY");
    return true;
  }

  void handleRequest(AsyncWebServerRequest *request) {
    AsyncResponseStream *response = request->beginResponseStream("text/html");
    response->print("<!DOCTYPE html><html><head><title>Captive Portal</title></head><body>");
    response->print("<p>This is out captive portal front page.</p>");
    response->printf("<p>You were trying to reach: http://%s%s</p>", request->host().c_str(), request->url().c_str());
    response->printf("<p>Try opening <a href='http://%s'>this link</a> instead</p>", WiFi.softAPIP().toString().c_str());
    response->print("</body></html>");
    request->send(response);
  }
};


void setup(){
  //your other setup stuff...
  WiFi.softAP("esp-captive");
  dnsServer.start(53, "*", WiFi.softAPIP());
  server.addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER);//only when requested from AP
  //more handlers...
  server.begin();
}

void loop(){
  dnsServer.processNextRequest();
}

Vlt hättest du kurz zeit mir tipps zu geben wie ich meinen code mit dem zusammenfüge?

danke

Hier gibt es ziemlich eine ausführliche Anleitung mit Beispielen für die Library AutoConnect

https://hieromon.github.io/AutoConnect/index.html

Das scheint eine sehr umfassende Lib zu sein, die beispielsweise gleich eine Routine beinhaltet, bei der man nach dem Upload eines Sketches z.B. per Smartphone im Browser SSID und WLAN-Passwort dem Board mitgeben kann, ohne es vorher mit zu coden.

Captive portal control wird auch "mitgeliefert", ebenso wie die Verwaltung gespeicherter SSID/PwD-Daten, Authentifizierung, Auto-Reconnect, usw. ...

Hallo,

danke für die Antworten, hab durch die Tipps was gefunden.
hab jetzt nur ein Prblem aber das poste ich in einen neuen Therad.

DANKE an die Leute die geantwortet haben.

mfg

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.