Не удается прочитать данные JSON с клиента (веб-страницы) с помощью Arduino Leonardo ETH

Я считываю цифровой контакт и подсчитываю, сколько раз этот контакт включен, после чего данные отправляются в формате JSON. До сих пор все работало хорошо. Но я хочу ввести значение с веб-страницы в arduino, чтобы arduino знал, с какого числа он должен считаться. Я изменил веб-страницу, я конвертирую значение в формат JSON, все. Но я не могу получить его на arduino. Я вижу значение на последовательном мониторе непосредственно перед отключением клиента. Но я просто не могу понять, что я делаю не так, может быть, у вас, ребята, есть предложение?

Вот мой код Arduino (немного запутанный, и я не сделал ту часть, где я сообщаю arduino число, с которого оно должно начать отсчет, я сделаю это после того, как смогу получить свои номера с веб-страницы). При необходимости я также могу добавить код веб-страницы.

#include <SD.h>
#include <SPI.h>
#include <Ethernet2.h>
#include <ArduinoJson.h>

int pin = 3;
int state = 0;
//==========================
int push = 0;
//==========================
int laststate = 0;
const int chipS = 4;

byte mac[] = {0x00, 0x08, 0xDC, 0x1C, 0xB8, 0x4C}; // Введите MAC-адрес, который указан на вашем сетевом экране (наклейке) - например. 00-08-DC-1C-B8-4C (но используйте шестнадцатеричный формат, например. 0x00)
IPAddress ip(192, 168, 0, 88);                     // IP-адрес, который вы предоставите Серверу, будет зависеть от диапазона вашей локальной сети
EthernetServer server(8880);                       // Порт для прослушивания веб-браузеров - по умолчанию 80, но некоторые маршрутизаторы блокируют этот порт.. так что переключитесь на 8081.

//*************************************************************************************************
// функция настройки
//=================================================================================================
void setup()
{
    Serial.begin(9600); // Начать последовательную связь (скорость передачи данных = 9600).
    while (!Serial)
    {
        ; // дождитесь подключения последовательного порта. Требуется только для Леонардо
    }

    Ethernet.begin(mac, ip); // Инициализируйте библиотеку ethernet и сетевые настройки: https://www.arduino.cc/en/Reference/EthernetBegin
    server.begin();          // Сообщите серверу начать прослушивание входящих подключений (на порту 8081 в этом примере)
    Serial.print("Server IP address : ");
    Serial.println(Ethernet.localIP()); // Если вы видите IP-адрес в последовательном мониторе - вы знаете, что сервер успешно запущен
    Serial.println(" ");

    // cardlaif - ИНИЦИАЛИЗАЦИЯ SD-КАРТЫ
    Serial.println("Initializare card...");
    if (!SD.begin(chipS))
    {
        Serial.println(" Initializarea cardului a esuat sau cardul lipseste ");
        while (1)
            ;
    }
    Serial.println(" Card initializat ");
    Serial.println(" ");
    pinMode(3, INPUT);
}

//*************************************************************************************************
// функция цикла
//=================================================================================================
void loop()
{
    //=====================================================================================================
    // СЧЕТЧИК КОНТАКТОВ contor 3
    //======================================================================================================
    state = digitalRead(pin);

    if (state != laststate)
    {
        if (state == HIGH)
        {
            push++;
        }
        delay(50);
    }
    laststate = state;

    Serial.print(" nr. citiri: ");
    Serial.println(push);
    //====================================================================================================
    // карта SD-КАРТА ДЛЯ ЗАПИСИ КОДА
    //====================================================================================================
    String dataString = " ";
    dataString += String("nr. citiri: ");
    dataString += String(push);

    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    if (dataFile)
    {
        dataFile.println(dataString);
        dataFile.close();
    }
    else
    {
        Serial.println("error opening datalog.txt");
    }
    //========================================================================================================
    // нетто
    //========================================================================================================
    EthernetClient client = server.available(); // назначьте все вновь подключенные веб-браузеры переменной "client".

    if (client.connected())
    {
        Serial.println("Client Connected");
        // char c = client.read();
        // Serial.print(c);
        while (client.available())
        {
            Serial.write(client.read()); // Раскомментируйте, если вы хотите записать запрос из браузера (КЛИЕНТА) на ПОСЛЕДОВАТЕЛЬНЫЙ МОНИТОР (и закомментировать следующую строку)
            // client.read(); // Эта строка очистит буфер связи между клиентом и сервером.
        }

        // Отправьте заголовок ответа сервера обратно в браузер.
        client.println(F("HTTP/1.1 200 OK"));                                                                                           // Это сообщает браузеру, что запрос на предоставление данных был принят
                                                                                                                                        // client.println("ПОЛУЧИТЬ");
        client.println(F("Access-Control-Allow-Origin: *"));                                                                            // Сообщает браузеру, что он принял его запрос на данные из другого домена (источника).
        client.println(F("Access-Control-Allow-Methods:  GET,POST,PUT,DELETE,OPTIONS"));                                                // arduino будет принимать данные в формате JSON, используя это
        client.println(F("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With")); // arduino будет принимать данные в формате JSON, используя это
        client.println(F("Content-Type: application/json;charset=utf-8"));                                                              // Позволяет браузеру узнать, что данные будут в формате JSON
        client.println(F("Server: Arduino"));                                                                                           // Данные поступают с веб-сервера Arduino (эту строку можно опустить)
        client.println(F("Connection: close"));                                                                                         // Закроет соединение в конце передачи данных.
        client.println();                                                                                                               // Вам нужно включить эту пустую строку - она сообщает браузеру, что он дошел до конца заголовка ответа сервера.

        // Пример передачи: [{"ключ": 0, "значение":300},{"ключ": 1, "значение":320},{"ключ": 2, "значение": 143},{"ключ": 3, "значение":24},{"ключ": 4, "значение": 760},{"ключ": 5, "значение": 470}]
        client.print("[");            // Это начальная скобка данных JSON
        client.print("{\"value\": "); // Значение, которое я считываю на выводе 3 и отправляю в формате JSON на веб-страницу
        client.print(push);           // Значение, которое я считываю на выводе 3 и отправляю в формате JSON на веб-страницу
        client.print("}");            // Вещи в формате JSON
        client.println("]");          // Это последняя скобка данных JSON
    }

    //=================================================================================================
    // попытка печати по последовательным данным json
    //=================================================================================================
    char json[] = "{\"index\" }";
    StaticJsonBuffer<300> jsonBuffer;
    JsonObject &root = jsonBuffer.createObject();
    if (!root.success())
    {
        Serial.println("Parsing failed");
    }
    int index = root["index"];
    Serial.print(" index: ");
    Serial.print(index);
    Serial.println(" ");

    client.stop();                       // Этот метод прерывает соединение с клиентом
    Serial.println("Client has closed"); // Выведите сообщение на последовательный монитор, чтобы указать, что клиентское соединение закрыто.
} // КОНЕЦ ЦИКЛА VOID

И вот что я получаю на последовательном мониторе:

Client Connected
POST / HTTP/1.1
Host: 192.168.0.88:8880
Connection: keep-alive
Content-Length: 1
Accept: application/json, text/javascript, */*; q=0.01
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Content-Type: application/json; charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,ro;q=0.8,es;q=0.7

5 index: 0 

В конце концов, эта цифра 5 перед словом "индекс" должна быть там, где стоит 0. 5 - это мои данные JSON. Причина, по которой я это вижу, заключается в том, что я включил просмотр запроса из браузера.

У кого - нибудь есть какие - нибудь идеи ?

P.S Извините за мой плохой английский ^_^

, 👍-1


1 ответ


2

Ниже вы создаете статическую строку, которая больше никогда не используется.

char json[] = "{\"index\" }";

Здесь вы создаете буфер и создаете экземпляр пустого JSONObject.

StaticJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.createObject();

Здесь вы проверяете, действителен ли root (ваш недавно созданный JSONObject). Поскольку она пуста и свежа, она действительна.

if (!root.success())
{
  Serial.println("Parsing failed");
}

Здесь вы пытаетесь запросить значение index у вашего пустого объекта.

int index = root["index"];
Serial.print(" index: ");
Serial.print(index);

Если вы никогда не предоставляете JSONObject какую-либо структуру или содержимое для анализа, как он может дать вам что-либо взамен, кроме ничего?

Примеры из библиотеки ArduinoJson оказываются полезными:

Документация по ParseObject

char json[] = "{\"hello\":\"world\"}";
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.parseObject(json);
const char* world = object["hello"];

Обратите внимание на отличия от того, что вы делаете:

  1. Начальная строка JSON для анализа содержит как ключ, так и значение.
  2. Объявление StaticJsonBuffer включает в себя размер буфера
  3. Объявление JSONObject использует ParseObject и передает строку json вместо создания пустого / пустого объекта.
,