Об MQTT(для svetozar161)

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Об MQTT(для svetozar161)

Сообщение alexsis_76 » Пн сен 10, 2018 3:56 am

Ну начнем с тривиального
MQTT (Message Queue Telemetry Transport) — упрощённый сетевой протокол, работающий поверх TCP/IP. Используется для обмена сообщениями между устройствами по принципу издатель-подписчик.
Протоколом не предусмотрено взаимодействие подписчика и издателя напрямую между собой.
Есть брокер(например Mosquitto) который обеспечивает обмен сообщениями между издателем и подписчиком,издатель публикует сообщения в так называемые топики(например /home/living-space/living-room1/temperature), подписчик может подписаться на топик (SUBSCRIBE) можно подписаться на определенный топик или на все #,если надоело то можете отписаться(UNSUBSCRIBE),все взаимодействие проходит через брокер.
Теперь обсудим детали(самое интересное) :) .
В сети есть огромная масса кода для протокола,например код написанный nick7zmail(конечно уважаемый nick7zmail его не писал,это код их демо :) ) но тем не менее он нормально функционирует,его особенностью можно считать склонность к зависанию при реконнекте, проявляется это проявляется в задежках программы(вообщем то как и всех других для работы с сетью),ничего не поделаешь-блокирующий код.
после инициализации вся работа происходит сдесь
void mqttWorks() {
if (!mclient.connected()) {
modulMajor = MODUL_DISABLE;
if(cycle1m) {
mqtt_reconnect();
}
} else {
if(cycle1m) mclient.publish("/AMSmega/work","1");
mclient.loop();
}
}
как видим ничего сложного нет
if (!mclient.connected()) {
modulMajor = MODUL_DISABLE;
if(cycle1m) {
mqtt_reconnect();
}
если нет коннекта то modulMajor = MODUL_DISABLE и периодически делаем mqtt_reconnect()
вот он
void mqtt_reconnect() {
Serial.print("Attempting MQTT connection...");
if (mclient.connect(AMS_name, Mlogin, Mpass)) {
mclient.publish("/AMSmega/work","hello world");
mclient.subscribe("/AMSmega/control/#");
Serial.println("connected");
modulMajor = MODUL_ENABLE;
} else {
Serial.print("connect failed, rc=");
Serial.println(mclient.state());
modulMajor = MODUL_DISABLE;
}
}
тут информируем в сериале что Attempting MQTT connection..., и если коннект удачный то mclient.publish("/AMSmega/work","hello world");
mclient.subscribe("/AMSmega/control/#");
Serial.println("connected");
modulMajor = MODUL_ENABLE;
если нет то соответственно нет, функция connect блокирующая (те самые тормоза при отсутствии брокера)
сообщения валим в топик /AMSmega/work написанный руками,вот так собственно все не очень сложно с передачей :)
Теперь более интересное-прием, т е можно управлять устройствами(реле, лампочками и прочем)с помощью протокола, тут тоже нет ничего сложного(блин как все просто), применительно к данному коду
mclient.subscribe("/AMSmega/control/#");
подписка на "/AMSmega/control/#", теперь если слать с клиента сообщения в топик /AMSmega/control то брокер пошлет их прямехонько нашему девайсу, у девайса есть
void callback(char* topic, byte* payload, unsigned int length) {
#ifdef RELAYS_FEATURE
char req_name[30];
for (byte i=0; i<8; i++) {
sprintf(req_name, "%s%d", "REL", i+1);
if (StrContains(topic, req_name)) {
payload[0]=payload[0]-'0';
Serial.print(payload[0]);
rel_sw(i, payload[0]);
}
}
это называется функция обратного вызова, она будет вызвана из кода библиотеки PubSubClient , ей будут переданы параметры
char* topic, byte* payload, unsigned int length
название топика /AMSmega/control, полезная нагрузка payload(она представляет наибольший интерес) и длинна сообщения, тут вот в результате всех манипуляций будет вызвана rel_sw(i, payload[0]); которая переключит реле и отправит mclient.publish(rel_name, "1"); либо mclient.publish(rel_name, "0");
это один из самых простых кодов mqtt, есть более продвинутые.
Ну и напоследок как запустить :)
прошиваете этим кодом,предварительно меняете все настройки на свои
IPAddress MQTTserver(192, 168, 2, 104); //адрес брокера москито
char const Mlogin[] = "serghei"; //логин брокера
char const Mpass[] = "rootroot"; //пароль брокера
char const AMS_name[] = "AMSmegaL";
Данный код позволяет соединятся с авторизаций и без , если не хотите авторизацию то напишите
connect(AMS_name)вместо connect(AMS_name, Mlogin, Mpass))
ставите брокер, брокер может быть на windows машине , может быть на orange bkb rasspbery,брокер не привязан к majordomo или к кому то другому, он сам по себе,итак код скомпилен и залит , брокер запущен, осталось поставить клиента, клиентов существует огромное количество под любые платформы(хотя на яблоке не проверял), берете первый попавшийся например андройд ставите, вводите адрес сервера москита и соединяетесь,ну и на этом все, можете наслаждаться :)
Надеюсь было интересно, если что то непонятно, пишите.
Да и как взаимодействует скетч поддержки majordomo который изначально закомментирован?
это который?
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Об MQTT(для svetozar161)

Сообщение nick7zmail » Пн сен 10, 2018 6:22 am

Че эт я его не писал то?)) С нуля всё написано было в рамках AMS. Естественно в примеры библиотеки подглядывал, как без этого то))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Об MQTT(для svetozar161)

Сообщение alexsis_76 » Пн сен 10, 2018 6:38 am

Не сердитесь уважаемый nick7zmail,я только хотел сказать что код повторяет код из примеров к библиотекам с небольшими вариациями.
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: Об MQTT(для svetozar161)

Сообщение svetozar161 » Пн сен 10, 2018 12:56 pm

Огромное спасибо за разжеванное)) постараюсь во все это вникнуть - времени катастрофически на это нет.
С вашего позволения позволю себе объяснить, что я хотел и что в итоге на сегодняшний момент получилось. Захотелось как и всем построить подобие умного дома, с мониторингом и дерганием ног удаленно. Был приобретен win комп, на него установлен мажордомо. Далее по дому была раскинута локалка. Датчики в комнатах были выбраны беспроводные на основе есп12 и sht21, так как хотелось не только получать температуру, но и влажность. Датчик через индикатор TM1637 показывает время, температуру и влажность и с периодичностью в 10 секунд шлет информацию на мажордомо, где уже можно строить графики и т.д. На кухне стоит настенный котел, присутствует газовый, электро и водяной счетчики. Ранее до моей затеи стоял набор от мастер кита nm8036 термостат программируемый, от которого были раскинуты 18б20 по комнатам и через реле был подключен котел, который работал по дельте. В связи с ремонтом это все было упразднено. Значит задача стоит такая: нужен контроллер, аналог мастер кита, можно без экрана. Контроллер должен считывать температуру с беспроводного датчика комнаты, на основе этих данных термостатировать котел, по сети отсылать мажордомо состояние реле котла. В будущем должна быть возможность подключения к контроллеру: данных со счетчика газового, водомера и электрического (пока их нет), датчиков температуры на основе далласов на подачу котла, обратку, температуру ГВС, датчик давления в отоплении, датчик протечки опция. Вот и все)) Была куплена ардуина мега. Начал судорожно перебирать интернет, наткнулся на проект АМС. Вот собственно пока и все.
Буду рад любым консультациям. Если не будет у самого получаться, то в принципе возможна и оплата за программный код и схему подключения. Но сперва хотелось бы конечно самому допетрить. Купить все легко, а вот знания это ценно))
Спасибо за уделенное время.
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Об MQTT(для svetozar161)

Сообщение alexsis_76 » Пн сен 10, 2018 3:02 pm

Рад помочь.
По поводу АМС,на просторах интернета полно всяких скетчей веб серверов выбирайте любой,достоинство АМС в том что все это собрано в кучу включай и работай,конечно АМС это не настоящий сервер но тем не менее он позволяет легко осуществить задуманное Вами,только надо его маленько оптимизировать,выкинуть лишнее,добавить сторожевой таймер,написать недостающее.
Достаточно легко сопрягается с другими системами,например мажердомо. Можно наладить обмен с другими подобными устройствами.
Немного попозже напишу про заккоментированный код. Загляните в папку Arduino там есть много чего интересного,так же полно исходного кода на гитхабе,вообщем дерзайте,ежели что не понятно,пишите.
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: Об MQTT(для svetozar161)

Сообщение svetozar161 » Пн сен 10, 2018 3:29 pm

Понял. Тут пока сидел размышлял, пришла мысль. Мой датчик на основе прошивки wifi-iot от Макса, посылает get запросы на любой сервер! Там это даже написано. Зачем посылать их на мажордомо, если я могу их посылать сразу на АМС! То есть, если я пропишу ip адрес сервера АМС то увидит ли он эти get посылки? В них то и содержится температура и влажность.
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Об MQTT(для svetozar161)

Сообщение alexsis_76 » Пн сен 10, 2018 3:33 pm

Зачем посылать их на мажордомо, если я могу их посылать сразу на АМС! То есть, если я пропишу ip адрес сервера АМС то увидит ли он эти get посылки? В них то и содержится температура и влажность.
увидит, их надо будет распарсить и можно использовать находящиеся в них данные
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Об MQTT(для svetozar161)

Сообщение alexsis_76 » Пн сен 10, 2018 3:41 pm

функция
void majordomoMegaLive() {
if (cycle1m) {
sendRequestM(majorMegaObject, 1);
checkEvent(&prevEventMegaLive);
}
}
раз в минуту вызывает sendRequestM
//void sendRequestM(char object[], int value) {
// sprintf(buf, "GET /objects/?object=%s&op=m&m=update&v=%d", object, value);
//sendMajorRequest();//
// sendHttpRequest(MAJOR_IP, MAJOR_PORT, mclient);
//}
которая занимается передачей в мажердомо, checkEvent обновляет аптайм и печатает в сериал время
void showDuration(time_t duration) {
// prints the duration in days, hours, minutes and seconds
timeStamp();
Serialprint("(duration ");
if(duration >= SECS_PER_DAY){
Serial.print(duration / SECS_PER_DAY);
Serialprint(" day ");
duration = duration % SECS_PER_DAY;
}
if(duration >= SECS_PER_HOUR){
Serial.print(duration / SECS_PER_HOUR);
Serialprint(" hour ");
duration = duration % SECS_PER_HOUR;
}
if(duration >= SECS_PER_MIN){
Serial.print(duration / SECS_PER_MIN);
Serialprint(" min ");
duration = duration % SECS_PER_MIN;
}
Serial.print(duration);
Serialprint(" sec)\n");
}

void checkEvent(time_t* prevEvent) {
time_t duration = 0;
time_t timeNow = now();

if (*prevEvent > 0) {
duration = timeNow - *prevEvent;
}
if (duration > 0) {
showDuration(duration);
}
*prevEvent = timeNow;
}
остальные функции используются для передачи,инициализации,проверки наличия мажердома
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: Об MQTT(для svetozar161)

Сообщение svetozar161 » Пн сен 10, 2018 4:46 pm

Ага. А эти распарсенные данные как использовать для дрыгания ногой? Доп.скетч писать?
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Об MQTT(для svetozar161)

Сообщение alexsis_76 » Пн сен 10, 2018 4:54 pm

Допустим получаете Вы температуру,смотрите ,если температура превышает верхний установленный порог-выключаете тен,если меньше нижнего то включаете.
Ответить