Организация запросов и обмена данными
с ESP8266.

  предлагаю свое решение

 

get

Работая над универсальным пультом, которым хотелось управлять не только ИК кодами, но и различными устройствами или модулями, имеющими WiFi соединения, я столкнулся с проблемой передачи данных от сторонних WiFi модулей на html страничку.

На рисунке приведен пример, на котором обозначен центральный WiFi модуль, назовем его "сервер", который формирует html страницы на смартфоне. Сервер имеет статический IP адрес 192.168.0.128.

Малые WiFi модули имеют также статические IP адреса 192.168.0.121, 192.168.0.122 и 192.168.0.123. У каждого из этих модулей могут быть свои html странички, а могут и не быть.

Для получения данных с "малых" модулей, достаточно просто формируется запрос [1] на их IP адрес. Модули стабильно принимают запрос, обрабатывают его и передают ответ на сервер [2]. Сервер стабильно принимает ответы и обрабатывает их, если требуется.

Все это замечательно, но теперь надо отобразить результаты запроса на смартфоне [3]. Я помучился не один день, но прямого решения не нашел.

Примечательно, что малыми WiFi модулями можно управлять как с собственных html страниц, так и с основной страницы нашего сервера.

Второй вариант

Get2

 

Это попытка успеть или суметь ответить на Get запрос, адресованный серверу. Сервер после получения запроса [1] соединяется с малым модулем [2] и передает ему запрос, в котором указывает свой IP адрес.

Малый модуль обрабатывает запрос, готовит и передает по заданному IP адресу ответ, в котором указывает имя модуля ("map"). Занимательно, что ответ может быть адресован не серверу, а следующему модулю, чей IP адрес мог быть указан сервером в запросе.

Все эти соединения [1],[2] и [3], а также местные запросы и ответы [A] и [B], происходят стабильно, но опять возникают проблемы с передачей ответа [4] на смартфон.

Решение

Я решил организовать двойной запрос:
- первый запрос на "малый" модуль любым из, выше описанных, вариантом. На этот запрос малый модуль посылает ответ на сервер, который готовит строку ответа на второй запрос.
- второй Get запрос производится как типичный запрос на сервер, но через фиксированную задержку времени (я установил 4 сек.)

Система заработала сразу и с любым вариантом запроса к "малым" модулям. Я остановился на первом с меньшим количеством соединений. Предполагаю, что кому-то лучше использовать второй вариант, зависит от расположения модулей и качества связей.

Фрагмент Javascript сервера с функциями запроса/ответа


<script type= "text/javascript">
var get_ver = 1; //версия адресации запроса стороннего WiFi модуля
var str_URL = ""; var x = "";

function sel_but(id_cb) {
str_URL = id_cb.id;
trans_par(id_cb);}

function trans_par(id_cb) {
var go_link = "?";
if (document.getElementById("ip").title != "#") //есть WiFi IP
{ switch (get_ver) {
case 1: go_link = go_link + "ip=" + document.getElementById("ip").title + ';'; break
case 2: go_link = "http://" + document.getElementById("ip").title + "?ip=192.168.0.128" + ';'; break
default: alert("no get"); break}
if (document.getElementById("te2").checked) { //разрешен второй запрос
= внутренний

timer2 = setTimeout(function() {str_URL2 = "?" + document.getElementById("pult").title + ":" + "zz=0"; trans_get();},2000);}}
if (document.getElementById('pultname')) { //pultname только для IR
str_URL2 = go_link + document.getElementById("pultname").textContent + ':' + str_URL;
} else {str_URL2 = go_link + document.getElementById("pult").title + ':' + str_URL;}
trans_get();}

function trans_get() {
var xmlhttp = getXmlHttp();
//alert( str_URL2);
xmlhttp.open("GET", str_URL2, true);
var http = new XMLHttpRequest(), href = this.href;
http.open("GET", str_URL2);
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.onreadystatechange = function()
{ if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
x = xmlhttp.responseText;
getParam(x);}}}
xmlhttp.send(null);}

function getXmlHttp() {
try {return new ActiveXObject("Msxml2.XMLHTTP");}
catch (e) {try {
return new ActiveXObject("Microsoft.XMLHTTP");}
catch (ee) {}} if (typeof XMLHttpRequest != "undefined")
{return new XMLHttpRequest();}}

function getParam(get) {
var tmp = new Array();
var tmp2 = new Array(); var param = new Array();
if (get != "") {
tmp = (get.substr(1)).split("&");
for (var i = 0; i < tmp.length; i++) {
tmp2 = tmp[i].split("="); param[tmp2[0]] = tmp2[1];
}
for (var key in param) {
if (param[key] != "") {
document.getElementById(key).value = param[key];}}}}
<script>

Все процессы я отрабатывал на "малом" модуле map, который сам по себе может кого-то заинтересовать в качестве шаблона или заготовки для своих задач.

map

Сначала в проекте я реализовал внешний и внутренний таймеры. Внутренний таймер был организован программно в самом модуле, а внешний на html странице (javascript). С помощью таймеров посылались отчеты на сервер с заданным IP адресом. Интервал устанавливается в окне ввода (сек.).

Интересна сама организация внутреннего таймера, который использовал естественный ход выполнения программы, а поскольку режимы программы могут быть разные, были введены различные значения в корректирующий коэффициент - счетчик циклов.

Затем я отказался от организации двух таймеров, оставив только один на html странице раскрытого пульта. Такой таймер позволяет отслеживать состояние "своего" WiFi модуля. Для передачи информации о состянии модуля на сервер используются запросы самого сервера. Ключ такого запроса "zz=1". Если zz=0, то это ключ внутреннего запроса и программа распределяет соответственно потоки информации на свой модуль и удаленный модуль (сервер).

С одной страницы на разные устройства

Работая над проектом, пришло понимание, что необходимо решить еще одну задачу: управление различными модулями с одной "панели" (с одной страницы html).

Я пришел к следующему решению, если страница предназначена для управления удаленного модуля, то на этой странице должен быть IP адрес этого модуля. Не столь важно где размещен этот адрес, важно, чтобы он имел метку "name=". Например:

<input type="checkbox" name="192.168.0.120" id="vv12" onclick="cb_check0(this)" />

При изменении этого для передачи данных будет использован IP адрес, указанный в имени тега.

Теперь есть пространство для фантазии и организации умного дома! Но это еще не все, осталось освоить и подключить часы реального времени - RTC (ссылка)

 

Вернуться на страницу универсального пульта

Hosted by uCoz