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

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

Dmtr

New member
Здравствуйте, уважаемые знатоки.

Хочу передать две переменных с ESP8266 на web-страницу с использованием беспроводного интерфейса. Использую отладочную плату NodeMCU. На первый взгляд ничего сложного – Сергей Третьяков в своём курсе (Шаг №5 — Передача данных на Web страницу | Программирование ESP8266 в среде Arduino IDE) рассказал, как это сделать. За что ему отдельное ОГРОМНОЕ СПАСИБО. Но на практике появились проблемы: передача JSON – массива у меня получилась, а приём – нет. Работающий (со слов автора) проект я выкачал непосредственно с вышеуказанной страницы и вгрузил (включая html-страницу) в ESP8266 без изменений. При корневом подключении (в поисковой строке Google Chrome - 192.168.4.1) web-страница загружается, но значения всех полей остаются дефолтными: {{SSDP}}, {{ssid}}, {{timezone}} и т.д.

При просмотре JSON - запроса (в поисковой строке Google Chrome - 192.168.4.1/configs.json) всё нормально:
{"SSDP": "SSDP-test", "ssid": "home", "password": "i12345678", "ssidAP": "WiFi",
"password": "", "ip": "0.0.0.0"}.

В чём может быть ошибка? Почему данные не принимаются web-страницей?

Кроме того, у Третьякова (при всём моём уважении к мэтру) очень сложная структура принимающей web-страницы и недостаточно описано получение данных непосредственно в поля вэб-морды. Новичку тяжело разобраться. Нет ли у кого ПРОСТОГО (чем прощё, тем лучше) надёжного и стопроцентно работающего проекта, в котором переменные с ESP8266 предаются на web-страницу с использованием JSON – массива?

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

Спасибо.

P.S. Думаю мой вопрос будет интересен многим начинающим.
 

kab

New member
@Dmtr
Выложите текст или файл скетча - попробуем Сергея "упростить". Прошу именно тот, что запускали Вы, а не ссылку с сайта Сергея - без обид :)
 

dev_n

New member
Используя ajax примерно так:

Код:
//act="/configs.json"
j=function(a){for(a=0;a<4;a++)try{return a?new ActiveXObject([,"Msxml2","Msxml3","Microsoft"][a]+".XMLHTTP"):new XMLHttpRequest}catch(b){}};

function getJsonData(act)
{
  var x=j();
  x.open("GET", act);
  x.onreadystatechange=function() {
  if (x.readyState==4 && x.status>=200 && xhr.status<300) {
    var obj=JSON.parse(x.responseText);
     for (var i = 0; i < obj.length; i++) {
      ......
      } 
  }}
  x.send(); 
}
 

Алексей.

Active member
{"SSDP": "SSDP-test", "ssid": "home", "password": "i12345678", "ssidAP": "WiFi",
"password": "", "ip": "0.0.0.0"}.
В Вашем примере не json-массив а json-объект однако :)
В нем дважды указано поле "password", это не допустимо.
json-объект - набор пар ключ: значение, одному ключу у Вас соответевтвуют два значения.
 
  • Like
Реакции: kab

kab

New member
@Dmtr
Запустил присланный скетч - тут всё нормально - Имя устройства - как надо:"SSDP-test"
Уточните проблему, пожалуйста (и, лучше, с картинками) - может лучше досмотреть "шаги" до конца и воспользоваться последним вариантом?
upload_2017-10-7_12-30-50.png
 

kab

New member
@Dmtr
А работает прием JSON похоже так:

- в data\function.js есть такая функция, которая принимает "посылку", запросив по имени, далее происходит распарсивание принятой строки и тупая замена в передаваемой вебстранице странице обозначений идентификаторов на их значения:

function load(){
if(xmlHttp.readyState==0 || xmlHttp.readyState==4){
xmlHttp.open('PUT','/configs.json',true);
xmlHttp.send(null);
xmlHttp.onload = function(e) {
jsonResponse=JSON.parse(xmlHttp.responseText);
loadBlock();
}
}
}
 

Dmtr

New member
В Вашем примере не json-массив а json-объект однако :)
В нем дважды указано поле "password", это не допустимо.
json-объект - набор пар ключ: значение, одному ключу у Вас соответевтвуют два значения.
Да, Вы правы: закралась досадная опечатка при срисовывании JSON - запроса с экрана смартфона. Правильный вариант:

{"SSDP": "SSDP-test", "ssid": "home", "password": "i12345678", "ssidAP": "WiFi", "passwordAP": "", "ip": "0.0.0.0"}.
 

Dmtr

New member
JAVA установлена ?
JAVA была установлена, но поpект не pаботал. Всё завелось только после пеpеустановки (не обновления,а именно пеpеустановки) JAVA и на пpиёмной и на пеpедающей стоpоне. Виpусы???

PАБОТАЕТ. СПАСИБО ОГPОМНОЕ ВСЕМ НЕPАВНОДУШНЫМ.
 
Последнее редактирование:

leon013

New member
Приветствую всех. Если тема не умерла, то подскажите. Пример у меня работает. Создал (как умею) свою страницу hml. Взял из примера function.js. Задал переменные .
Сервер на ESP поднимается, страница в браузер грузится. Но поля не заполняются. Проверяю руками json запрос - ответ от сервера есть. Строка с ответом отправляется.
Никак не могу понять как запускается функция load().
Прошу разъяснить как это работает, тк мне ближе МК PIC, а вот для развития проекта нужна передача данных на веб страницу
 

Mestniy2496

Member
Друзья Есть у кого примеры как можно реализовать подобную систему?
Имеется приложение на андроид:
Fireplace.zip
Мне вот что нужно:
  • Это нужно реализовать в МК.
  • private final String BASE_ADDRESS = "http://127.0.0.1:8080/";
  • private final String VOLUME_INCREASE = "volume_increase";
  • private final String VOLUME_DECREASE = "volume_decrease";
  • private final String DEVICE_ON = "device_on";
  • private final String DEVICE_OFF = "device_off";
  • private final String TIMER_INCREASE = "timer_increase";
  • private final String TIMER_DECREASE = "timer_decrease";
  • private final String GET_STATE = "state";

  • ответ от МК всегда один, в виде Json:

  • final JSONObject jsonObject = new JSONObject(source);

  • final FirePlace firePlace = new FirePlace();
  • firePlace.setVolume(jsonObject.getInt("volume"));
  • firePlace.setOn(jsonObject.getBoolean("on"));
  • firePlace.setTime(jsonObject.getLong("time"));
 

Mestniy2496

Member
Друзья Есть у кого примеры как можно реализовать подобную систему?
Имеется приложение на андроид:
Fireplace.zip
Мне вот что нужно:
  • Это нужно реализовать в МК.
  • private final String BASE_ADDRESS = "http://127.0.0.1:8080/";
  • private final String VOLUME_INCREASE = "volume_increase";
  • private final String VOLUME_DECREASE = "volume_decrease";
  • private final String DEVICE_ON = "device_on";
  • private final String DEVICE_OFF = "device_off";
  • private final String TIMER_INCREASE = "timer_increase";
  • private final String TIMER_DECREASE = "timer_decrease";
  • private final String GET_STATE = "state";

  • ответ от МК всегда один, в виде Json:

  • final JSONObject jsonObject = new JSONObject(source);

  • final FirePlace firePlace = new FirePlace();
  • firePlace.setVolume(jsonObject.getInt("volume"));
  • firePlace.setOn(jsonObject.getBoolean("on"));
  • firePlace.setTime(jsonObject.getLong("time"));
 

Mestniy2496

Member
Интересует именно реализация ESp в качестве точки доступа. Без прохода через роутера. Именно Android и ESP. Заранее Спасибо
 

Алексей.

Active member
@Mestniy2496
У вас смартфон должен подключаться к точке доступа и используя протокол http выполнять метод GET, а на esp должен быть веб-сервер?
Если это так, то тогда откуда взялся адрес 127.0.0.1??
Настраиваете esp в режиме точки доступа, поднимаете на ней веб-сервер, определяете для него обработчики методов и отвечайте JSON-ом для соответствующих запросов.
На смартфоне после соединения по wifi с точкой доступа определяете ip адрес шлюза, он и будет тем адресом куда отправлять http запросы.
 

Mestniy2496

Member
@Mestniy2496
У вас смартфон должен подключаться к точке доступа и используя протокол http выполнять метод GET, а на esp должен быть веб-сервер?
Если это так, то тогда откуда взялся адрес 127.0.0.1??
Настраиваете esp в режиме точки доступа, поднимаете на ней веб-сервер, определяете для него обработчики методов и отвечайте JSON-ом для соответствующих запросов.
На смартфоне после соединения по wifi с точкой доступа определяете ip адрес шлюза, он и будет тем адресом куда отправлять http запросы.
Это базовый IP и порт который нужно принять по вифи ардуино. В коде андроида подключение прописано.
 

Mestniy2496

Member
Каким образом вы обычно принимаете ip от обычных точек доступа?
Кто клиент и кто сервер?
Я немного запутался сам . Можете глянуть мой проект? Может вы поймете - если дело в деньгах - скажите сколько стоит час вашего времени? Очень нуждаюсь в помощи.
 
Сверху Снизу