Разбор HTML-запроса GET с параметрами с помощью WiFiEsp

Итак, я настраиваю веб-сервер с помощью esp-01f+arduino uno. Я использую библиотеку WiFiEsp. Я хочу включить светодиод. Пин будет предоставлен в GET-запросе по URL-адресу. Пример: host.com/?ledpin=9 Как я могу разобрать его, а затем получить число 9?

Код:



#include "WiFiEsp.h"

// Эмулируем Serial1 на контактах 6/7, если они отсутствуют
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // прием, передача
#endif

char ssid[] = "Twim";            // SSID вашей сети (имя)
char pass[] = "12345678";        // ваш сетевой пароль
int status = WL_IDLE_STATUS;

int ledStatus = LOW;

WiFiEspServer server(80);

// используем кольцевой буфер для увеличения скорости и уменьшения выделения памяти
RingBuffer buf(8);

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT); // инициализируем цифровой вывод LED_BUILTIN как выход.
  Serial.begin(115200);   // инициализируем серийный номер для отладки
  Serial1.begin(9600);    // инициализируем серийный номер для модуля ESP
  WiFi.init(&Serial1);    // инициализируем модуль ESP

  // проверяем наличие щита
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // не продолжать
    while (true);
  }

  // попытка подключения к сети Wi-Fi
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2
    status = WiFi.begin(ssid, pass);
  }

  Serial.println("You're connected to the network");
  printWifiStatus();

  // запускаем веб-сервер на порту 80
  server.begin();
}


void loop()
{
  WiFiEspClient client = server.available();  // прослушивание входящих клиентов

  if (client) {                               // если у вас есть клиент,
    Serial.println("New client");             // вывести сообщение из последовательного порта
    buf.init();                               // инициализируем кольцевой буфер
    while (client.connected()) {              // цикл, пока клиент подключен
      if (client.available()) {               // если есть байты для чтения от клиента,
        char c = client.read();               // прочитать байт, затем
        buf.push(c);                          // помещаем его в кольцевой буфер

        // вывод потока на последовательный монитор замедлится
        // получение данных от ESP, заполняющих последовательный буфер
        //Серийный.запись(с);

        // вы получили два символа новой строки подряд
        // это конец HTTP-запроса, поэтому отправьте ответ
        if (buf.endsWith("\r\n\r\n")) {
          sendHttpResponse(client);
          break;
        }

        // Проверяем, был ли запрос клиента "GET /H" или "GET /L":
        if (buf.endsWith("GET /H")) {
          Serial.println("Turn led ON");
          ledStatus = HIGH;
          digitalWrite(LED_BUILTIN, HIGH);   // включаем светодиод (HIGH - уровень напряжения)
        }
        else if (buf.endsWith("GET /L")) {
          Serial.println("Turn led OFF");
          ledStatus = LOW;
          digitalWrite(LED_BUILTIN, LOW);    // выключаем светодиод, понижая напряжение
        }
      }
    }

    // закрываем соединение
    client.stop();
    Serial.println("Client disconnected");
  }
}


void sendHttpResponse(WiFiEspClient client)
{
  // Заголовки HTTP всегда начинаются с кода ответа (например, HTTP/1.1 200 OK)
  // и тип контента, чтобы клиент знал, что придет, затем пустая строка:
  client.println("HTTP/1.1 200 OK");
  client.println("Content-type:text/html");
  client.println();

  // содержимое ответа HTTP следует за заголовком:
  client.print("The LED is ");
  client.print(ledStatus);
  client.println("<br>");
  client.println("<br>");

  client.println("Click <a href=\"/H\">here</a> turn the LED on<br>");
  client.println("Click <a href=\"/L\">here</a> turn the LED off<br>");

  // Ответ HTTP заканчивается еще одной пустой строкой:
  client.println();
}

void printWifiStatus()
{
  // вывести SSID сети, к которой вы подключены
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // напечатать IP-адрес вашего WiFi-экрана
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // печатать куда идти в браузере
  Serial.println();
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
  Serial.println();
}

Details дает мне только это:

GET /favicon.ico HTTP/1.1
Host: 192.168.0.165:5000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://192.168.0.165:5000/H
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7


, 👍-1

Обсуждение

Сначала напечатайте в Serial все полученные запросы. Тогда смотри и думай. Откуда вы знаете, что полезная нагрузка равна 9? Что отличает его настолько, что вы всегда можете идентифицировать его в запросе? Что ты ищешь? Как только вы сможете ответить на них, вы сможете сформулировать более конкретный вопрос, чтобы узнать, как реализовать свой алгоритм, или просто использовать Google, чтобы найти нужные функции., @SoreDakeNoKoto

Можете ли вы легко сказать, как разобрать GET /pin=9?, @TheGamerCoder

И еще вопрос как его записать в серийник?, @TheGamerCoder

Я откатил правку. Не меняйте вопрос полностью. Возможно, кто-то работает над ответом., @Juraj

ХОРОШО. Спасибо. Юрай, @TheGamerCoder

Юрай, можешь ответить? Или я должен объяснить больше, @TheGamerCoder

Эй. Кто-нибудь жив?, @TheGamerCoder

Откуда вы скопировали этот код/скетч? Существует несколько стандартных функций C/C++, которые могут помочь в разборе запроса. Также класс Arduino String содержит для этого несколько функций-членов. Хотите, чтобы мы написали/обновили скетч для вас?, @Mikael Patel

Вот учебник https://techtutorialsx.com/2016/10/22/esp8266-webserver-getting-query-parameters/, @Mikael Patel

Микаэль Патель, если можно, @TheGamerCoder

Учебник работает только при прошивке esp8266., @TheGamerCoder

пожалуйста, обновите мой скетч, @TheGamerCoder

ЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕУ, @TheGamerCoder

ЭЙ, пожалуйста, обновите мой скетч пожалуйста, ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, @TheGamerCoder

ЭЙ. Любой . Обновите мой скетч пожалуйста, @TheGamerCoder


1 ответ


Лучший ответ:

-1

Ответ заключается в использовании функций indexOf и substring строки ответа

,