AMS <-> AMS Туды Сюды
Добавлено: Сб апр 22, 2017 3:25 pm
Всем Привет!
Столкнулся с проблемой связи двух (трёх) АМС между собой по сетке.
Проще будет объяснить на конкретном примере:
Один контроллер отопления - управляет кранами подмеса, циркуляционными насосами, получает температуру с датчиков итд..Назовём его АМС А
Второй контроллер стоит в тепловом насосе - управляет компрессором, вентилятором, эрв итд.. Назовём его АМС Б
Задача:
АМС Б посылает 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);
- то получается ерунда.
АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером АМС Б, соответственно в этот момент ни А не может принять второй запрос, ни Б его отправить.
Вот никак не приходит в голову решение этой проблемы..(
Можно организовать задержку между запросами в самом коде, там где дёргаешь функцию, но этот вариант колхозен.
Есть идея создать буфер запросов - т.е. в программе вызываешь функцию, а она накапливает запросы и шлёт их с задержкой.
В общем может посоветуете чего? должно быть какое то элегантное решение.)