AMS <-> AMS Туды Сюды
Модератор: Alex
-
- Сообщения: 88
- Зарегистрирован: Сб окт 24, 2015 9:56 pm
- Благодарил (а): 11 раз
- Поблагодарили: 8 раз
AMS <-> AMS Туды Сюды
Всем Привет!
Столкнулся с проблемой связи двух (трёх) АМС между собой по сетке.
Проще будет объяснить на конкретном примере:
Один контроллер отопления - управляет кранами подмеса, циркуляционными насосами, получает температуру с датчиков итд..Назовём его АМС А
Второй контроллер стоит в тепловом насосе - управляет компрессором, вентилятором, эрв итд.. Назовём его АМС Б
Задача:
АМС Б посылает GET зарос на АМС А - включить насос
АМС А включает насос
АМС Б посылает GET зарос на АМС А - насос включен?
АМС А отвечает АМС Б - насос включен
Так же происходит и опрос температуры итд..
Посылка команд и запросов организована через открытие соединения с клиентом.
[code]
void sendHttpComand(byte ip[], int port, char object[], int value, WiFiClient tclient) { //Отправка команды или данных
String s = "";
if (tclient.connect(ip, port)) {
#ifdef SENDREQU_DEBUG
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" ");
#endif
s += "GET /Valuename&";
s += object;
s += "=";
s += value;
s += '\n';
tclient.println(s);
tclient.flush();
tclient.println();
#ifdef SENDREQU_DEBUG
Serial.println(s);
#endif
tclient.stop();
} else {
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" not connected (");
Serial.println(")");
}
}
[/code]
[code]
void sendHttpRequ(byte ip[], int port, char object[], int value, WiFiClient tclient) { //запрос переменных
String s = "";
if (tclient.connect(ip, port)) {
#ifdef SENDREQU_DEBUG
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" ");
#endif
s += "GET /Valuereq&";
s += object;
s += "?";
//s += value;
s += '\n';
tclient.println(s);
tclient.println();
tclient.flush();
#ifdef SENDREQU_DEBUG
Serial.println(s);
#endif
tclient.stop();
} else {
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" not connected (");
Serial.println(")");
}
}
[/code]
Получение ответов / команд организовано через парсинг запросов на сервер.
[code]
if (StrContains(HTTP_req, "GET /Valuename&")) {
sendXmlAnswer(cl);
// Serial.print("get ok");
strtok(HTTP_req, "&"); //вид запроса Valuename&valuename=value
char* data = strtok(NULL, "&"); //второй параметр - наша пара
char* Valuename = strtok(data, "=");
const char *lp_ptr = strtok(NULL, "=");
int value = atoi(lp_ptr);
for (byte i = 0; i < MAX_VAR; i++) {//сравниваем Valuename c нашими переменными
if (!strcmp(Valuename, valuename_strs[i])) {
values[i] = value;
Serial.print( valuename_strs[i]);
Serial.print(": ");
Serial.print(values[i]);
Serial.print("\n");
}
}
}[/code]
Теперь о проблеме:
например запрашиваем температуру:
sendHttpRequ(MHC_IP, MHC_PORT, "MHC_T_boil2", 0, tclient);
АМС А отвечает:
Valuename&MHC_T_boil2=35
-всё ок
Но если посылать сразу несколько запросов, например:
sendHttpRequ(MHC_IP, MHC_PORT, "MHC_T_boil2", 0, tclient);
sendHttpRequ(MHC_IP, MHC_PORT, "OUT_CircuPumpON", 0, tclient);
- то получается ерунда.
АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером АМС Б, соответственно в этот момент ни А не может принять второй запрос, ни Б его отправить.
Вот никак не приходит в голову решение этой проблемы..(
Можно организовать задержку между запросами в самом коде, там где дёргаешь функцию, но этот вариант колхозен.
Есть идея создать буфер запросов - т.е. в программе вызываешь функцию, а она накапливает запросы и шлёт их с задержкой.
В общем может посоветуете чего? должно быть какое то элегантное решение.)
Столкнулся с проблемой связи двух (трёх) АМС между собой по сетке.
Проще будет объяснить на конкретном примере:
Один контроллер отопления - управляет кранами подмеса, циркуляционными насосами, получает температуру с датчиков итд..Назовём его АМС А
Второй контроллер стоит в тепловом насосе - управляет компрессором, вентилятором, эрв итд.. Назовём его АМС Б
Задача:
АМС Б посылает GET зарос на АМС А - включить насос
АМС А включает насос
АМС Б посылает GET зарос на АМС А - насос включен?
АМС А отвечает АМС Б - насос включен
Так же происходит и опрос температуры итд..
Посылка команд и запросов организована через открытие соединения с клиентом.
[code]
void sendHttpComand(byte ip[], int port, char object[], int value, WiFiClient tclient) { //Отправка команды или данных
String s = "";
if (tclient.connect(ip, port)) {
#ifdef SENDREQU_DEBUG
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" ");
#endif
s += "GET /Valuename&";
s += object;
s += "=";
s += value;
s += '\n';
tclient.println(s);
tclient.flush();
tclient.println();
#ifdef SENDREQU_DEBUG
Serial.println(s);
#endif
tclient.stop();
} else {
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" not connected (");
Serial.println(")");
}
}
[/code]
[code]
void sendHttpRequ(byte ip[], int port, char object[], int value, WiFiClient tclient) { //запрос переменных
String s = "";
if (tclient.connect(ip, port)) {
#ifdef SENDREQU_DEBUG
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" ");
#endif
s += "GET /Valuereq&";
s += object;
s += "?";
//s += value;
s += '\n';
tclient.println(s);
tclient.println();
tclient.flush();
#ifdef SENDREQU_DEBUG
Serial.println(s);
#endif
tclient.stop();
} else {
timeStamp();
Serial.print("Host ");
printIp(ip);
Serial.print(" not connected (");
Serial.println(")");
}
}
[/code]
Получение ответов / команд организовано через парсинг запросов на сервер.
[code]
if (StrContains(HTTP_req, "GET /Valuename&")) {
sendXmlAnswer(cl);
// Serial.print("get ok");
strtok(HTTP_req, "&"); //вид запроса Valuename&valuename=value
char* data = strtok(NULL, "&"); //второй параметр - наша пара
char* Valuename = strtok(data, "=");
const char *lp_ptr = strtok(NULL, "=");
int value = atoi(lp_ptr);
for (byte i = 0; i < MAX_VAR; i++) {//сравниваем Valuename c нашими переменными
if (!strcmp(Valuename, valuename_strs[i])) {
values[i] = value;
Serial.print( valuename_strs[i]);
Serial.print(": ");
Serial.print(values[i]);
Serial.print("\n");
}
}
}[/code]
Теперь о проблеме:
например запрашиваем температуру:
sendHttpRequ(MHC_IP, MHC_PORT, "MHC_T_boil2", 0, tclient);
АМС А отвечает:
Valuename&MHC_T_boil2=35
-всё ок
Но если посылать сразу несколько запросов, например:
sendHttpRequ(MHC_IP, MHC_PORT, "MHC_T_boil2", 0, tclient);
sendHttpRequ(MHC_IP, MHC_PORT, "OUT_CircuPumpON", 0, tclient);
- то получается ерунда.
АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером АМС Б, соответственно в этот момент ни А не может принять второй запрос, ни Б его отправить.
Вот никак не приходит в голову решение этой проблемы..(
Можно организовать задержку между запросами в самом коде, там где дёргаешь функцию, но этот вариант колхозен.
Есть идея создать буфер запросов - т.е. в программе вызываешь функцию, а она накапливает запросы и шлёт их с задержкой.
В общем может посоветуете чего? должно быть какое то элегантное решение.)
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: AMS <-> AMS Туды Сюды
MQTT не пробовали? Быстрее работает...и адекватнее...единственное нужна 3я сторона - брокер (на системе majordomo к примеру)
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: AMS <-> AMS Туды Сюды
Народ потихоньку начинает просыпатьсяОдин контроллер отопления - управляет кранами подмеса, циркуляционными насосами, получает температуру с датчиков итд..Назовём его АМС А
Второй контроллер стоит в тепловом насосе - управляет компрессором, вентилятором, эрв итд.. Назовём его АМС Б
А что мешает послать (принять) запрос и разорвать соединение? Потом подготовить ответ, послать и опять разорвать соединение.АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером
-
- Сообщения: 88
- Зарегистрирован: Сб окт 24, 2015 9:56 pm
- Благодарил (а): 11 раз
- Поблагодарили: 8 раз
Re: AMS <-> AMS Туды Сюды
хотелось бы обойтись без посредников, хотя бы в конкретно этом случаи..
MQTT тоже не поможет, потому, что всё равно придётся останавливать сервер который работает на веб страницу. Идея в том, что бы обмен не мешал работы веб морды.
Так то и на гет можно сделать - остановили сервер, и общаемся с клиентом. Проблема в том, что клиент в этот момент может быть чем то занят и вопрос - ответ растягиваются во времени, т.е. нельзя уложить всю эту процедуру в одну сессию..
MQTT тоже не поможет, потому, что всё равно придётся останавливать сервер который работает на веб страницу. Идея в том, что бы обмен не мешал работы веб морды.
Так то и на гет можно сделать - остановили сервер, и общаемся с клиентом. Проблема в том, что клиент в этот момент может быть чем то занят и вопрос - ответ растягиваются во времени, т.е. нельзя уложить всю эту процедуру в одну сессию..
-
- Сообщения: 88
- Зарегистрирован: Сб окт 24, 2015 9:56 pm
- Благодарил (а): 11 раз
- Поблагодарили: 8 раз
Re: AMS <-> AMS Туды Сюды
У меня так и работает... Проблема в том, что когда клиент отвечает на запрос 1 ты шлёшь ему вопрос 2. Вот надо вопросы слать с какой то задержкой..А что мешает послать (принять) запрос и разорвать соединение? Потом подготовить ответ, послать и опять разорвать соединение.АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером
-
- Сообщения: 88
- Зарегистрирован: Сб окт 24, 2015 9:56 pm
- Благодарил (а): 11 раз
- Поблагодарили: 8 раз
Re: AMS <-> AMS Туды Сюды
У меня эта кочерга уже 2ой год работает.Alex писал(а):Народ потихоньку начинает просыпатьсяОдин контроллер отопления - управляет кранами подмеса, циркуляционными насосами, получает температуру с датчиков итд..Назовём его АМС А
Второй контроллер стоит в тепловом насосе - управляет компрессором, вентилятором, эрв итд.. Назовём его АМС Б
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: AMS <-> AMS Туды Сюды
Трудно сказать, я не сталкивался с такой ситуацией. В моей практике один АМС слал управляющие команды другому — всё работало без проблем (я думаю и второй первому тоже слал бы без проблем). Правда команды шли не беспрерывно, а время от времени.
Значит вы соображаете в 730 раз быстрее, чем остальные.У меня эта кочерга уже 2ой год работает.
-
- Сообщения: 88
- Зарегистрирован: Сб окт 24, 2015 9:56 pm
- Благодарил (а): 11 раз
- Поблагодарили: 8 раз
Re: AMS <-> AMS Туды Сюды
Alex писал(а):Трудно сказать, я не сталкивался с такой ситуацией. В моей практике один АМС слал управляющие команды другому — всё работало без проблем (я думаю и второй первому тоже слал бы без проблем). Правда команды шли не беспрерывно, а время от времени.
Значит вы соображаете в 730 раз быстрее, чем остальные.У меня эта кочерга уже 2ой год работает.
По вопросу подскажите чего-нибудь? Тема то актуальная..
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: AMS <-> AMS Туды Сюды
Чтобы сказать что-то содержательное нужно смоделировать ситуацию, тестировать и анализировать. Так сказать ничего не могу потому, что не сталкивался с таким.
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: AMS <-> AMS Туды Сюды
Зачем сервер веб останавливать? Оо вся прелесть mqtt в том, что он поднимается поверх существующего tcp соединения, и абсолютно ничему не мешает...более того - меньше грузит АМС-ы, чем гет запросы...ledmax писал(а):хотелось бы обойтись без посредников, хотя бы в конкретно этом случаи..
MQTT тоже не поможет, потому, что всё равно придётся останавливать сервер который работает на веб страницу. Идея в том, что бы обмен не мешал работы веб морды.
Так то и на гет можно сделать - остановили сервер, и общаемся с клиентом. Проблема в том, что клиент в этот момент может быть чем то занят и вопрос - ответ растягиваются во времени, т.е. нельзя уложить всю эту процедуру в одну сессию..
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<