Basics with MQTT

About

Existuje mnoho komunikačných protokolov umožňujúcich M2M komunikáciu. V prostredí IoT zariadení však našiel kvôli svojim vlastnostiam svoje využitie práve jeden protokol. MQTT. A dnes sa na neho pozrieme zblízka.

Goals

  • Porozumieť mechanizmu publish-subscribe.
  • Porozumieť základnej terminológii z oblasti MQTT.
  • Naučiť sa pracovať s protokolom MQTT z príkazového riadku.
  • Naučiť sa základom práce s protokolom MQTT v jazyku Python.

Content

Step 1: Prepare Your Environment

Ešte pred samotnou prácou skontroluj, či máš prichystané a pripravené všetko potrebné.

Úloha 1.1

Overte, či máte pre potreby cvičenia pripravené všetky potrebné komponenty.

Na toto cvičenie budete potrebovať: * Raspberry Pi * kontaktné pole * prepojovacie vodiče * tlačidlo, LED diódu, 220 óhmový odpor, bzučiak * editor Mu alebo Thonny

Step 2: Topics and Messages

Pre prácu s protokolom MQTT budeme používať broker Mosquitto.

Úloha 2.1

Do svojho systému si nainštalujte balík mosquitto-clients.

Ak používate Raspbian resp. distribúcie postavené na distribúcii Debian, do príkazového riadku napíšte:

sudo apt install mosquitto-clients

Ak používate distribúciu Fedora, tak napíšte:

sudo dnf install mosquitto-clients

Úloha 2.2

Pomocou príkazu mosquitto_pub odošlite správu Hello world! do témy messages.

Príkaz mosquitto_pub má niekoľko parametrov (viď man mosquitto_pub):

  • -h - špecifikuje adresu MQTT broker-a
  • -t - špecifikuje tému, do ktorej má byť správa odoslaná
  • -m - špecifikuje samotnú správu

Úloha 2.3

Pomocou príkazu mosquitto_sub sa prihláste na odber správ z témy messages.

Príkaz mosquitto_sub má niekoľko parametrov (viď man mosquitto_sub):

  • -h - špecifikuje adresu MQTT broker-a
  • -t - špecifikuje tému, do ktorej má byť správa odoslaná

Správy do témy si posielajte pomocou príkazu mosquitto_pub. Vyskúšajte, čo sa stane, ak pošlete správu do inej témy, ako je téma messages.

Step 3: MQTT with Python

Tentokrát sa pozrieme na prácu s MQTT v jazyku Python.

Úloha 3.1

Nainštalujte si balík paho-mqtt poskytujúci modul pre komunikáciu s Mosquitto broker-om.

Inštaláciu vykonáte pomocou príkazu:

pip3 install paho-mqtt

Poznámka: Ak tento príkaz spustíte vo svojom systéme, budete potrebovať aj práva superpoužívateľa (sudo). Ak však len vo virtuálnom prostredí (virtualenv), superpoužívateľom byť nemusíte.

Úloha 3.3

Vytvorte v jazyku Python program, pomocou ktorého pošlete do témy messages správu Hello world!.

Riešenie môže vyzerať napríklad takto:

import paho.mqtt.client as mqtt

client = mqtt.Client()
# port is not mandatory
client.connect('10.20.30.40', port=1883)

client.publish('general', 'Hello world!')

Úloha 3.4

V jazyku Python vytvorte program, pomocou ktorého sa prihlásite na odber správ z témy messages.

Riešenie môže vyzerať napr. takto:

import paho.mqtt.client as mqtt
from time import sleep

def on_message(client, userdata, message):
    text = str(message.payload.decode("utf-8"))
    print(f'Received message "{text}" in topic "{message.topic}"')

if __name__ == '__main__':
    client = mqtt.Client()
    client.connect('10.20.30.40', port=1883)
    client.subscribe('messages')
    client.on_message = on_message

    client.loop_start()  # non blocking call
    # or client.loop_forever() - blocking call (no need the rest of code)

    while True:
        # your job goes here
        sleep(1)

    client.loop_stop()

Step 4: Smart Home Environment

Tentokrát si vytvoríte jednoduchú inteligentnú domácnosť, v ktorej budú zariadenia medzi sebou komunikovať pomocou protokolu MQTT. Miestnosti budú reprezentované vašimi stolmi (napr. obývačka, chodba, spálňa, kuchyňa). Do týchto miestností vytvoríte jednoduchú sadu akčných členov (napr. svetlo, bzučiak) a inštalujete tam jednoduché senzory (napr. tlačidlo). Následne si zostavíte schému tém pre domácnosť (napr. home/kitchen/light) a zabezpečíte, aby jednotlivé senzory publikovali informácie do príslušných kanálov, a aby boli akčné členy ovládateľné na základe prichádzajúcich správ.

Úloha 4.1

Vytvorte jednoduchý scenár inteligentnej domácnosti spolupracujúci s vašimi komponentmi.

Vytvorte napríklad zabezpečene domácnosti, ktorá v prípade, že je domácnosť zamknutá (stav v brokeri reprezentovaný hodnotou locked v príslušnej téme) a dôjde k detekcii otvorenia dverí (napr. zapnutím tlačidla), dôjde k rozsvieteniu všetkých svetiel a pípaniu vo všetkých miestnostiach.

Aby sme vedeli takúto situáciu simulovať, pripojíme k našim Raspberry Pi príslušné súčiastky, ako LED diódy, tlačidlá a bzučiaky. Pre správne použitie pinov sa riaďte nasledujúcimi schémami.

Označenie pinov
Schéma zapojenia Raspberry Pi - miesto tlačidiel môžete použiť LED diódy alebo bzučiaky

Zapojte súčiastky do vášho Raspberry Pi podľa vami vymysleného scenára.

Úloha 4.2

Použitie jednotlivých súčiastok zrealizujte vo vašich Python programoch tak, aby tlačidlá posielali mqtt správy na určenú tému (topic) a LED diódy či bzučiaky reagovali na prichádzajúce mqtt správy určenej témy (topicu).

Použitie súčiastok implementujete napríklad takto:

from gpiozero import Button, LED, Buzzer

button = Button(17)
led = LED(27)
buzzer = Buzzer(22)

Reagovanie na tlačidlo a rozsvietenie diódy môžete implementovať takto:

if button.is_pressed == True:
    led.on()

Vaše programy upravte tak, aby čo najlepšie simulovalo prostredie scenára, ktorý ste si vymysleli. Napríklad tlačidlá v kuchyni budú posielať mqtt správy na tému kitchen/switch a LED dióda v kuchyni bude ragovať na správu s textom ZAPNI na rovnakú tému.

Step 5: Clean Your Environment

Po skončení uveďte svoje pracovisko do pôvodného stavu.

Úloha 5.1

Zmažte z disku svoje riešenie vytvorené v editore.

Úloha 5.2

Rozpojte zapojenie a uložte jeho súčasti na pôvodné miesto.

Additional Tasks

Additional Sources