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

ESP8266 виснет

Тема в разделе "Общие вопросы по esp8266", создана пользователем Victor, 7 мар 2015.

  1. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.157
    Симпатии:
    226
    @=AK= попробуйте тоже самое по UDP. Насколько я помню в реализации TCP есть ошибка, приводящая к переполнения памяти.
     
  2. Victor

    Victor Administrator Команда форума

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

    =AK= Гуру

    Сообщения:
    1.224
    Симпатии:
    100
    Не понимаю, как бы я мог попробовать то же самое по UDP. Ведь по UDP соединение не устанавливается.

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

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

    nikolz Гуру

    Сообщения:
    4.682
    Симпатии:
    452
    лучше сразу откажитесь от AT команд
    и пользуйте луа , либо ардулино, либо СИ.
     
  5. =AK=

    =AK= Гуру

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

    Хм, как по мне, так и памяти у него до фига, и тактовая огромная. Пусть он не обеспечит такой же производительности, как Апач на писюке, никто этого и не требует. Пусть помедленнее работает. Я же вообще АТ командами пользуюсь, какая уж там скорость...

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

    =AK= Гуру

    Сообщения:
    1.224
    Симпатии:
    100
    Если это баг в ТCP сервере, то как это мне поможет?
     
    Последнее редактирование: 17 авг 2016
  7. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.211
    Симпатии:
    386
    А фатальных багов практически и нет, нужно только использовать последние версии и следовать документации. Если вы все же найдете баг - 2000USD ваши

    из указанных вариантов только AT прошивки использует технологию espconn, у остальных собственная реализация
     
    =AK= нравится это.
  8. nikolz

    nikolz Гуру

    Сообщения:
    4.682
    Симпатии:
    452
    1) Виктор Вам уже кое-что написал.
    2) Используйте UDP. Проверено, мин нет.
    3) Есть проблема вернее сказать особенность ESP она описана в документации.
    Касается работы совмещенного режима станция+точка доступа и переподключением других устройств. Поэтому на уровне нативного кода надо делать некоторые прогаммные кульбиты чтобы соединения не терялись. На уровне AT команд Вы это не сделаете.
    Примерно так.
     
  9. =AK=

    =AK= Гуру

    Сообщения:
    1.224
    Симпатии:
    100

    Там юзер пишет, что Espressif не отвечает на баг репорт. А ему в ответ говорят - заполняй онлайн, и дают ссылку на страницу, которая удалена ("The forum you selected does not exist").

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

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

    А подробнее не расскажете, в чем мулька?
     
  10. nikolz

    nikolz Гуру

    Сообщения:
    4.682
    Симпатии:
    452
    =AK= нравится это.
  11. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.211
    Симпатии:
    386
    "Уронить" прошивку на SDK 1.5.4 или 2.0.0 можно только кривыми руками. Каждый раз, как вываливается в exception, нахожу ошибку в своем коде.
    Если вы найдете фатальную ошибку у них в SDK, то можете присылать мне, я знаю как у жадных китайцев получать 2000$ :)
     
  12. =AK=

    =AK= Гуру

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

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

    =AK= Гуру

    Сообщения:
    1.224
    Симпатии:
    100
    Похоже, что проблема была в роутере Billion BiPAC. С другими роутерами работает нормально.
     
  14. Илфат Кутдусов

    Илфат Кутдусов Новичок

    Сообщения:
    9
    Симпатии:
    0
    Добрый день!

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

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

    nikolz Гуру

    Сообщения:
    4.682
    Симпатии:
    452
    NodeMCU и Wemos D1. - все есть.
    про RC посмотрите на схеме Wemos D1
     
  16. Илфат Кутдусов

    Илфат Кутдусов Новичок

    Сообщения:
    9
    Симпатии:
    0
    В таком случае у меня закономерный вопрос.
    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В - изменений нет.
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    4.682
    Симпатии:
    452
    Я не берусь ставить диагноз по рассказу.
    Могу лишь высказать следующие предположения.
    1) полагаю что питание не влияет.
    Я ставил ESP-12 с батарейкой, с солнечной панелью, блок зарядного устройства все источники работатют без проблем
    с компом через wif
    2) Скорее всего теряется связь с сервером и потом не восстанавливается.
     
  18. Илфат Кутдусов

    Илфат Кутдусов Новичок

    Сообщения:
    9
    Симпатии:
    0
    Сама 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[i]->params)/100; dtostrf(param , 2, 2, LCDmsg); tmp += String(LCDmsg); break;
    case 3 : param = float(sensors[i]->params)/1000; dtostrf(param , 2, 2, LCDmsg); tmp += String(LCDmsg); break;
    default: tmp += String(sensors[i]->type); break;
    }

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

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

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

     
  19. Илфат Кутдусов

    Илфат Кутдусов Новичок

    Сообщения:
    9
    Симпатии:
    0
    Больше советов по решению проблемы, я так понимаю, нету? :(
     
  20. nikolz

    nikolz Гуру

    Сообщения:
    4.682
    Симпатии:
    452
    Поставьте контрольный вывод переменных на терминал и проверяйте логику программы.
     

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