Сервер на esp и отправка на него json файла из 1с

всем привет, нужно реализовать задачу, в которой esp-01(8266) выступает в роле сервера с пустой страницей, к нему подключается клиент (1с) и отправляет post запрос с json файлом. Столкнулся с проблемой. Get запрос работает хорошо, в обратную связь выдает код 200
а вот с json файлом выводит код ошибки 404. URL странице является ipшник модуля.
Буду очень рад помощи
код esp выглядит следующим образом:
‘’’
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>

const char* ssid = “YourWiFiSSID”;
const char* password = “YourWiFiPassword”;

ESP8266WebServer server(80);

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

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println(“Connecting to WiFi…”);
}

Serial.println(“Connected to WiFi”);

server.on(“/”, HTTP_GET, {
server.send(200, “text/html”, “”);
});

server.on(“/data”, HTTP_POST, {
if(server.hasArg(“plain”)){
String data = server.arg(“plain”);
Serial.println(data);

    // Parse JSON data
    StaticJsonDocument<200> doc;
    DeserializationError error = deserializeJson(doc, data);

    if (error) {
      Serial.print("Failed to parse JSON: ");
      Serial.println(error.c_str());
    } else {
      // Print parsed JSON data
      Serial.println("Parsed JSON:");
      serializeJsonPretty(doc, Serial);
      Serial.println();
    }

    server.send(200, "text/plain", "Data received: " + data);
} else {
    server.send(400, "text/plain", "No data received");
}

});

server.begin();
}

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

2 лайка

и от меня плюсик. за темную тему!

Для ТС: нормальный программист знает разницу между прямым и ОБРАТНЫМ апострофом

я не совсем программист, и только учусь) Можно как-нибудь отредактировать свой текст или нужно заново вопрос задавать?

Постом ниже этого вставь.

попробуй посмотреть тут

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

const char* ssid = “YourWiFiSSID”;
const char* password = “YourWiFiPassword”;

ESP8266WebServer server(80);

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

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println(“Connecting to WiFi…”);
}

Serial.println(“Connected to WiFi”);

server.on(“/”, HTTP_GET, {
server.send(200, “text/html”, “”);
});

server.on(“/data”, HTTP_POST, {
if(server.hasArg(“plain”)){
String data = server.arg(“plain”);
Serial.println(data);


// Parse JSON data
    StaticJsonDocument<200> doc;
    DeserializationError error = deserializeJson(doc, data);

    if (error) {
      Serial.print("Failed to parse JSON: ");
      Serial.println(error.c_str());
    } else {
      // Print parsed JSON data
      Serial.println("Parsed JSON:");
      serializeJsonPretty(doc, Serial);
      Serial.println();
    }

    server.send(200, "text/plain", "Data received: " + data);
} else {
    server.send(400, "text/plain", "No data received");
}


});

server.begin();
}

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

Не совсем то, в статье пример работы если esp выступает в роле клиента, а в моем проекте esp сервер

В примере к библиотеке вот такое имеется:

 server.on("/postform/", handleForm);
...
void handleForm() {
  if (server.method() != HTTP_POST) {
...
  } else {
    digitalWrite(led, 1);
    String message = "POST form was:\n";
    for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; }
    server.send(200, "text/plain", message);
    digitalWrite(led, 0);
  }
}

Посмотрите в котором server.arg(i) находится json и именно его подсовывайте парсеру JSON.

вместо "/postform/" нужно вставить url сервера создаваемого esp?
ArduinoJson.h это же из этой библиотеки пример ?

Перебираете тут:

server.on(“/data”, HTTP_POST, {
...

Найденное подсовываете сюда:

String data = server.arg(“plain”);

решил сделать по другому, esp видит и понимает, какой запрос ей приходит, но почему то с json не хочет работать. То есть при отправке get, в монитор порта выводит, что пришел get, с post точно также но при обработке json выдает ошибку
вот код

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>

const char* ssid = "wifi";
const char* password = "password";
WiFiServer server(80);

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

  // Подключение к Wi-Fi сети
  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");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Начало сервера
  server.begin();
  Serial.println("Server started");
}

void loop() {
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client.");

    while (client.connected()) {
      if (client.available()) {
        String request = client.readStringUntil('\n');
        Serial.println(request);

        DynamicJsonDocument jsonDoc(1024);
        DeserializationError error = deserializeJson(jsonDoc, request);

        if (error) {
          Serial.print("deserializeJson() failed: ");
          Serial.println(error.c_str());
        } else {
          serializeJsonPretty(jsonDoc, Serial);
          Serial.println();
        }

        break;
      }
    }

    delay(50000); // Небольшая задержка перед закрытием соединения
    client.stop();
    Serial.println("Client disconnected.");
  }
}

Не надо метаться.
Сначала научитесь получать текстом JSON по POST, потом уже с десереализацией начнете сражаться.
Способ с вебсервером более правильный. Делал парсинг JSON не раз, но на ESP32.

Оно вообще не знает, что такое json. Это просто какой-то текст, а что с ним будет делать программист, esp вообще не волнует.

Смотрите, что там конкретно приходит - вполне вероятно, что в текст добавляются какие-то символы, и ArduinoJSON уже не определяет этот текст, как корректный json-формат

Вот пример обработки json из post-запроса

    // сохранение настроек
    http_server->on(FPSTR(SR_SET_CONFIG), HTTP_POST, handleSetConfig);

....................................

static void handleSetConfig()
{
  if (http_server->hasArg("plain") == false)
  {
    http_server->send(200, FPSTR(TEXT_PLAIN), F("Body not received"));
    println(F("Failed to save configuration data, no data"));
    return;
  }

  String json = http_server->arg("plain");

  DynamicJsonDocument doc(CONFIG_SIZE);

  DeserializationError error = deserializeJson(doc, json);
  if (error)
  {
    println(F("Failed to save configuration data, invalid json data"));
    println(error.f_str());
  }
  else
  {
     // а здесь разбирайте свой json  на составляющие и делайте с ним что вам нужно  
    http_server->send(200, FPSTR(TEXT_HTML), F("<META http-equiv='refresh' content='1;URL=/'><p align='center'>Save settings...</p>"));
  }
}

На web-странице выставляю нужные настройки и жму сохранить. Страница формирует список настроек в json-формате и отправляет серверу. Сервер принимает и разбирает на параметры

сделал вот так, но всегда пишет, что запрос пустой

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>

const char* ssid = "wifi";
const char* password = "password";
WiFiServer server(80);

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

  // Подключение к Wi-Fi сети
  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");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Начало сервера
  server.begin();
  Serial.println("Server started");
}

void loop() {
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client.");

    while (client.connected()) {
      if (client.available()) {
        // Прочитать строку запроса HTTP
        String requestLine = client.readStringUntil('\n');
        Serial.println(requestLine);

        // Прочитать заголовки запроса HTTP
        String headerLine = client.readStringUntil('\n');
        while (headerLine != "\r") {
          Serial.println(headerLine);
          headerLine = client.readStringUntil('\n');
        }

        // Прочитать тело запроса HTTP
        int contentLength = headerLine.toInt();
        String requestBody;
        while (client.available() < contentLength) {
          delay(1);
        }
        // Добавить пустую строку между заголовками и телом запроса
        requestBody += "\r\n";
        while (contentLength > 0) {
          while (client.available()) {
            char c = client.read();
            requestBody += c;
            contentLength--;
            if (contentLength == 0) {
              break;
            }
          }
        }
        Serial.println(requestBody);

        // Удалить пробелы и символы перевода строки из тела запроса
        requestBody.trim();

        // Проверить, что тело запроса не пустое
        if (requestBody.length() == 0) {
          Serial.println("Empty request body");
        } else {
          // Распарсить JSON-данные из тела запроса
          DynamicJsonDocument jsonDoc(1024);
          DeserializationError error = deserializeJson(jsonDoc, requestBody);

          if (error) {
            Serial.print("deserializeJson() failed: ");
            Serial.println(error.c_str());
          } else {
            serializeJsonPretty(jsonDoc, Serial);
            Serial.println();
          }
        }

        break;
      }
    }

    delay(30000); // Небольшая задержка перед закрытием соединения
    client.stop();
    Serial.println("Client disconnected.");
  }
}

или лучше что-то такое

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

const char* ssid = "wifi";
const char* password = "password";
ESP8266WebServer server(80);


const int CONFIG_SIZE = 1024;

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

  // Подключение к Wi-Fi сети
  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");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Начало сервера
  server.on(localIP, HTTP_POST, handleSetConfig);
  server.begin();
  Serial.println("Server started");
}

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

void handleSetConfig() {
  if (server.hasArg("plain") == false) {
    server.send(200, "text/plain", "Body not received");
    Serial.println("Failed to save configuration data, no data");
    return;
  }

  String json = server.arg("plain");

  DynamicJsonDocument doc(CONFIG_SIZE);

  DeserializationError error = deserializeJson(doc, json);
  if (error) {
    server.send(200, "text/plain", "Invalid JSON data");
    Serial.println("Failed to save configuration data, invalid json data");
    Serial.println(error.f_str());
    return;
  }

  // Здесь вы можете обработать JSON-данные
  // Например, вывести их в серийный порт:
  serializeJsonPretty(doc, Serial);
  Serial.println();

  // Отправить ответ клиенту
  server.send(200, "text/plain", "Configuration data saved");
}

Ну и как?

server.on(localIP, HTTP_POST, handleSetConfig);
как минимум тут у меня ошибка
поменял тут
сonst char* SR_SET_CONFIG = "/";
и тут
server.on(SR_SET_CONFIG, HTTP_POST, handleSetConfig);
Пытаюсь проверить, пока проблемы с перепрошивкой

Какая?