Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Раздел для начинающих", создана пользователем Dmtr, 6 окт 2017.

  1. Dmtr

    Dmtr Новичок

    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте, уважаемые знатоки.

    Хочу передать две переменных с 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. Думаю мой вопрос будет интересен многим начинающим.
     
  2. kab

    kab Авторитетный участник сообщества

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

    Dmtr Новичок

    Сообщения:
    4
    Симпатии:
    0
    Загружал этот проект
     

    Вложения:

  4. kab

    kab Авторитетный участник сообщества

    Сообщения:
    635
    Симпатии:
    78
    @Dmtr
    ОК, в выходные позанимаюсь
     
  5. dev_n

    dev_n Новичок

    Сообщения:
    19
    Симпатии:
    1
    Используя ajax примерно так:

    Код (Text):
    1.  
    2. //act="/configs.json"
    3. j=function(a){for(a=0;a<4;a++)try{return a?new ActiveXObject([,"Msxml2","Msxml3","Microsoft"][a]+".XMLHTTP"):new XMLHttpRequest}catch(b){}};
    4.  
    5. function getJsonData(act)
    6. {
    7.   var x=j();
    8.   x.open("GET", act);
    9.   x.onreadystatechange=function() {
    10.   if (x.readyState==4 && x.status>=200 && xhr.status<300) {
    11.     var obj=JSON.parse(x.responseText);
    12.      for (var i = 0; i < obj.length; i++) {
    13.       ......
    14.       }
    15.   }}
    16.   x.send();
    17. }
    18.  
     
  6. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    В Вашем примере не json-массив а json-объект однако :)
    В нем дважды указано поле "password", это не допустимо.
    json-объект - набор пар ключ: значение, одному ключу у Вас соответевтвуют два значения.
     
    kab нравится это.
  7. kab

    kab Авторитетный участник сообщества

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

    kab Авторитетный участник сообщества

    Сообщения:
    635
    Симпатии:
    78
    @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();
    }
    }
    }
     
  9. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.743
    Симпатии:
    186
    JAVA установлена ?
     
  10. Dmtr

    Dmtr Новичок

    Сообщения:
    4
    Симпатии:
    0
    Да, Вы правы: закралась досадная опечатка при срисовывании JSON - запроса с экрана смартфона. Правильный вариант:

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

    Dmtr Новичок

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

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

    leon013 Новичок

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

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Друзья Есть у кого примеры как можно реализовать подобную систему?
    Имеется приложение на андроид:
    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"));
     
  14. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Друзья Есть у кого примеры как можно реализовать подобную систему?
    Имеется приложение на андроид:
    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"));
     
  15. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Интересует именно реализация ESp в качестве точки доступа. Без прохода через роутера. Именно Android и ESP. Заранее Спасибо
     
  16. Алексей.

    Алексей. Авторитетный участник сообщества

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

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Это базовый IP и порт который нужно принять по вифи ардуино. В коде андроида подключение прописано.
     
  18. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    Каким образом вы обычно принимаете ip от обычных точек доступа?
    Кто клиент и кто сервер?
     
  19. Mestniy2496

    Mestniy2496 Новичок

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

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73

Поделиться этой страницей