• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 от обычных точек доступа?
Кто клиент и кто сервер?
Я немного запутался сам . Можете глянуть мой проект? Может вы поймете - если дело в деньгах - скажите сколько стоит час вашего времени? Очень нуждаюсь в помощи.
 
Сверху Снизу