Не удается прочитать данные 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 Извините за мой плохой английский ^_^
@sklipy, 👍-1
1 ответ
Ниже вы создаете статическую строку, которая больше никогда не используется.
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"];
Обратите внимание на отличия от того, что вы делаете:
- Начальная строка JSON для анализа содержит как ключ, так и значение.
Объявление
StaticJsonBuffer включает в себя размер буфера- Объявление
JSONObject
используетParseObject
и передает строкуjson
вместо создания пустого / пустого объекта.
- Как использовать SPI на Arduino?
- Нажать клавишу Windows, используя «keyboard.press();»
- Как подключить вывод INT MPU 6050?
- Улучшенное циклическое переключение цветов RGB.
- Проблема с загрузкой моего скетча на Ардуино
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
- Как преобразовать скетч примера Arduino в полный проект C++?