Arduino Mega Server

Модератор: Alex

Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пн июл 13, 2015 2:46 pm

Проблема заключается в том, что мне абсолютно непонятна причина заморозки. Саморазморозка говорит о том, что зависания нет и все части системы могут функционировать. Но не функционирут. Что им мешает? Непонятно.

Мониторинг сети говорит о том, что яваскрипт шлёт запросы. 3D индикаторы говорят, что нет ответа от Ардуины (кстати, вы поняли что это не просто «шарики», а индикаторы прохождения алгоритма по функциям?).

Serial монитор говорит о том, что запросы Ардуина получает. Исходя из этой логики затык находится где-то между сервером и XML ответами Ардуины. Но там просто негде заткнуться...

Интуиция мне подсказывает, что проблема может быть связана с таймингами и «неуспеванием» обработки лавины запросов от яваскрипта.

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

Re: Arduino Mega Server

Сообщение annakin » Пн июл 13, 2015 5:13 pm

Выявил такую ситуацию что функции реле перестают отвечать как только делаю запрос в браузере AMS, я имею ввиду когда я захожу на сервер AMS, как только я выполняю запрос в браузере http://192.168.0.101 (это у меня сервер AMS) функции реле сразу перестают отвечать, пока я не перезапущу AMS.

UPD: Значит если даже не заходить на AMS то сама функции сама перестаёт отвечать примерно через 10-15 минут.
UPD: Методом Маркеров на данный момент выявил что в модуле Server а именно в функции serverWorks проблема с заморозкой после которой перестают приниматься команды если я захожу через браузер на АМС
serverWorksПоказать

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

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;
          } 
          
          // parse request
          parseRequest(sclient);
         
         // parse network commands
          parseCommands(sclient);
          Serial.println("MARKER===============================>"); 
          
          // 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
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пн июл 13, 2015 7:28 pm

Методом Маркеров на данный момент выявил что в модуле Server а именно в функции serverWorks проблема с заморозкой после которой перестают приниматься команды если я захожу через браузер на АМС
Отличная работа. Ещё бы человек двадцать таких как вы и мы бы за неделю успешно завершили весь проект. :)

Тут ещё дело в том, что я не тестировал работу сетевых команд в составе АМС, этот код работал в предыдущей инкарнации системы (без проблем). Я столкнулся именно с заморозкой Ajax обмена.

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

Re: Arduino Mega Server

Сообщение annakin » Пн июл 13, 2015 7:32 pm

Alex писал(а):
Методом Маркеров на данный момент выявил что в модуле Server а именно в функции serverWorks проблема с заморозкой после которой перестают приниматься команды если я захожу через браузер на АМС
Отличная работа. Ещё бы человек двадцать таких как вы и мы бы за неделю успешно завершили весь проект. :)

Тут ещё дело в том, что я не тестировал работу сетевых команд в составе АМС, этот код работал в предыдущей инкарнации системы (без проблем). Я столкнулся именно с заморозкой Ajax обмена.

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

Re: Arduino Mega Server

Сообщение Alex » Пн июл 13, 2015 7:52 pm

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

Re: Arduino Mega Server

Сообщение annakin » Пн июл 13, 2015 8:14 pm

Блин перепробовал кучу вариантов, расставил вагон маркеров изменил тонну кода и никакого результата.
У меня мозг уже через ушные отверстия лезет.
Завтра буду разбиратся.
Тестировал шас так:
Без захода в браузер даю команду на включение Реле:

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

http://192.168.0.101/&rele4=1   
все работает.
Проста захожу через Хром на АМС.

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

http://192.168.0.101/   
Сразу перестаёт работать реле.
Дальше захожу на:

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

http://192.168.0.101/sample2.htm   
Там есть кнопочка включить D5, а на D5 я поставил ещё одно реле и когда я тыкаю оно работает,
а реле которое

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

http://192.168.0.101/&rele4=1   
попрежнему не отвечает.
Отсюда вывод ????????????????????????
Всё я на сегодня больше не осилю и килобайта кода.
Если у тебя что-то получится пиши.

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

Re: Arduino Mega Server

Сообщение Alex » Пн июл 13, 2015 9:48 pm

Создал многофункциональные индикаторы устройств. Цвет показывает состояние устройства (включено, выключено, режим готовности (тот, который сосёт энергию из сети и ваши деньги из кошелька). Текущее показание потребляемой мощности и пяти-сегментный индикатор режима работы устройства. Вы задаёте пять уровней потребляемой мощности и сразу видите в каком режиме работает устройство.

Для annakin

Результаты тестов:

Отключил модуль коммандс. Результат: всё равно заморозился. Вывод: модуль коммандс не при чём.

После заморозки перезалил скетч. Результат: не разморозился. Вывод: скетч не при чём.

В браузере нажал кнопку «обновить». Результат: всё заработало. Вывод дело в яваскрипте. Хотя сетевой монитор показывает, что запросы идут (во время заморозки) , а ответов от Ардуины нет.

Ваши соображения, коллега?
Вложения
devs.png
индикаторы устройств
devs.png (12.02 КБ) 17025 просмотров
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: Arduino Mega Server

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

Ну если ты считаешь что проблема в Яве то тут я не смогу ничем помочь ибо я Яве я не силён.
Но вот что я вчера выяснил с помощью маркеров:
В модуле server_commands функция parseCommands есть два параметра я их выделил жирным.
СпойлерПоказать

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

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 = "";
      }
   [b] Serial.print("command: "); Serial.println(command);
    Serial.print("parameter: "); Serial.println(parameter);[/b]
    
    setKey(); 
    setNightLed();
    setColorLed();
    // erase request
    request = ""; 
  } //if (url.indexOf("?") >= 0)
} // parseCommands
 
Вот лог Монитора до захода на АМС через Браузер.Показать

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

command: rele4
parameter: .
GET /&rele4=. HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 
command: rele4
parameter: 1
GET /&rele4=1 HTTP/1.1
User-Agent: Opera/9.80 (Windows NT
А Вот ниже лог монитора после захода на АМС через Хром
После захода на АМС Реле перестаёт работать.Показать

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

GET /&rele4=. HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 
2015-07-14 11:49:44 >>> 159
 (duration 20 sec) 
GET /&rele4=1 HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 


Отсюда вывод: после входа на АМС через браузер перестаёт обрабатываться функция parseCommands
Server: Raspberry Pi 3 B+
OS: Rasbian
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

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

Отсюда вывод: после входа на АМС через браузер перестаёт обрабатываться функция parseCommands
Вполне возможно. Но мы говорим о разных вещах. Я борюсь с замораживанием Ajax обмена. И я ВООБЩЕ ОТКЛЮЧАЛ модуль коммандс, а проблема никуда не делась. А в чём причина глюка я не знаю. Буду копать дальше...
За это сообщение автора Alex поблагодарил:
AirKing (Ср июл 15, 2015 7:33 am)
Рейтинг: 1.16%
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

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

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

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

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

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

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

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

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

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ответить