• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос как принимать HTTP запрос в режиме WiFi access point

foxsto

New member
плату ESP8266 получил недавно, поковырял скетчи
Код:
/*
*  This sketch demonstrates how to set up a simple HTTP-like server.
*  The server will set a GPIO pin depending on the request
*    http://server_ip/gpio/0 will set the GPIO2 low,
*    http://server_ip/gpio/1 will set the GPIO2 high
*  server_ip is the IP address of the ESP8266 module, will be
*  printed to Serial when the module is connected.
*/

#include <ESP8266WiFi.h>

const char* ssid = "your-ssid";
const char* password = "your-password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
 
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);
 
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected
  // when the function returns and 'client' object is detroyed
}
и
Код:
/*

/* Create a WiFi access point and provide a web server on it. */

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

/* Set these to your desired credentials. */
const char *ssid = "ESPap";
const char *password = "thereisnospoon";

ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
* connected to this access point to see it.
*/
void handleRoot() {
    server.send(200, "text/html", "<h1>You are connected</h1>");
}

void setup() {
    delay(1000);
    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");
    /* You can remove the password parameter if you want the AP to be open. */
    WiFi.softAP(ssid, password);

    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);
    server.on("/", handleRoot);
    server.begin();
    Serial.println("HTTP server started");
}

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

обьясните пожалуйста логику как , в первом скетче с сайта получает GET запросы
как эта переменная (req) получает данные все что идут сразу после http://192.168.4.1
если я ввожу в браузере http://192.168.4.1/12356754
то (req) получит /12356754

как не пытался во второй скетч WiFiAccessPoint прикрутить эту функцию но понял что не знаю как реализован вызов этой функции
подскажите куда копать или как во второй скетч дописать элемент приема запросов с сайта.
 

Vitaly

Member
второй скетч разбирает запросы с помощью библиотеки ESP8266WebServer и тут это сделано по другому
надо создать свою функцию и на старте её зарегистрировать server.on("/12356754", handleMyPageFunc);
при обращении к /12356754будет вызвана эта функция


в первом скетче всё вручную, парсинг переменных и прочее
 

foxsto

New member
второй скетч разбирает запросы с помощью библиотеки ESP8266WebServer и тут это сделано по другому
надо создать свою функцию и на старте её зарегистрировать server.on("/12356754", handleMyPageFunc);
при обращении к /12356754будет вызвана эта функция


в первом скетче всё вручную, парсинг переменных и прочее
о спасибо) смысл ясен хотя я совсем не ожидал такого вызова, а как ручками прикрутить функцию чтобы как в первом варианте. этот способ server.on("/12356754", handleMyPageFunc); идеальный но он не дает наглядности как это все работает)
 

Vitaly

Member
это обработчик всех поступающих соединений
он разбирает post и get параметры, вызывает зарегистрированную по имени страницы на старте функцию

для работы с параметрами в функции занимающейся страницей можно использовать
if (server.hasArg("var"))
if (server.arg("var") == "abc")
описания лучше чем базовый пример и исходники библиотеки для подробностей не видел
 
Последнее редактирование:

Andr

New member
это обработчик всех поступающих соединений
он разбирает post и get параметры, вызывает зарегистрированную по имени страницы на старте функцию
А на сколько максимально редко можно ее вызывать, что бы гарантированно не пропускать входящие соединения? От чего это зависит?
 
Сверху Снизу