AMS <-> AMS Туды Сюды

Модератор: Alex

ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

AMS <-> AMS Туды Сюды

Сообщение ledmax » Сб апр 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);
- то получается ерунда.
АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером АМС Б, соответственно в этот момент ни А не может принять второй запрос, ни Б его отправить.

Вот никак не приходит в голову решение этой проблемы..(
Можно организовать задержку между запросами в самом коде, там где дёргаешь функцию, но этот вариант колхозен.
Есть идея создать буфер запросов - т.е. в программе вызываешь функцию, а она накапливает запросы и шлёт их с задержкой.

В общем может посоветуете чего? должно быть какое то элегантное решение.)
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: AMS <-> AMS Туды Сюды

Сообщение nick7zmail » Сб апр 22, 2017 6:16 pm

MQTT не пробовали? Быстрее работает...и адекватнее...единственное нужна 3я сторона - брокер (на системе majordomo к примеру)
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: AMS <-> AMS Туды Сюды

Сообщение Alex » Сб апр 22, 2017 6:39 pm

Один контроллер отопления - управляет кранами подмеса, циркуляционными насосами, получает температуру с датчиков итд..Назовём его АМС А
Второй контроллер стоит в тепловом насосе - управляет компрессором, вентилятором, эрв итд.. Назовём его АМС Б
Народ потихоньку начинает просыпаться :)
АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером
А что мешает послать (принять) запрос и разорвать соединение? Потом подготовить ответ, послать и опять разорвать соединение.
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: AMS <-> AMS Туды Сюды

Сообщение ledmax » Сб апр 22, 2017 6:40 pm

хотелось бы обойтись без посредников, хотя бы в конкретно этом случаи..
MQTT тоже не поможет, потому, что всё равно придётся останавливать сервер который работает на веб страницу. Идея в том, что бы обмен не мешал работы веб морды.
Так то и на гет можно сделать - остановили сервер, и общаемся с клиентом. Проблема в том, что клиент в этот момент может быть чем то занят и вопрос - ответ растягиваются во времени, т.е. нельзя уложить всю эту процедуру в одну сессию..
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: AMS <-> AMS Туды Сюды

Сообщение ledmax » Сб апр 22, 2017 6:43 pm

АМС А, после получения запроса на температуру нужно время, что бы отправить ответ и в этот момент у него будет открыто соединение с сервером
А что мешает послать (принять) запрос и разорвать соединение? Потом подготовить ответ, послать и опять разорвать соединение.
У меня так и работает... Проблема в том, что когда клиент отвечает на запрос 1 ты шлёшь ему вопрос 2. Вот надо вопросы слать с какой то задержкой..
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: AMS <-> AMS Туды Сюды

Сообщение ledmax » Сб апр 22, 2017 6:46 pm

Alex писал(а):
Один контроллер отопления - управляет кранами подмеса, циркуляционными насосами, получает температуру с датчиков итд..Назовём его АМС А
Второй контроллер стоит в тепловом насосе - управляет компрессором, вентилятором, эрв итд.. Назовём его АМС Б
Народ потихоньку начинает просыпаться :)
У меня эта кочерга уже 2ой год работает. :)
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: AMS <-> AMS Туды Сюды

Сообщение Alex » Сб апр 22, 2017 6:51 pm

Трудно сказать, я не сталкивался с такой ситуацией. В моей практике один АМС слал управляющие команды другому — всё работало без проблем (я думаю и второй первому тоже слал бы без проблем). Правда команды шли не беспрерывно, а время от времени.
У меня эта кочерга уже 2ой год работает.
Значит вы соображаете в 730 раз быстрее, чем остальные. :)
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: AMS <-> AMS Туды Сюды

Сообщение ledmax » Сб апр 22, 2017 6:54 pm

Alex писал(а):Трудно сказать, я не сталкивался с такой ситуацией. В моей практике один АМС слал управляющие команды другому — всё работало без проблем (я думаю и второй первому тоже слал бы без проблем). Правда команды шли не беспрерывно, а время от времени.
У меня эта кочерга уже 2ой год работает.
Значит вы соображаете в 730 раз быстрее, чем остальные. :)
;)
По вопросу подскажите чего-нибудь? Тема то актуальная..
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: AMS <-> AMS Туды Сюды

Сообщение Alex » Сб апр 22, 2017 6:58 pm

Чтобы сказать что-то содержательное нужно смоделировать ситуацию, тестировать и анализировать. Так сказать ничего не могу потому, что не сталкивался с таким.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: AMS <-> AMS Туды Сюды

Сообщение nick7zmail » Сб апр 22, 2017 7:12 pm

ledmax писал(а):хотелось бы обойтись без посредников, хотя бы в конкретно этом случаи..
MQTT тоже не поможет, потому, что всё равно придётся останавливать сервер который работает на веб страницу. Идея в том, что бы обмен не мешал работы веб морды.
Так то и на гет можно сделать - остановили сервер, и общаемся с клиентом. Проблема в том, что клиент в этот момент может быть чем то занят и вопрос - ответ растягиваются во времени, т.е. нельзя уложить всю эту процедуру в одну сессию..
Зачем сервер веб останавливать? Оо вся прелесть mqtt в том, что он поднимается поверх существующего tcp соединения, и абсолютно ничему не мешает...более того - меньше грузит АМС-ы, чем гет запросы...
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить