Протоколом не предусмотрено взаимодействие подписчика и издателя напрямую между собой.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();
}
}
если нет коннекта то modulMajor = MODUL_DISABLE и периодически делаем mqtt_reconnect()if (!mclient.connected()) {
modulMajor = MODUL_DISABLE;
if(cycle1m) {
mqtt_reconnect();
}
вот он
тут информируем в сериале что Attempting MQTT connection..., и если коннект удачный то mclient.publish("/AMSmega/work","hello world");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;
}
}
если нет то соответственно нет, функция connect блокирующая (те самые тормоза при отсутствии брокера)mclient.subscribe("/AMSmega/control/#");
Serial.println("connected");
modulMajor = MODUL_ENABLE;
сообщения валим в топик /AMSmega/work написанный руками,вот так собственно все не очень сложно с передачей
Теперь более интересное-прием, т е можно управлять устройствами(реле, лампочками и прочем)с помощью протокола, тут тоже нет ничего сложного(блин как все просто), применительно к данному коду
подписка на "/AMSmega/control/#", теперь если слать с клиента сообщения в топик /AMSmega/control то брокер пошлет их прямехонько нашему девайсу, у девайса естьmclient.subscribe("/AMSmega/control/#");
это называется функция обратного вызова, она будет вызвана из кода библиотеки PubSubClient , ей будут переданы параметры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]);
}
}
название топика /AMSmega/control, полезная нагрузка payload(она представляет наибольший интерес) и длинна сообщения, тут вот в результате всех манипуляций будет вызвана rel_sw(i, payload[0]); которая переключит реле и отправит mclient.publish(rel_name, "1"); либо mclient.publish(rel_name, "0");char* topic, byte* payload, unsigned int length
это один из самых простых кодов mqtt, есть более продвинутые.
Ну и напоследок как запустить
прошиваете этим кодом,предварительно меняете все настройки на свои
Данный код позволяет соединятся с авторизаций и без , если не хотите авторизацию то напишитеIPAddress MQTTserver(192, 168, 2, 104); //адрес брокера москито
char const Mlogin[] = "serghei"; //логин брокера
char const Mpass[] = "rootroot"; //пароль брокера
char const AMS_name[] = "AMSmegaL";
ставите брокер, брокер может быть на windows машине , может быть на orange bkb rasspbery,брокер не привязан к majordomo или к кому то другому, он сам по себе,итак код скомпилен и залит , брокер запущен, осталось поставить клиента, клиентов существует огромное количество под любые платформы(хотя на яблоке не проверял), берете первый попавшийся например андройд ставите, вводите адрес сервера москита и соединяетесь,ну и на этом все, можете наслаждатьсяconnect(AMS_name)вместо connect(AMS_name, Mlogin, Mpass))
Надеюсь было интересно, если что то непонятно, пишите.
это который?Да и как взаимодействует скетч поддержки majordomo который изначально закомментирован?