Разработка ‘библиотеки’ малого webсервера на esp8266.

pvvx

Активный участник сообщества
Да, RTL технически лучше. Но ESP - дешевле. Снабженцы мониторят RTL vs ESP, но пока ESP выигрывает по цене в пару раз. И ESP уже работает, удовлетворительно в моих изделиях, париться с новой разработкой на RTL будет иметь смысл если он станет существенно дешевле чем ESP :)
Цена в интеграции. Всё в одном корпусе лучше, а WiFi MAC (к примеру через USB или QSPI/SDIO) изначально были дешевле ESP8266. Нет смыслу лепить ещё внешний контроллер, т.к. есть всё в одном корпусе. RTL-ы, те которые 8195/871x - это узкий сегмент (для баловства и хобби) - пора уже ставить что с пингвином/OpenWRT. Цена готовых модулей наверняка меньше слепка ESP как MAC и прочей обвязки с другим MCU.
 
Последнее редактирование:

Elik

New member
Связка Ардуино и ESP, коммуникация через RX/TX, есть протокол связи, все работает отлично, но вот в чем загвоздка: скорость прочитки файла XML, в который записываются данные принятые с последовательного порта слабая (посылается по 10 пакетов, 100 символов в каждом в секунду) Все работает только, если посылать один пакет в 200миллисекунд, это медленно, требуется ускорить минимум в 10 раз...
 

pvvx

Активный участник сообщества
Связка Ардуино и ESP, коммуникация через RX/TX, есть протокол связи, все работает отлично, но вот в чем загвоздка: скорость прочитки файла XML, в который записываются данные принятые с последовательного порта слабая (посылается по 10 пакетов, 100 символов в каждом в секунду) Все работает только, если посылать один пакет в 200миллисекунд, это медленно, требуется ускорить минимум в 10 раз...
Возьмите и попробуйте другой модуль. К примеру Схемотехника и обзор модуля EMW3080
У него есть настройка типа TCP2UART для 2-х каналов UART и WiFi.
Ссылка на 'али' , но у других он есть дешевле...
Есть и другие готовые модули по типу TCP2UART или TCP2SPI у RAK UART/SPI Wifi Module | UART Wifi Module | SPI Wifi Module- rakwireless.com - RAK | The Middleware from RAK Enable IoT
 

Elik

New member
Возьмите и попробуйте другой модуль. К примеру Схемотехника и обзор модуля EMW3080
У него есть настройка типа TCP2UART для 2-х каналов UART и WiFi.
Ссылка на 'али' , но у других он есть дешевле...
Есть и другие готовые модули по типу TCP2UART или TCP2SPI у RAK UART/SPI Wifi Module | UART Wifi Module | SPI Wifi Module- rakwireless.com - RAK | The Middleware from RAK Enable IoT
А с этим никак не ускорить?
 

pvvx

Активный участник сообщества
А с этим никак не ускорить?
Что ускорять? Неправильно выбранный режим работы TCP стека на удаленном устройстве?

В местной интрасети, при пинге менее 1 ms, на ESP8266 выходит наверно к 800 TCP пакетов в сек.
Считайте сами - пересылка 2-х TCP пакетов по WiFi HT20 (50Mbit/s), + ожидание ACK на них (<2 ms).
Только в случае с UART CPU ESP8266 не справляется со скоростью обработки своей UART.
Сто раз писалось - предел тестовой непрерывной обработки потока UART (без разрывов) c WIFI у него к 3 Мбит/сек. Бейте на пакеты и посылайте по 2 или шлите от приемника пакеты встречно, чтобы не дожидаться паузы в 200 ms до ACK.
Изготовление на заказ проектов или даже куска кода я рассматриваю только от пол лимона руб (на меньшее нет смысла заморачиваться - одна суета). В связи с этим сами берете и пишите... благо всё разжевано.
 
Последнее редактирование:

Elik

New member
Что ускорять? Неправильно выбранный режим работы TCP стека на удаленном устройстве?

В местной интрасети, при пинге менее 1 ms, на ESP8266 выходит наверно к 800 TCP пакетов в сек.
Считайте сами - пересылка 2-х TCP пакетов по WiFi HT20 (50Mbit/s), + ожидание ACK на них (<2 ms).
Только в случае с UART CPU ESP8266 не справляется со скоростью обработки своей UART.
Сто раз писалось - предел тестовой непрерывной обработки потока UART (без разрывов) c WIFI у него к 3 Мбит/сек. Бейте на пакеты и посылайте по 2 или шлите от приемника пакеты встречно, чтобы не дожидаться паузы в 200 ms до ACK.
Изготовление на заказ проектов или даже куска кода я рассматриваю только от пол лимона руб (на меньшее нет смысла заморачиваться - одна суета). В связи с этим сами берете и пишите... благо всё разжевано.
Нихрена пока не понял . Да и нет такого в мыслях что либо заказывать у вас, но за предложение спасибо.
 

Elik

New member
Что ускорять? Неправильно выбранный режим работы TCP стека на удаленном устройстве?

В местной интрасети, при пинге менее 1 ms, на ESP8266 выходит наверно к 800 TCP пакетов в сек.
Считайте сами - пересылка 2-х TCP пакетов по WiFi HT20 (50Mbit/s), + ожидание ACK на них (<2 ms).
Только в случае с UART CPU ESP8266 не справляется со скоростью обработки своей UART.
Сто раз писалось - предел тестовой непрерывной обработки потока UART (без разрывов) c WIFI у него к 3 Мбит/сек. Бейте на пакеты и посылайте по 2 или шлите от приемника пакеты встречно, чтобы не дожидаться паузы в 200 ms до ACK.
Изготовление на заказ проектов или даже куска кода я рассматриваю только от пол лимона руб (на меньшее нет смысла заморачиваться - одна суета). В связи с этим сами берете и пишите... благо всё разжевано.
либо я не понял, либо вы....

Микропроцессор в UART посылает 100 символов, которые считываются javascript - ом с регистров, используется тот же скрипт, что считывает состояния GPIO из файла test.xml, а именно файл site.js

может я чет неправильно делаю, как иначе считывать символы, которые микроконтроллер посылает в UART ESP?
Если все правильно, то почему при паузе между отправками пакетов в UART менее 200мс site.js перестает принимать стабильно? пробовал изменять сам скрипт, менять тайауты на меньшии, но это ни к чему не привело...

Можете попроще обяснить и дать направление в какую сторону копать и есть ли смысл?
 

pvvx

Активный участник сообщества
либо я не понял, либо вы....
Именно - я не понимаю про что вы...
Микропроцессор в UART посылает 100 символов, которые считываются javascript - ом с регистров, используется тот же скрипт, что считывает состояния GPIO из файла test.xml, а именно файл site.js
У меня нет такого - приема-передачи значений с UART в HTML или подобное. Это невозможно разрешить не применяя специальных протоколов на UART и учета многопользовательских обращений.
может я чет неправильно делаю, как иначе считывать символы, которые микроконтроллер посылает в UART ESP?
Можно через websocket, а ныне имеется только TCP2UART - отдельное соединение, по подобию TCP socket.

site.js, т.е. AJAX у ESP8266 имеет скорость примерно до 10 мс для цикла HTTP запрос-ответ в местной интрасети (пинг менее 1 мс).
На RTL-ках возможно несколько больше кол-во одновременных соединений (ограничено объемом RAM и для RTL8710AM оно уходит за сотню) и кол-во открытых/закрытых HTTP соединений в сек -> https://esp8266.ru/forum/threads/web-svalka-na-rtl871x.2403/page-2#post-36110

А про что вы говорите - совершенно не понятно. Какой ещё UART в XML? :eek:
Если используется внешний MCU, то для приема-передачи параметров к нему, к примеру посредством UART, можно организовать фиксированный буфер в памяти обоих устройств и данные из них через канал UART постоянно синхронизируются по кругу. Тогда отпадают некоторые зависимости многопользовательских обращений и задержки на получение данных через UART. Такую организацию имеет прошивка Modbus на базе web-свалки... Т.е. web работает со значениями в буфере RAM, не ждет ничего и т.д.
 
Последнее редактирование:

Elik

New member
Именно - я не понимаю про что вы...

У меня нет такого - приема-передачи значений с UART в HTML или подобное. Это невозможно разрешить не применяя специальных протоколов на UART и учета многопользовательских обращений.
Можно через websocket, а ныне имеется только TCP2UART - отдельное соединение, по подобию TCP socket.

site.js, т.е. AJAX у ESP8266 имеет скорость примерно до 10 мс для цикла HTTP запрос-ответ в местной интрасети (пинг менее 1 мс).
На RTL-ках возможно несколько больше кол-во одновременных соединений (ограничено объемом RAM и для RTL8710AM оно уходит за сотню) и кол-во открытых/закрытых HTTP соединений в сек -> https://esp8266.ru/forum/threads/web-svalka-na-rtl871x.2403/page-2#post-36110

А про что вы говорите - совершенно не понятно. Какой ещё UART в XML? :eek:
Если используется внешний MCU, то для приема-передачи параметров к нему, к примеру посредством UART, можно организовать фиксированный буфер в памяти обоих устройств и данные из них через канал UART постоянно синхронизируются по кругу. Тогда отпадают некоторые зависимости многопользовательских обращений и задержки на получение данных через UART. Такую организацию имеет прошивка Modbus на базе web-свалки... Т.е. web работает со значениями в буфере RAM, не ждет ничего и т.д.
Символы посылаются по UART в ESP пакет заканчивается символами, к примеру CKXX, скрипт на ESP
Именно - я не понимаю про что вы...

У меня нет такого - приема-передачи значений с UART в HTML или подобное. Это невозможно разрешить не применяя специальных протоколов на UART и учета многопользовательских обращений.
Можно через websocket, а ныне имеется только TCP2UART - отдельное соединение, по подобию TCP socket.

site.js, т.е. AJAX у ESP8266 имеет скорость примерно до 10 мс для цикла HTTP запрос-ответ в местной интрасети (пинг менее 1 мс).
На RTL-ках возможно несколько больше кол-во одновременных соединений (ограничено объемом RAM и для RTL8710AM оно уходит за сотню) и кол-во открытых/закрытых HTTP соединений в сек -> https://esp8266.ru/forum/threads/web-svalka-na-rtl871x.2403/page-2#post-36110

А про что вы говорите - совершенно не понятно. Какой ещё UART в XML? :eek:
Если используется внешний MCU, то для приема-передачи параметров к нему, к примеру посредством UART, можно организовать фиксированный буфер в памяти обоих устройств и данные из них через канал UART постоянно синхронизируются по кругу. Тогда отпадают некоторые зависимости многопользовательских обращений и задержки на получение данных через UART. Такую организацию имеет прошивка Modbus на базе web-свалки... Т.е. web работает со значениями в буфере RAM, не ждет ничего и т.д.
OK

Микроконтроллер посылает в UART ESP символы, функция newAJAXCommand() в скрипте site.js, который запущен на веб морде, прописывает принятые символы в файл XML (test.xml), к примеру вот так:

function readUart(){
newAJAXCommand('/protect/ihome/test.xml', updateStatus, true);
}


Выуживаю нужную инфу вот так:


function updateStatus(xmlData) {

//-----------------Checksum-----------------------------------
mesUart10 = "";
var uartString10 = [];
for(i=0;i<100;i++){
if(i<10){
i = "0" + i;
}
//pull request in 0x00000037 shape:
var hex10 = getXMLValue(xmlData, 'data' + i);
//Clear 0x000000, assemble string:
uartString10 = hex10.substr(8, 2); //.substr(position,length)
//convert from hex to char:
mesUart10 += String.fromCharCode(parseInt(uartString10,16));
}
var packageID = "";
packageID = mesUart10.substr(96,4);
//alert(packageID);
/* Packet 1 */
if(packageID == "PK01"){.....делай действие1....}
if(packageID == "PK02"){.....делай действие2....}

.......

}

Отправляю команды в UART:

function toHex(s)
{
var l = "0123456789ABCDEF";
var o = "../../web.cgi?sys_ram0x60000000=0x";
if( s.substr(0,2).toLowerCase() == "0x" ){ return s; }
if( typeof s != "string" ){ s = s.toString(); }
for( var i=0; i<s.length - 1; i++ ){
var c = s.charCodeAt(i);

o = o + l.substr((c>>4),1) + l.substr((c & 0x0f),1) + "&sys_ram0x60000000=0x";
}
var c = s.charCodeAt(s.length-1);
o = o + l.substr((c>>4),1) + l.substr((c & 0x0f),1)
command = o;
//alert (command);
newAJAXCommand(command);
}

XML файл test.xml:

<response>
<data00>~sys_ram0x60000000~</data00>
<data01>~sys_ram0x60000000~</data01>
.......
<data99>~sys_ram0x60000000~</data99>
</response>

Ни о каких 10мс речи нет, если пауза между пакетами по 100 символов (больше 127и не проходит!) менее 200мс, по не читает скрипт их..... Не знаю уже как обяснить иначе...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Попробуем взять пример из имеющихся.

Например опрос INA219 (I2C) через AJAX.
Снимок19.gif
В данном случае посылается запрос на файл ina219.xml, через тот-же скрипт и пути. Модуль принимает запрос и отрабатывает скрипт в файле, произведя чтение значений по I2C с INA219, и отсылает их в виде ina219.xml. Действий для модуля там больше, чем у вас – уходит время на опрос по I2C.

Смотрим итог в Wireshark:
Снимок18.gif
(на картинке указано - задержка запросов стоит в 20 мс, но фактическая по логу выходит 12 мс)
Итого - на запрос и ответ ушло 0.936572 - 0.932363 = 0.004209 = 4.2 мсек.
Где 200 мс?
Вы не изменили задержку в своем javascript запросов или ещё что-то ? Вам писалось, что обучением по HTML и Java тут не занимаются?
Можете прогнать тест apache-jmeter на максимальное кол-во соединений в секунду и среднее время запрос-ответа по HTTP у данной реализации сервера на web-свалке чтобы подтвердить сказанное вам ранее.
 
Последнее редактирование:

Elik

New member
Попробуем взять пример из имеющихся.

Например опрос INA219 (I2C) через AJAX.
Посмотреть вложение 5124
В данном случае посылается запрос на файл ina219.xml, через тот-же скрипт и пути. Модуль принимает запрос и отрабатывает скрипт в файле, произведя чтение значений по I2C с INA219, и отсылает их в виде ina219.xml. Действий для модуля там больше, чем у вас – уходит время на опрос по I2C.

Смотрим итог в Wireshark:
Посмотреть вложение 5123
(на картинке указано - задержка запросов стоит в 20 мс, но фактическая по логу выходит 12 мс)
Итого - на запрос и ответ ушло 0.936572 - 0.932363 = 0.004209 = 4.2 мсек.
Где 200 мс?
Вы не изменили задержку в своем javascript запросов или ещё что-то ? Вам писалось, что обучением по HTML и Java тут не занимаются?
Можете прогнать тест apache-jmeter на максимальное кол-во соединений в секунду и среднее время запрос-ответа по HTTP у данной реализации сервера на web-свалке чтобы подтвердить сказанное вам ранее.
Я именно так и делаю, точно по такой же схеме. В примере, который вы указали получается одна переменная, вот и задержка в 4мс, у меня получается 100 переменных (посмотрите на файл xml, там 100 раз считывается регистр ~sys_ram0x60000000~)
Вероятно и пауза именно из за этого...
 

pvvx

Активный участник сообщества
В файле gpio.xml 51-на переменная получаемая путем чтения из регистров GPIO по той-же шине и с обработкой - итог запрос-ответ = 5.6 мс
Не там ищите свои задержки. Посылать запросы и принимать ответы моджно и в несколько потоков (одновременных соединений), что ещё ускорит на время задержки передач по WiFi и сети. Т.е. в 5..10 потоков нормально :) Приблизительное кол-во пакетов (TCP/UDP) у ESP8266 около 800 шт в сек.
 
Последнее редактирование:

Elik

New member
В файле gpio.xml 51-на переменная получаемая путем чтения из регистров GPIO по той-же шине и с обработкой - итог запрос-ответ = 5.6 мс
Не там ищите свои задержки. Посылать запросы и принимать ответы моджно и в несколько потоков (одновременных соединений), что ещё ускорит на время задержки передач по WiFi и сети. Т.е. в 5..10 потоков нормально :) Приблизительное кол-во пакетов (TCP/UDP) у ESP8266 около 800 шт в сек.
Запросы отсылаются без проблем, вот ответы я настроил микроконтроллер посылать сто символов с задержкой в 200мс, всего пакетов по сто символов 20, то есть 2000 символов каждые 4минуты получается, быстрее то ли скрипт, то ли проц ESP не успевает считывать с UARTа, не могу понять пока...

Можно ли считывать регистр памяти напрямую минуя XML файл, пытался сделать так:

Var readMem = ~sys_ram0x60000000~;

Но что то не пошло, JavaScript выдает ошибку и не берет с памяти переменную... Может дело в этом...
 
Последнее редактирование:

Elik

New member
Да по ходу теперь до меня доходит то, о чем вы писали...

Вызов XML файла считывает регистр UART по адресу 0x60000000?
за что отвечают адреса 0x60000004 0x60000008 и так далее, походу там ничего не меняется при передаче по UART0?
Возможно ли както сохранять данные в памяти ESP? логи, настройки и данные? в текстовом формате либо еще каком?
 

pvvx

Активный участник сообщества
Да по ходу теперь до меня доходит то, о чем вы писали...

Вызов XML файла считывает регистр UART по адресу 0x60000000?
за что отвечают адреса 0x60000004 0x60000008 и так далее, походу там ничего не меняется при передаче по UART0?
Вы используете отладочные функции работы непосредственно с регистрами чипа, которые не предназначены для обработки приема и передачи в UART. Пример обращения к ним дан чисто для демки, т.к. наглядно - можно посмотреть действие в логе не прибегая к другой специфике...
Возможно ли както сохранять данные в памяти ESP? логи, настройки и данные? в текстовом формате либо еще каком?
Да - для этого организована область по типу поля modbus регистров в памяти. Обращение туда есть с разных интерфейсов.
Для сохранения в Flash переменных интерфейса нет, но его просто приписать, как доступ к специально организованной системе FEEP, где переменные с малыми размерами хранятся со своими идентификаторами.
 

Elik

New member
Да - для этого организована область по типу поля modbus регистров в памяти. Обращение туда есть с разных интерфейсов.
То есть прием с UART0 буферизуется? как обращаться к этому буферу минуя работу с регистрами(как я это делаю)?
 

pvvx

Активный участник сообщества
То есть прием с UART0 буферизуется? как обращаться к этому буферу минуя работу с регистрами(как я это делаю)?
Через порт TCP2UART или Modbus TCP - RS-485. Как-бы это базовый функционал изначально, для чего и делалась web-свалка :)
 

Elik

New member
Через порт TCP2UART или Modbus TCP - RS-485. Как-бы это базовый функционал изначально, для чего и делалась web-свалка :)
Отлично, нужна ваша помощь, в браузере файрфокс пишу адрес и порт (192.168.1.128:12345) и начинается волшебство, все, что не посылается в UART вылезает на страничке (в хроме это не работает) теперь как эти данные процессить javascriptом? что то тормознул на этом этапе, перелопатил половину интернета но что то не могу найти как...
 
Сверху Снизу