• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь получение json

Houston1337

New member
Привет! Помогите пожалуйста разобраться. Есть html страница, которую esp отправляет пользователю, пользователь на этой станице выбирает какие- то параметры и отправляет данные в виде json обратно на esp. Они приходят. Как их поместить в буфер JsonObject? Распарсить сам думаю смогу. Спасибо
JavaScript:
/*функция отправки данных */
        $('#send').click(function (){
            xhr = new XMLHttpRequest();
            var led = {
            num_sing: number_single,
            col_sing: color_single,
            num_s_rain: number_start_rainbow,
            num_e_rain: number_end_rainbow
            }
            xhr.open("POST", '/myledstrip', true);
            xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
            xhr.send(JSON.stringify(led));
        });
Код:
#include <ESP8266WiFi.h>                                               
#include <ESP8266WebServer.h>                                         
#include <FS.h>                                                       
#include <ESP8266FtpServer.h>                                         
#include <ArduinoJson.h>

const byte relay = 4;                                                  
const char *ssid = "MyESP";                                           

ESP8266WebServer HTTP(80);                                              // Определяем объект и порт сервера для работы с HTTP
FtpServer ftpSrv;                                                       // Определяем объект для работы с модулем по FTP (для отладки HTML)

void setup() {
  pinMode(relay,OUTPUT);                                                // Определяем пин реле как исходящий
  Serial.begin(9600);                                                   // Инициализируем вывод данных на серийный порт со скоростью 9600 бод
  WiFi.softAP(ssid);                                                    // Создаём точку доступа
  SPIFFS.begin();                                                       // Инициализируем работу с файловой системой                         
  HTTP.begin();                                                         // Инициализируем Web-сервер
  ftpSrv.begin("relay","relay");                                        // Поднимаем FTP-сервер для удобства отладки работы HTML (логин: relay, пароль: relay)

  Serial.print("\nMy IP to connect via Web-Browser or FTP: ");          // Выводим на монитор серийного порта сообщение о том, что сейчас будем выводить локальный IP
  Serial.println(WiFi.softAPIP());                                      // Выводим локальный IP-адрес ESP8266
  Serial.println("\n");

// Обработка HTTP-запросов
HTTP.on("/myledstrip", myledstrip);                                
     
  HTTP.onNotFound([](){                                                 // Описываем действия при событии "Не найдено"
  if(!handleFileRead(HTTP.uri()))                                      
      HTTP.send(404, "text/plain", "Not Found");                       
  });
}

void loop() {
    HTTP.handleClient();                                                // Обработчик HTTP-событий (отлавливает HTTP-запросы к устройству и обрабатывает их в соответствии с выше описанным алгоритмом)
    ftpSrv.handleFTP();                                                 // Обработчик FTP-соединений 
}

void myledstrip() {                                                 // Функция обработки json
Serial.println("данные\n");                                             // ЗДЕСЬ НЕПОНЯТНО                                 
}

bool handleFileRead(String path){                                       // Функция работы с файловой системой
  if(path.endsWith("/")) path += "index.html";                          // Если устройство вызывается по корневому адресу, то должен вызываться файл index.html (добавляем его в конец адреса)
  String contentType = getContentType(path);                            // С помощью функции getContentType (описана ниже) определяем по типу файла (в адресе обращения) какой заголовок необходимо возвращать по его вызову
  if(SPIFFS.exists(path)){                                              // Если в файловой системе существует файл по адресу обращения
    File file = SPIFFS.open(path, "r");                                 //  Открываем файл для чтения
    size_t sent = HTTP.streamFile(file, contentType);                   //  Выводим содержимое файла по HTTP, указывая заголовок типа содержимого contentType
    file.close();                                                       //  Закрываем файл
    return true;                                                        //  Завершаем выполнение функции, возвращая результатом ее исполнения true (истина)
  }
  return false;                                                         // Завершаем выполнение функции, возвращая результатом ее исполнения false (если не обработалось предыдущее условие)
}

String getContentType(String filename){                                 // Функция, возвращающая необходимый заголовок типа содержимого в зависимости от расширения файла
  if (filename.endsWith(".html")) return "text/html";                   // Если файл заканчивается на ".html", то возвращаем заголовок "text/html" и завершаем выполнение функции
  else if (filename.endsWith(".css")) return "text/css";                // Если файл заканчивается на ".css", то возвращаем заголовок "text/css" и завершаем выполнение функции
  else if (filename.endsWith(".js")) return "application/javascript";   // Если файл заканчивается на ".js", то возвращаем заголовок "application/javascript" и завершаем выполнение функции
  else if (filename.endsWith(".png")) return "image/png";               // Если файл заканчивается на ".png", то возвращаем заголовок "image/png" и завершаем выполнение функции
  else if (filename.endsWith(".jpg")) return "image/jpeg";              // Если файл заканчивается на ".jpg", то возвращаем заголовок "image/jpg" и завершаем выполнение функции
  else if (filename.endsWith(".gif")) return "image/gif";               // Если файл заканчивается на ".gif", то возвращаем заголовок "image/gif" и завершаем выполнение функции
  else if (filename.endsWith(".ico")) return "image/x-icon";            // Если файл заканчивается на ".ico", то возвращаем заголовок "image/x-icon" и завершаем выполнение функции
  return "text/plain";                                                  // Если ни один из типов файла не совпал, то считаем что содержимое файла текстовое, отдаем соответствующий заголовок и завершаем выполнение функции
}
что выводиться в консоли:
 

Алексей.

Active member
Houston1337,
Он вам уж в выводе говорит что у него (у сервера) есть key/value пары
и ключ "plain" содержит значение того джейсона которого вы ждете, берите этот plain и парсите
Код:
String s = HTTP.arg("plain");
if (s.length() > 0) {
   DynamicJsonDocument doc(1024);
   DeserializationError error = deserializeJson(doc, s);
   if (error) {
       // TODO
   } else {
       JsonObject root = doc.as<JsonObject>();
       if (root.containsKey("num_string")) {
           String num_string = root["num_string"];
       }
   }
}
 
Сверху Снизу