MQTT osa 1

Andmeside protokoll on tuntud nime MQTT all. See andmete vahetamise süsteem on hästi lihtne ja väikese mahuga – seega sobilik väikestele mikrokontrolleritele. Kuigi MQTT on mõeldud masinside jaoks, saab seda väga edukalt kasutada ka inimloetavate teadete vahetamiseks.

  • MQTT server on sõnumite vahendaja ja kasutajaõiguste haldaja.
  • MQTT klient jaguneb kaheks osaks – sõnumi kirjutaja ja sõnumi(te) lugeja. Tihti on mikrokontroller nii sõnumi kirjutajaks/saatjaks kui vastuvõtjaks samaaegselt. Kliendiks võib olla ka andmeid andmebaasi kirjutav programm või arvuti millega kontrollitakse süsteemi tööd.
  • Sõnumite saatmine ja lugemine on jagatud kanaliteks ehk teemadeks. Iga teema alla võib kuuluda veel mitu alamteemat ja nii saab väga täpselt automatiseerida sõnumite töötlust. Alamteemad on eraldatud kaldkriipsuga (/).

Ühte kanalisse võib andmeid kirjutada ja lugeda väga palju kliente. MQTT oskab kasutada krüpteeritud andmesidet.

Üks paljudest teemade lahendustest:

  • rohekool/andurid/1-klass/data – ESP32 saadab siia temepratuuri ja õhuniiskuse väärtused, andmebaas kuulab seda ja kirjutab andmed üles, mõõtmise ajaks märgitakse sõnumi saabumise aeg
  • rohekool/andurid/1-klass/status – ESP32 saadab siia kõikide päringute vastused (seotud järgmise teemaga), arendaja kuulab/logib seda ja analüüsib süsteemi tööd
  • rohekool/andurid/1-klass/conf – ESP32 kuulab seda teemat, täidab päringud ja kirjutab vastused eelmisesse teemasse, arendaja saadab siia ESP32 juhtimiseks vajalikud käsud

1. osa. Katsetame käsurealt

https://mosquitto.org/download/ saad alla laadida käsureal kasutamise paigalduskomplekti, see sisaldab ka MQTT serverit. Kooli arvutites saad kasutada aga valmiskomplekti, mida admin õigustes paigaldama ei pea. Selle leiad siit. Paki lahti (nt tööalauale), ava käsurida (Start -> trüki cmd ja vajuta Enter), liigu kausta (cd desktop, cd mosquitto).

Kui pole teisiti määratud, siis kasutatakse MQTT versiooni mqttv311.

mosquitto_sub on programm, mille abil liitud vastava teemaga ja jääd selle sisu kuulama. Saabunud sõnumid kuvatakse käsureale.

mosquitto_sub.exe -u kasutajanimi -P salasõna -h nuti.fi -t "rohekool/test1"

-u abil öeldakse kasutajatunnus

-P abil salasõna

-h abil öeldakse MQTT serveri aadress

-t abil teema jutumärkide vahel. Pane tähele! nuti.fi serveril saad kasutada ainult rohekool/ algusega teemasid. Alamteemadel piiranguid pole. Teema rohekool/# kuulab kõiki rohekool/ alamteemasid sõltumata nimest.

Klahvikombinatsioon Ctrl + C lõpetab programmi töö.

mosquitto_pub on programm, mille abil saadad vastavasse teemasse teate. Ava uus käsurea aken ja proovi.

mosquitto_pub.exe -u kasutajanimi -P salasõna -h nuti.fi -t "rohekool/test1" -m "Tere maailm!"

-m abil öeldakse sõnum jutumärkide vahel.

Leppige kokku üks teema nimi jagage seda ja saatke sinna sõnumeid. Tehke personaalsed teema ja jagage neid. Saatke üksteisele sõnumeid.

2. osa. Katsetme graafilise kasutajaliidesega

http://mqtt-explorer.com/ saab alla laadida kena graafilise kasutajaliidesega programmi, mis oskab ka andmetest diagramme luua.

Lisa uus server nupuga + Connections.

Name – Serverit ilmestav nimi. Vabalt valitav.

Protocol – mqtt://

Host – Serveri aadress.

Port – 1883 on vaikimisi port kui kasutatakse krüpteerimata ühendust

Username – Kasutajatunnus

Password – Salasõna

Save – Salvestab andmed

Connect – Ühendab serveriga

Advanced – Saad lisada teemad, lisa rohekool/test1, eemalda # kui ei taha näha kõiki alamteemasid.

3. osa. Lisame Arduino programmikoodi

Taas vajame vastavat programmiteeki. Nimega Async MQTT client. Seda ei leia Arduino programmiteekide kataloogist vaid tuleb eraldi alla tõmmata ja paigaldada. Selleks tõmba alla https://github.com/marvinroger/async-mqtt-client/archive/master.zip ja paki lahti. Tõsta lahti pakitud kaust async-mqtt-client-master Arduino IDE kausta libraries. Samuti vajad veel Async TCP, mille leiad https://github.com/me-no-dev/AsyncTCP/archive/master.zip. Sellega käitu samamoodi. Sulge Arduino ide ja käivita uuesti.

Sarnaselt eelnevalt õpitule tuleb teha lisaks:

#include <AsyncMqttClient.h> Lisab vastava programmiteeki meie koodi.

AsyncMqttClient mqttClient; Teeb objekti nimega mqttClient ja klassiga AsyncMqttClient.

setup() osas lisame:

mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer("mqtt serveri aadress", mqtt_serveri_port);
mqttClient.setCredentials("mqtt kasutajatunnus", "mqtt parool");

onConnect, onDisconnect, onPublish – sündmused vastavalt “siis kui mqtt serveriga ühendati”, “siis kui mqtt serveriga ühendus katkes”, “siis kui sõnum saadeti välja” mis omakorda kutsuvad välja või käivitavad vastavad funktsioonid onMqttConnect, onMqttDisconnect ja onMqttPublish.

setServer – häälestab ESP32 ühenduse mqtt serveriga ega veel ühendustg ei loo.

setCredentials – häälestab mqtt kasutajatunnuse ja parooli.

Millal MQTT serveriga ühendus luua? Siis kui ESP32 on saanud WiFi tugijaamalt IP-aadressi.

mqttClient.connect(); Loob ühenduse mqtt serveriga.

Millal MQTT serveriga ühendus katkestada? Siis kui WiFi ühendus katkeb.

mqttClient.disconnect(true); Katkestab jõuga (argument true) ühenduse. Jõuga seepärast, et kui WiFi ühendus on ära katkenud siis ei saa serverile teada anda oma lahtiühendamise soovist.

Funktsioonid, mida sündmus välja kutsub:

void onMqttConnect(bool sessionPresent) {
  Serial.print("Ühendus MQTT serveriga loodud: ");
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
  Serial.println("Ühendus MQTT serveriga katkes.");
}

void onMqttPublish(uint16_t packetId) {
  Serial.print("Sõnum saadetud. Sõnumi ID: ");
  Serial.println(packetId);
}

loop() osas muudame:

5 sekundit on liiga lühe aeg ja koormab mqtt serverit liigse infoga. Mõistlik oleks andmed mõõta ja saata iga minuti järel. Mitu millisekundit on ühes minutis?

if (mqttClient.connected()) {
  mqttClient.publish("rohekool/andur1/data", 1, false, String("Temp: "+TEMP+", Humi: "+HUMI).c_str());
} else Serial.println("MQTT pole ühendatud! ");

connected() – Tagastab tõese või väära vastavalt sellele kas ühendus MQTT serveriga on loodud või mitte.

publish – Vajab nelja argumenti. 1. Teema; 2. Teate olulisuse aste (vaata lisaks https://www.ibm.com/docs/en/ibm-mq/8.0?topic=concepts-qualities-service-provided-by-mqtt-client); 3. Püsiteade (tõene = jah, väär = ei). Viimane selline teade selles teemas jääb serverile meelde ja see kuvatakse koheselt kliendile kes liitub selle teemaga. Sõltumata sellest millal selline teade teemasse saadeti; 4. Teade ise, c_str() teksti lõpus konverteerib selle spetsiaalseks C-stiilis String-iks mis on lõpetatud \0 märgisega.

Vaata lisaks https://randomnerdtutorials.com/esp32-mqtt-publish-ds18b20-temperature-arduino/.