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

Как правильно принять JSON – массив, отправленный ESP8266?

Mestniy2496

Member
Так. С Самого начала. Сервер - Арда. Клиент - приложение. В арде нужно прописать этот адрес к которому будет подключаться приложение. При подключении приложения к арде, нужно принимать данные в виде стринг по get. Иотправлять ответ в json.
 

Mestniy2496

Member
Т.е. мне просто нужно принять GET зпрос, в таком виде, который я написал и отправить JSON ответ.
 

Алексей.

Active member
Никаких сложностей нет, как я сказал выше, добавьте ещё на esp установку ip адреса для интерфейса AP, используйте адрес из диапазона адресов для локального использования #rfc1918 например 192.168.25.1, адрес 127.0.0.1 использовать не нужно.
 

Mestniy2496

Member
Никаких сложностей нет, как я сказал выше, добавьте ещё на esp установку ip адреса для интерфейса AP, используйте адрес из диапазона адресов для локального использования #rfc1918 например 192.168.25.1, адрес 127.0.0.1 использовать не нужно.
Спасибо большое. Не могу найти толком прием html запроса.
 

Mestniy2496

Member
Доброго дня. Кто знает, где здесь пример приема get запроса?
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "........";
const char* password = "........";

ESP8266WebServer server(80);

const int led = 13;

void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp8266!");
  digitalWrite(led, 0);
}

void handleNotFound(){
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void){
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", [](){
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

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

Алексей.

Active member
В вашем коде пример приема запросов для url-лов "/" "/inline" и обработчик всех остальных "onNotFound". Без ограничения выполняемых методов (get post и т.д).
Установили обработчики запросов явно не указывая какой метод обрабатывает этот обработчик
Например для запроса корневого url установили server.on("/", handleRoot);
Или для запроса /inline установили
Код:
server.on("/inline", [](){
  server.send(200, "text/plain", "this works as well");
});
Таким образом при выполнение любых методов перечисленных в
Код:
enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_HEAD, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS };
будут вызываться ваши обработчики.
Вы можете ограничить вызов обработчика конкретным методом, например get
Код:
server.on("/inline", HTTP_GET, [](){
  server.send(200, "text/plain", "this works as well");
});
 

Алексей.

Active member
Какие строки?
Вызывая handleClient даете поработать серверу, если запрос от клиента получен и есть обработчик для запрошенного url - будет вызван этот обработчик.
В обработчике используйте методы сервера для получения от него каких либо данных.
Если если те строки, которые вы хотели найти это то что указываете в url, например: http://my-server/inline?param1=value1&param2=value2
то передаваемые параметры получайте от сервера, всё-же есть в вашем коде.
Код:
for (uint8_t i=0; i<server.args(); i++){
  message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
 
Сверху Снизу