Страница 10 из 326
Re: Arduino Mega Server
Добавлено: Вт июл 14, 2015 2:21 pm
annakin
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()
Re: Arduino Mega Server
Добавлено: Вт июл 14, 2015 3:05 pm
annakin
ГОТОВО Я устранил свою проблему, изучил вдоль и поперёк твой код и расставил по всем функциям кучу маркеров и нашёл где был затык.
В теории это должно устранить и вашу проблему.
Вот как должно быть что бы всё работало.
Код: Выделить всё
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
Re: Arduino Mega Server
Добавлено: Вт июл 14, 2015 5:19 pm
Alex
> В теории это должно устранить и вашу проблему
Я же СОВСЕМ отключал этот модуль, а проблема осталась. По логике ЛЮБЫЕ изменения в его коде никак не могут решить мою проблему.
> Алекс давай сделай на Git репозитории и будем туда складывать обновы. Или давай я сделаю. Как скажешь, проект ведь твой.
Репозиторий уже создали. Ссылка есть в этой ветке и каждый желающий может править код как хочет.
Дело в том, что гит это не моя идея, мне он непривычен и неудобен и я не планирую им пользоваться (хотя понимаю, что это правильный путь).
Сообщество (если у него есть желание) может вести проект на гитхаб, а я планирую время от времени выкладывать на форуме свою сборку. Откуда вы можете брать нужные вам куски кода и идеи и создавать сборку своей мечты.
> Алекс и как тебе такой вариант ?
Всё на английском, чувствуется, что что-то классное. Можно в двух словах объяснить в чём суть?
Вопрос к вам. У меня чётко наблюдается заморозка обмена, например, на странице «электро». У вас наблюдается заморозка или нет?
Re: Arduino Mega Server
Добавлено: Вт июл 14, 2015 6:12 pm
Alex
> Так как после обращения к сервера АМС через браузер он не закрывает соединение а накапливает запросы при этом перестаёт слушать сетевый команды как например включение реле.
Так может нужно закрывать соединения? Соединения намеренно не закрываются в коде, который был исходным и мне казалось, что тот, кто писал код, понимал, что делает.
Re: Arduino Mega Server
Добавлено: Вт июл 14, 2015 8:53 pm
annakin
Репозиторий уже создали. Ссылка есть в этой ветке и каждый желающий может править код как хочет.
Надо будет связатса с автором репозитория.
Дело в том, что гит это не моя идея, мне он непривычен и неудобен и я не планирую им пользоваться (хотя понимаю, что это правильный путь).
Как по мне так SVN удобней но надо переходить на ГИТ.
Всё на английском, чувствуется, что что-то классное. Можно в двух словах объяснить в чём суть?
Там описывается как сделать так что бы можно было заливать скетчи по сети без УСБ шнурка.
Но я сегодня начал паять схему для заливки скетчей по БТ, через HC-05
Код: Выделить всё
Вопрос к вам. У меня чётко наблюдается заморозка обмена, например, на странице «электро». У вас наблюдается заморозка или нет?
Как именно проявляется у вас заморозка ?
Опишите специфику заморозки или сделайте видео, попробуем решить и вашу проблему вместе, но как я говорил раньше у меня на такие дела уйдёт больше времени так как код не мой.
Re: Arduino Mega Server
Добавлено: Вт июл 14, 2015 9:59 pm
Alex
> Там описывается как сделать так что бы можно было заливать скетчи по сети без УСБ шнурка
Это реально мега-идея. Послал новый скетч и переконфигурировал контроллер на железном уровне. Или один контроллер переконфигурировал другой. Да и странички по сети обновлять круто.
> Как именно проявляется у вас заморозка ?
Так заморозка только у меня?
Проявляется очень просто: заходим на страницу «электро» и оставляем минут на 10. Через некоторое время шарики перестают пульсировать (это программа перестаёт заходить в функции) и, соответственно, замирают все индикаторы.
Перезагрузка страницы восстанавливает работу.
Re: Arduino Mega Server
Добавлено: Вт июл 14, 2015 10:48 pm
annakin
Это реально мега-идея. Послал новый скетч и переконфигурировал контроллер на железном уровне. Или один контроллер переконфигурировал другой. Да и странички по сети обновлять круто.
Да возможности у этой фишки море, я так быстро пробежался по тексту и как я понял там реализовано авторестарт после заливки скетча и много чего.
Но я шас взялся за идею о загрузки скетчей по БТ это мне больше по душе, как сделаю БТ, возмусь и за эту фишку.
А поповоду заморозки я завтра посмотрю и скажу.
Re: Arduino Mega Server
Добавлено: Ср июл 15, 2015 11:10 am
annakin
4 Часа заморозки на странице Електро не наблюдается, все индекаторы работают в штатном режиме.
Re: Arduino Mega Server
Добавлено: Ср июл 15, 2015 11:23 am
Alex
!!!!!!!!!!!!!!!!!!!! УРА! ЗАРАБОТАЛО! !!!!!!!!!!!!!!!!!!!
Решил проблему с заморозкой. Дело оказалось, как мне и подсказывала интуиция, в таймингах.
Код: Выделить всё
} // 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 потоков. Можно прямо хостинг открывать.

Re: Arduino Mega Server
Добавлено: Ср июл 15, 2015 12:19 pm
Alex
Измеритель частоты сетевого напряжения.
Поискал в сети и... не нашел. Пришлось быстренько

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

)? Тем, что иногда предвестником перебоев в электросети служит нестабильность частоты сетевого напряжения. И имея такой инструмент вы можете переходить на резервное питание не через 40мс ПОСЛЕ пропадания сетевого напряжения, а ДО наступления аварии. Что, согласитесь, две большие разницы.