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

Запрос информации через веб-интерфейс с периферийной железки

VicSpectator

New member
Доброго времени суток.
Недавно возникла задача опроса информации через веб-интерфейс esp8266. То есть нажали кнопку на html-страничке esp, получили нужное значение на этой же страничке. Если это значение хранится в памяти esp8266, я это просто реализовывал через xmlHttpRequest. Но если это значение с периферийной железки? Например, с подключенного по UART микроконтроллера (МК). То есть цепочка такова:
Веб-клиент -> веб-сервер (esp8266) -> (по UART) -> МК -> (по UART) -> веб-сервер (esp8266) -> веб-клиент.
Как организовать обмен информацией в таком случае? Я сейчас просто решил слать xmlHttpRequest с определённым интервалом, esp посылает по UART запрос МК, тот в свою очередь отвечает. Сделал на esp флаги, чтобы в зависимости от их комбинации либо запрашивалась информация с МК, либо отправлялось значение глобальной переменной.
Может быть есть способ поизящнее? :) Свой способ ещё не проверял.
P.S. Можно, конечно, сразу слать всю необходимую информацию на esp в глобальные перменные, чтобы потом при запросе тут же ответить, но в таком случае будет большой поток ненужной информации по UART.
 

Юрий Ботов

Moderator
Команда форума
Смотря что за данные, как часто они меняются и каков "дискрет" этого изменения.
Вариантов 3:
- MK знает что данные изменились "вышли за границы дискрета изменения", например температура изменилась более чем на 0.5 градуса. В этот момент он передает данные по serial в esp, она его сохраняет в переменной. Когда приходит запрос по http esp отдает хранящееся в переменной последнее значение.
- МК не знает изменилось оно или нет. Невозможно определить понятие дискрета. Esp периодически опрашивает МК и сохраняет результат в переменной. При запросе http выдается значение из переменной.
- Нужно получить значение "здесь и сейчас". Тогда да... получаем http запрос, запрашиваем МК по serial, получаем от него ответ и подсовываем его web серверу...
 

VicSpectator

New member
- Нужно получить значение "здесь и сейчас". Тогда да... получаем http запрос, запрашиваем МК по serial, получаем от него ответ и подсовываем его web серверу...
Именно этот вариант. Если точнее, значения нужны лишь после нажатия пользователем кнопки в веб-интерфейсе.
Получается, я вынужден долбить веб-сервер запросами некоторое время, пока не получу данные от стороннего МК или пока не выйдет лимит попыток? Более изящного варианта нет? Нельзя ли отправить информацию пользователю в интерфейс по инициативе веб-сервера?
 

VicSpectator

New member
А можно мне какую-нибудь наводящую информацию? До этого пользовался примером из библиотеки асинхронного веб-сервера.

Код:
server.on("/page", HTTP_GET, [](AsyncWebServerRequest *request){
    String var = "lalala";
    request->send(200, "text/plain", var);
  });
Пока что не знаю, как это можно применить в моём случае. На странице клиента ещё должен быть код, который будет обрабатывать этот запрос. Ранее я создавал в *.js файле запрос, прописывал обработчик и отсылал этот запрос. Ответ уже обрабатывался.
Код:
xmlhttp.open('GET', '/page', true);
    xmlhttp.onreadystatechange = function(){...}
Неужели можно создать запрос, написать его обработчик и не отсылая его, иметь возможность обрабатывать посылки веб-сервера? :)
И как отправить запрос с сервера?
Код:
AsyncWebServerRequest *request;

request->send(200, "text/plain", "lalala");
Это работать должно? Ещё не тестировал.
 

Arthur

Active member
Неужели можно создать запрос, написать его обработчик и не отсылая его, иметь возможность обрабатывать посылки веб-сервера? :)
Да, можно. В том числе, если пишете на Arduino.
Гуглите по фразе "esp8266 arduino websocket".
 

Arthur

Active member
Как разгуглите вопрос и будут стоящие вопросы по теме - пишите, постараюсь помочь, ответить.
 

rst

Member
P.S. Можно, конечно, сразу слать всю необходимую информацию на esp в глобальные перменные, чтобы потом при запросе тут же ответить, но в таком случае будет большой поток ненужной информации по UART.
А ещё можно подключить МК-источник SPI-слэйвом, поддержать на нём протокол чтения SPI-FLASH-чипов, и отобразить требуемые переменные в память ESP. Тогда ПО на ESP их сможет читать так, как будто они находятся в его локальной памяти :cool:
Не забыть только кеширование для этой области памяти отключить....
 

NeoroN

Member
А если использовать Lua - то не придется писать парсер на стороне Esp.
 

VicSpectator

New member
Вариант с веб сокетом мне нравится :) В LUA вникать не хочется. Пока что принципы программ в Ардуино нравятся. А в чтение FLASH напрямую вникать будет сложнее. Но на будущее учту.
Часть веб сокета, которая пишется на JavaScript, на первый взгляд понятна. Веб сокет на ESP тоже скорее всего сделаю, там есть библитека от того же me-no-dev. Почитаю его гитхаб, примеры.
Похоже, что веб-сокет будет на другом порту, отличном от веб-сервера. По запросу на веб-сервер идёт команда через веб-сокет, затем идёт общение с МК, затем снова через веб-сокет идёт отправка уже полученных с МК значений. Однако таймер ожидания получения информации на клиентском JavaScript сделать всё же надо будет.
Похоже, на ESP будет веб сокет сервер.
Пороюсь ещё через недельку, надеюсь. В ближайшие дни вряд ли дадут этим заняться.
Спасибо за поддержку :)
 
Сверху Снизу