Arduino Mega Server

Модератор: Alex

annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: Arduino Mega Server

Сообщение annakin » Вт июл 14, 2015 2:21 pm

Alex писал(а):!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Анатомия проблемы:

По неизвестной причине клиент вдруг становится false

void serverWorks() {
EthernetClient sclient = server.available(); // try to get client
if (sclient) { // got client?

Браузерные вызовы продолжают идти и копятся в каком-то буфере примерно 10 минут, затем выстреливаются за 2 минуты и получают ответы. Затем опять клиент становится false и так по кругу.

Перезаливка скетча никак не влияет на проблему, перезагрузка страницы приводит всё в порядок до следующего сбоя.

У кого-нибудь есть мысли по этому поводу?

Проблема на стороне браузера?

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
И моя проблема с Реле также кроетса в данной функции.
Так как после обращения к сервера АМС через браузер он не закрывает соединение а накапливает запросы при этом перестаёт слушать сетевый команды как например включение реле.
Получается что твоя и моя проблема сошлись на одной функции )))
СпойлерПоказать

Код: Выделить всё

void serverWorks() {
  EthernetClient sclient = server.available();  // try to get client

  if (sclient) { // got client?
    boolean currentLineIsBlank = true;
    while (sclient.connected()) {
      if (sclient.available()) {   // client data available to read
        char c = sclient.read();   // read 1 byte (character) from client

        /* limit the size of the stored received HTTP request
           buffer first part of HTTP request in HTTP_req array (string)
           leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1) */

        if (req_index < (REQ_BUF_SIZE - 1)) {
          HTTP_req[req_index] = c; // save HTTP request character
          req_index++;
        }
        
        // make request
        if (request.length() < MAX_LEN_REQUEST) {
          request += (c);

        }    
        
        /* last line of client request is blank and ends with \n
           respond to client only after last line received */

        if (c == '\n' && currentLineIsBlank) {
          
          if (!StrContains(HTTP_req, "ajax_inputs")) {
            for (int iq = 0; iq < REQ_BUF_SIZE; iq++) {
              HTTP_req_temp[iq] = HTTP_req[iq];
            }  
            req_index_temp = req_index;
          } 
          parseCommands(sclient);
          // parse request
          parseRequest(sclient);
         
         // parse network commands
         // parseCommands(sclient);
           

          
           
          
          // send web page to client
          if (webFile) {
            while(webFile.available()) {
              sclient.write(webFile.read());
            }
            webFile.close();
          }
          
          // display received HTTP request on serial port
          Serial.println(HTTP_req);
        
          // Reset buffer index and all buffer elements to 0
          req_index = 0;
          StrClear(HTTP_req, REQ_BUF_SIZE);          
          break;
        }
        
        // every line of text received from the client ends with \r\n
        if (c == '\n') {
          
          /* last character on line of received text starting new line with next character read */
          
          currentLineIsBlank = true;
        } else if (c != '\r') {
            // a text character was received from client
            currentLineIsBlank = false;
          }
      } // if (client.available())
    } // while (client.connected())
    delay(1); // give the web browser time to receive the data
    sclient.stop(); // close the connection
  } // if (client)
  
} // serverWorks()
 
Server: Raspberry Pi 3 B+
OS: Rasbian
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: Arduino Mega Server

Сообщение annakin » Вт июл 14, 2015 3:05 pm

ГОТОВО Я устранил свою проблему, изучил вдоль и поперёк твой код и расставил по всем функциям кучу маркеров и нашёл где был затык.
В теории это должно устранить и вашу проблему.
Вот как должно быть что бы всё работало.
СпойлерПоказать

Код: Выделить всё

void parseCommands(EthernetClient cl) {
  int posBegin;
  int posEnd;
  int posParam;
  if (request.indexOf("&") >= 0) {
    posBegin = request.indexOf("&") + 1;
    posEnd = request.indexOf("HTTP");
    if (request.indexOf("=") >= 0) {
       posParam = request.indexOf("=");
       command = request.substring(posBegin, posParam);              
       parameter = request.substring(posParam + 1, posEnd - 1);              
    } else {
        command = request.substring(posBegin, posEnd - 1);              
        //parameter = "";
      }
    Serial.print("command: "); Serial.println(command);
    Serial.print("parameter: "); Serial.println(parameter);
    
    setKey(); 
    setNightLed();
    setColorLed();
    
    
  } //if (url.indexOf("?") >= 0)
// erase request
  request = ""; 
} // parseCommands
Алекс давай сделай на Git репозитории и будем туда складывать обновы.
Или давай я сделаю.
Как скажешь, проект ведь твой.

Алекс и как тебе такой вариант ?
http://www.freetronics.com.au/pages/how ... aT_8Pntl1U
За это сообщение автора annakin поблагодарил:
yulinn (Пн сен 21, 2015 9:13 am)
Рейтинг: 1.16%
Server: Raspberry Pi 3 B+
OS: Rasbian
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт июл 14, 2015 5:19 pm

> В теории это должно устранить и вашу проблему

Я же СОВСЕМ отключал этот модуль, а проблема осталась. По логике ЛЮБЫЕ изменения в его коде никак не могут решить мою проблему.

> Алекс давай сделай на Git репозитории и будем туда складывать обновы. Или давай я сделаю. Как скажешь, проект ведь твой.

Репозиторий уже создали. Ссылка есть в этой ветке и каждый желающий может править код как хочет.

Дело в том, что гит это не моя идея, мне он непривычен и неудобен и я не планирую им пользоваться (хотя понимаю, что это правильный путь).

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

> Алекс и как тебе такой вариант ?

Всё на английском, чувствуется, что что-то классное. Можно в двух словах объяснить в чём суть?

Вопрос к вам. У меня чётко наблюдается заморозка обмена, например, на странице «электро». У вас наблюдается заморозка или нет?
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт июл 14, 2015 6:12 pm

> Так как после обращения к сервера АМС через браузер он не закрывает соединение а накапливает запросы при этом перестаёт слушать сетевый команды как например включение реле.

Так может нужно закрывать соединения? Соединения намеренно не закрываются в коде, который был исходным и мне казалось, что тот, кто писал код, понимал, что делает.
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: Arduino Mega Server

Сообщение annakin » Вт июл 14, 2015 8:53 pm

Репозиторий уже создали. Ссылка есть в этой ветке и каждый желающий может править код как хочет.
Надо будет связатса с автором репозитория.
Дело в том, что гит это не моя идея, мне он непривычен и неудобен и я не планирую им пользоваться (хотя понимаю, что это правильный путь).
Как по мне так SVN удобней но надо переходить на ГИТ.
Всё на английском, чувствуется, что что-то классное. Можно в двух словах объяснить в чём суть?
Там описывается как сделать так что бы можно было заливать скетчи по сети без УСБ шнурка.
Но я сегодня начал паять схему для заливки скетчей по БТ, через HC-05

Код: Выделить всё

Вопрос к вам. У меня чётко наблюдается заморозка обмена, например, на странице «электро». У вас наблюдается заморозка или нет?
 
Как именно проявляется у вас заморозка ?
Опишите специфику заморозки или сделайте видео, попробуем решить и вашу проблему вместе, но как я говорил раньше у меня на такие дела уйдёт больше времени так как код не мой.
Server: Raspberry Pi 3 B+
OS: Rasbian
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт июл 14, 2015 9:59 pm

> Там описывается как сделать так что бы можно было заливать скетчи по сети без УСБ шнурка

Это реально мега-идея. Послал новый скетч и переконфигурировал контроллер на железном уровне. Или один контроллер переконфигурировал другой. Да и странички по сети обновлять круто.

> Как именно проявляется у вас заморозка ?

Так заморозка только у меня?

Проявляется очень просто: заходим на страницу «электро» и оставляем минут на 10. Через некоторое время шарики перестают пульсировать (это программа перестаёт заходить в функции) и, соответственно, замирают все индикаторы.

Перезагрузка страницы восстанавливает работу.
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: Arduino Mega Server

Сообщение annakin » Вт июл 14, 2015 10:48 pm

Это реально мега-идея. Послал новый скетч и переконфигурировал контроллер на железном уровне. Или один контроллер переконфигурировал другой. Да и странички по сети обновлять круто.
Да возможности у этой фишки море, я так быстро пробежался по тексту и как я понял там реализовано авторестарт после заливки скетча и много чего.
Но я шас взялся за идею о загрузки скетчей по БТ это мне больше по душе, как сделаю БТ, возмусь и за эту фишку.

А поповоду заморозки я завтра посмотрю и скажу.
Server: Raspberry Pi 3 B+
OS: Rasbian
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: Arduino Mega Server

Сообщение annakin » Ср июл 15, 2015 11:10 am

4 Часа заморозки на странице Електро не наблюдается, все индекаторы работают в штатном режиме.
Server: Raspberry Pi 3 B+
OS: Rasbian
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Ср июл 15, 2015 11:23 am

!!!!!!!!!!!!!!!!!!!! УРА! ЗАРАБОТАЛО! !!!!!!!!!!!!!!!!!!!

Решил проблему с заморозкой. Дело оказалось, как мне и подсказывала интуиция, в таймингах.

Код: Выделить всё

    } // while (client.connected())
    delay(10); // give the web browser time to receive the data
    sclient.stop(); // close the connection 
увеличил задержку до 10 и проблема исчезла. По крайней мере 7-и часовое тестирование прошло успешно (раньше и десяти минут не выдерживало).

Кроме того, изменил код функции

Код: Выделить всё

void sendXMLanswer(EthernetClient cl) {
  cl.println(HTTP_1_1_200_OK);
  cl.println(CONTENT_TYPE_TEXT_XML);
  cl.println(CONNECTION_CLOSE);
  cl.println();
} 
на закрытие соединений. Работает и так и так, в чём смысл непонятно. Тут как раз нужны обещанные профессионалы, которые всё грамотно объяснили бы. Грамотных профессионалов опять не видно, интересно они вообще есть на проекте? Или я опять самый грамотный? :)

Попутно провёл нагрузочное тестирование: открыл одновременно 12 вкладок с электрикой (дальше место под вкладки кончилось). И, как ни странно, всё работает! Ардуина легко обрабатывает 4х12 = 48 непрерывных Ajax потоков. Можно прямо хостинг открывать. :)
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Ср июл 15, 2015 12:19 pm

Измеритель частоты сетевого напряжения.

Поискал в сети и... не нашел. Пришлось быстренько :) изучить обработку сигналов на микропроцессорах и запилить собственный измеритель частоты. 8()

Чем он хорош, кроме понтов и красивых графиков и индикаторов (что тоже немаловажно :) )? Тем, что иногда предвестником перебоев в электросети служит нестабильность частоты сетевого напряжения. И имея такой инструмент вы можете переходить на резервное питание не через 40мс ПОСЛЕ пропадания сетевого напряжения, а ДО наступления аварии. Что, согласитесь, две большие разницы.
Вложения
freq.png
Частота сети
freq.png (6.52 КБ) 17008 просмотров
elnet.png
Качество электросети
elnet.png (66.31 КБ) 17008 просмотров
Ответить