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

ESP8266 виснет

Сергей_Ф

Moderator
Команда форума
@=AK= попробуйте тоже самое по UDP. Насколько я помню в реализации TCP есть ошибка, приводящая к переполнения памяти.
 

Victor

Administrator
Команда форума
ESP8266 зависает через пару секунд работы этой программы, перестает реагировать на АТ команды.
а пробовали эту программу натравить на свой сервер и подключаться, допустим на 80 порт Apache? попробуйте и помониторьте ресурсы сервера.
Каждое соединение съедает память, но хорошо, что вы соединение хоть закрываете.
В ESP8266 в AT прошивках TCP соединения реализованы с помощь неэффективной технологии espconn, которую придумала Espressif.
Если внимательно посмотреть описания AT команд, то становится ясно, что поддерживается 5 одновременных TCP соединений. Для освобождения памяти после закрытия соединения требуется некоторое время.
В прошивках, написанных более оптимально, ситуация несколько лучше, однако чудес не бывает - у вас в руках крохотный чип с небольшой тактовой частотой (до 160 МГц) и небольшим объемом памяти и все это крутит почти полноценный стек TCP протокола. Используйте в ESP8266 TCP сервер (например, как web сервер) для каких-то настроек, управления. А основную часть работы переложите на внешний сервис (например, выделенный linux сервер) чтобы ESP8266 выступала в роли клиента и сама инициировала TCP соединения - "и будет вам счастье".
В любом случае, подключить ESP8266 во внешний мир с каким-то открытым портом для ожидания внешних соединений - абсолютно глупая затея, используйте для этого более подходящие решения.
Аналогично и по открытой точке доступа на ESP8266
 

=AK=

New member
Не понимаю, как бы я мог попробовать то же самое по UDP. Ведь по UDP соединение не устанавливается.

А подробнее про ошибку в ТСР не расскажите?

У меня впечатление, что там у них не одна ошибка. Помимо того, что так легко можно завалить ТСР сервер, у нас еще перестает устанавливаться соединение с РС. То есть, после старта работает нормально, можем законнектиться к ESP8266 с разных компьютеров. А через несколко часов - хана, с одного компьютера можно законнектиться, а с любого другого уже нельзя, соединение не устанавливается. Перезапуск ТСР сервера командами AT+CIPSERVER не помогает. А вот если сбросить модуль командой AT+RST а потом заново инизиализировать, то опять работает с любым компом.
 

nikolz

Well-known member
Не понимаю, как бы я мог попробовать то же самое по UDP. Ведь по UDP соединение не устанавливается.

А подробнее про ошибку в ТСР не расскажите?

У меня впечатление, что там у них не одна ошибка. Помимо того, что так легко можно завалить ТСР сервер, у нас еще перестает устанавливаться соединение с РС. То есть, после старта работает нормально, можем законнектиться к ESP8266 с разных компьютеров. А через несколко часов - хана, с одного компьютера можно законнектиться, а с любого другого уже нельзя, соединение не устанавливается. Перезапуск ТСР сервера командами AT+CIPSERVER не помогает. А вот если сбросить модуль командой AT+RST а потом заново инизиализировать, то опять работает с любым компом.
лучше сразу откажитесь от AT команд
и пользуйте луа , либо ардулино, либо СИ.
 

=AK=

New member
Если внимательно посмотреть описания AT команд, то становится ясно, что поддерживается 5 одновременных TCP соединений. Для освобождения памяти после закрытия соединения требуется некоторое время.
Хорошо, пусть на это требуется время. Если ESP не готов, если он занят своими делами, освобождает память, значит, он не должен устанавливать новое соединение. Когда будет готов - установит соединение. Я же не гонюсь за определенным количеством транзакций в секунду, и не я устанавливаю темп, а ESP8266. Пусть будет не 200 в секунду, пусть хоть 10 в секунду, хоть 1 в секунду. В чем здесь принципиальная проблема? Не вижу.

В прошивках, написанных более оптимально, ситуация несколько лучше, однако чудес не бывает - у вас в руках крохотный чип с небольшой тактовой частотой (до 160 МГц) и небольшим объемом памяти и все это крутит почти полноценный стек TCP протокола.
Хм, как по мне, так и памяти у него до фига, и тактовая огромная. Пусть он не обеспечит такой же производительности, как Апач на писюке, никто этого и не требует. Пусть помедленнее работает. Я же вообще АТ командами пользуюсь, какая уж там скорость...

Однако хотя бы отсутствия багов можно ожидать?
 

Victor

Administrator
Команда форума
Однако хотя бы отсутствия багов можно ожидать?
А фатальных багов практически и нет, нужно только использовать последние версии и следовать документации. Если вы все же найдете баг - 2000USD ваши

Причем тут АТ? Если это баг в ТCP сервере, то как это мне поможет?
из указанных вариантов только AT прошивки использует технологию espconn, у остальных собственная реализация
 
  • Like
Реакции: =AK=

nikolz

Well-known member
Причем тут АТ? Если это баг в ТCP сервере, то как это мне поможет?
1) Виктор Вам уже кое-что написал.
2) Используйте UDP. Проверено, мин нет.
3) Есть проблема вернее сказать особенность ESP она описана в документации.
Касается работы совмещенного режима станция+точка доступа и переподключением других устройств. Поэтому на уровне нативного кода надо делать некоторые прогаммные кульбиты чтобы соединения не терялись. На уровне AT команд Вы это не сделаете.
Примерно так.
 

=AK=

New member
А фатальных багов практически и нет, нужно только использовать последние версии и следовать документации. Если вы все же найдете баг - 2000USD ваши
http://bbs.espressif.com/viewtopic.php?f=20&t=288
Там юзер пишет, что Espressif не отвечает на баг репорт. А ему в ответ говорят - заполняй онлайн, и дают ссылку на страницу, которая удалена ("The forum you selected does not exist").

из указанных вариантов только AT прошивки использует технологию espconn, у остальных собственная реализация
Вот это хорошо, это вселяет оптимизм. Я уже давно посматриваю на вариант с Ардуино IDE, но пока не было серьезных оснований для перехода.

1) Виктор Вам уже кое-что написал.
2) Используйте UDP. Проверено, мин нет.
Там где можно использовать UDP, я использую UDP. А там, где надо использовать ТСР сервер - приходится использовать ТСР сервер. Например, HTTP сервер на UDP никак не сделаешь.

3) Есть проблема вернее сказать особенность ESP она описана в документации.
Касается работы совмещенного режима станция+точка доступа и переподключением других устройств. Поэтому на уровне нативного кода надо делать некоторые прогаммные кульбиты чтобы соединения не терялись. На уровне AT команд Вы это не сделаете.
Примерно так.
А подробнее не расскажете, в чем мулька?
 

Victor

Administrator
Команда форума
Там юзер пишет, что Espressif не отвечает на баг репорт. А ему в ответ говорят - заполняй онлайн, и дают ссылку на страницу, которая удалена ("The forum you selected does not exist").
"Уронить" прошивку на SDK 1.5.4 или 2.0.0 можно только кривыми руками. Каждый раз, как вываливается в exception, нахожу ошибку в своем коде.
Если вы найдете фатальную ошибку у них в SDK, то можете присылать мне, я знаю как у жадных китайцев получать 2000$ :)
 

=AK=

New member
Если вы найдете фатальную ошибку у них в SDK, то можете присылать мне, я знаю как у жадных китайцев получать 2000$ :)
Если я правильно понял их условия, то описанное мною некорректное поведение TCP сервера в прошивке с АТ командами этим условиям соответствует. Единственно в чем не соответствует - я использую не самый свежий вариант софта, а тот, который влезает в 512К. Так что у вас есть шанс: залейте свежайший софт с АТ командами и завалите его так, как я описал выше, приз будет ваш. Свой код инициализации модуля при помощи АТ команд я выложил здесь Cannot connect to ESP8266 after a while - ESP8266 Developer Zone

PS: С прошивкой из последнего SDK 2.0.0 подвисание при частых подключениях-отключениях исчезло. Однако остался баг, из-за которого, после нормальной работы в течении некоторого времени, не все компьютеры в локальной сети могут подключиться к TСP серверу ESP8266.
 
Последнее редактирование:

=AK=

New member
Похоже, что проблема была в роутере Billion BiPAC. С другими роутерами работает нормально.
 
Добрый день!

Столкнулся с ситуацией подвисания разных модулей на базе ESP8266.
Для программирования использую Arduino IDE 1.6.8
На данный момент использую ESP-01, NodeMCU-0,9 и Wemos D1.

Прочитал темы про правильное подключение чипа с подтягиванием к земле или питанию.
На этом фоне у меня вопрос: Имеется ли вся эта необходимая обвязка в модулях nodemcu и wemos, или там так же надо производить всё эту необходимую обвязку?
И ещё вопрос по поводу RC-цепочки к пину CHIP-EN. Можете подсказать как именно подключить её? Или просто подразумевается что этот пине не должен висеть в воздухе?
 

nikolz

Well-known member
Добрый день!

Столкнулся с ситуацией подвисания разных модулей на базе ESP8266.
Для программирования использую Arduino IDE 1.6.8
На данный момент использую ESP-01, NodeMCU-0,9 и Wemos D1.

Прочитал темы про правильное подключение чипа с подтягиванием к земле или питанию.
На этом фоне у меня вопрос: Имеется ли вся эта необходимая обвязка в модулях nodemcu и wemos, или там так же надо производить всё эту необходимую обвязку?
И ещё вопрос по поводу RC-цепочки к пину CHIP-EN. Можете подсказать как именно подключить её? Или просто подразумевается что этот пине не должен висеть в воздухе?
NodeMCU и Wemos D1. - все есть.
про RC посмотрите на схеме Wemos D1
 
NodeMCU и Wemos D1. - все есть.
про RC посмотрите на схеме Wemos D1
В таком случае у меня закономерный вопрос.
WEB-сервер на Arduino IDE 1.6.8, Wemos D1
Схема:
WEMOS D1 ( UART D7,D8)-согласователь уровней- ArduinoUNO (UART D8,D9).
Данные длиной 50 байт прилетают от UNO на WEMOS с периодичностью раз в 5 секунд.
Wemos подключается к Wifi при старте, далее отвечает на http запросы и показывает таблицу с данными.
Во время формирования общения с клиентом зажигается встроенный светодиод.
Страничка размером где-то 1к. Автообновляется каждые 15 секунд
Зависание происходит примерно 2-3 раза в сутки В МОМЕНТ http-запроса.
Определил я это, собственно, по постоянно горящему светодиоду когда ESP-ка зависла.
В броузере Mozilla страница не может до конца обновится и так крутится.

Интересная особенность. Если в броузере оставить страницу в таком подвисшем состоянии и просто сбросить wemos замыканием RESET на землю, то wemos так мжет и не выйти на рабочий режим. Приходится останавливать страничку в броузере, сбрасывать wemos и уже потом обновлять страничку в броузере.

Ещё одна интересная особенность. Как-то оставил на полдня всю схему работать но не обращался к ней по http (светодиод, который зажигается при начале обмена с клиентом), светодиод, естественно не горел. Открыл страничку на вемос, загорелся светодиод и .. вемос благополучно повис.

Пробовал убирать согласователь уровней и понижение питания всей схему до уровня 3,3-3,7В - изменений нет.
 

nikolz

Well-known member
В таком случае у меня закономерный вопрос.
WEB-сервер на Arduino IDE 1.6.8, Wemos D1
Схема:
WEMOS D1 ( UART D7,D8)-согласователь уровней- ArduinoUNO (UART D8,D9).


Пробовал убирать согласователь уровней и понижение питания всей схему до уровня 3,3-3,7В - изменений нет.
Я не берусь ставить диагноз по рассказу.
Могу лишь высказать следующие предположения.
1) полагаю что питание не влияет.
Я ставил ESP-12 с батарейкой, с солнечной панелью, блок зарядного устройства все источники работатют без проблем
с компом через wif
2) Скорее всего теряется связь с сервером и потом не восстанавливается.
 
Я не берусь ставить диагноз по рассказу.
Могу лишь высказать следующие предположения.
2) Скорее всего теряется связь с сервером и потом не восстанавливается.
Сама ESP-ка связывается с другими серверами только за временем. Не думаю что тут есть проблемы.

Ну тогда пора выкладывать код :)
void client_response( WiFiClient client )
{

digitalWrite ( BUILTIN_LED, 0 );
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();

// Return the response
client.println( "<html><head>\
- <meta http-equiv='refresh' content='15'/> \
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>\
<title>Умный дом</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>Добро пожаловать в систему умный дом</h1>\
<br>" );

client.println ("<table border='1'>\
<tr>\
<th>ID</th>\
<th>Сенсор</th>\
<th>Счётчик</th>\
<th>Значение</th>\
<th>Тип</th>\
<th>Дата.Время</th>\
</tr>\
" );
// Serial.print( "WEB: "); Serial.println( count_sens );
String tmp="", ch1, ch2, ch3;
float param;
char LCDmsg[10];
for ( int i = 0; i < count_sens; i++ ) {
tmp += "<tr>";
tmp += "<td>";

if( sensors->id==1 ) tmp += String(sensors->id)+" Arduino Uno";
if( sensors->id==2 ) tmp += String(sensors->id)+" Arduino Mini";
tmp += "</td>";
tmp += "<td>";
if( sensors->id==1 && sensors->sensor==1 ) tmp += "Напряжение";
if( sensors->id==2 && sensors->sensor==1 ) tmp += "Напряжение";
if( sensors->id==2 && sensors->sensor==2 ) tmp += "DS18B20 Температура";
if( sensors->id==2 && sensors->sensor==3 ) tmp += "DHT22 Влажность";
if( sensors->id==2 && sensors->sensor==4 ) tmp += "DHT22 Температура";
if( sensors->id==2 && sensors->sensor==5 ) tmp += "DHT22 Комфорт";
tmp +="</td>";
tmp += "<td>"+String(sensors->count)+"</td>";
tmp += "<td>";
// Тип сенсора: 1 - температура в Кельвинах, умноженная на 100
// 2 - Влажность в % умноженная на 100
// 3 - Напряжение в V умноженное на 1000
switch ( sensors->type ) { // Тип сенсора: 1 - температура 2 - Влажность 3 - Напряжение
case 1 : param = float(sensors->params)/100-273; dtostrf(param , 2, 2, LCDmsg); tmp += String(LCDmsg); break;
case 2 : param = float(sensors->params)/100; dtostrf(param , 2, 2, LCDmsg); tmp += String(LCDmsg); break;
case 3 : param = float(sensors->params)/1000; dtostrf(param , 2, 2, LCDmsg); tmp += String(LCDmsg); break;
default: tmp += String(sensors->type); break;
}

tmp += "</td>";
tmp += "<td>";
switch ( sensors->type ) { // Тип сенсора: 1 - температура 2 - Влажность 3 - Напряжение
case 1 : tmp += "C"; break;
case 2 : tmp += "%"; break;
case 3 : tmp += "V"; break;
default: tmp += String(sensors->type); break;
}
tmp += "</td>";

ch1 = (sensors->h < 10 ? String("0") : ""); ch2=(sensors->mi < 10 ? String("0") : ""); ch3=(sensors->s < 10 ? String("0") : ""); // добавление ведущих нулей
tmp += "<td>"+ch1+String(sensors->h)+":"+ch2+String(sensors->mi)+":"+ch3+String(sensors->s)+" ";
ch1 = (sensors->d < 10 ? String("0") : ""); ch2=(sensors->m < 10 ? String("0") : ""); // добавление ведущих нулей
tmp += ch1+String(sensors->d)+"."+ch2+String(sensors->m)+"."+String(sensors->y)+"</td>";
tmp += "</tr>";
}
client.println(tmp);

client.println ( "</table> </body> </html> ");
digitalWrite ( BUILTIN_LED, 1 );
}

 
Сверху Снизу