- Měříme a získáváme měřené údaje
- Odesíláme údaje a sbíráme v cloudu
- Sebraná data ukládáme do databáze
- Data z databáze zpracujeme, zobrazíme a analyzujeme
V předchozím díle jsme si ukázali, jak měřit a sbírat údaje. Nyní plynule navážeme a představíme si jak údaje odesílat k dalšímu zpracování.
2. Odesílání dat protokolem MQTT
Je několik možností co dělat s naměřenými hodnotami. Budeme se zabývat pouze dvěma, a to odesláním na vlastní MQTT broker, který poběží na nějakém našem počítači a použitím MQTT brokeru v cloudu, abychom se o jeho provoz nemuseli starat. MQTT broker přijímá data a rozesílá přihlášeným odběratelům. Podrobnosti viz Co je MQTT na webu RoboDoupě.
2.1 Vlastní MQTT broker – Eclipse Mosquitto™
Mosquitto můžeme stáhnout a nainstalovat podle návodu z webu https://mosquitto.org/, a nebo ve většině distribucích Linuxu je k dispozici balíček pro jednoduchou instalaci:
$ apt install mosquitto
Po instalaci je nutné upravit základní konfiguraci s nastavením uživatelů a jejich oprávnění v konfiguračních souborech v adresáři /etc/mosquitto.
Zapnutí samostatné konfigurace pro každý druh komunikace:
# soubor /etc/mosquitto/conf.d/default.conf per_listener_settings true
Konfigurace pro protokol MQTT – povolení anonymního připojení a definice souboru s přístupovými právy.
# soubor /etc/mosquitto/conf.d/mqtt.conf listener 1883 protocol mqtt allow_anonymous true acl_file /etc/mosquitto/acl-mqtt
Nastavení přístupových práv pro anonymy (číst vše pod tématem mereni/), uživatele mereni (čtení a zápis pod tématem mereni/) a pro ostatní uživatele:
# soubor /etc/mosquitto/acl-mqtt topic read mereni/# user mereni topic mereni/# pattern write $SYS/broker/connection/%c/state
Konfigurace pro protokol Websocket:
# soubor /etc/mosquitto/conf.d/websocket.conf listener 9001 protocol websockets allow_anonymous true acl_file /etc/mosquitto/acl-websocket password_file /etc/mosquitto/mosq_passwd
Definice oprávnění uživatelů přistupujících přes protokol Websocket (na začátku čtení pro anonymy a zápis pro ostatní uživatele):
# soubor /etc/mosquitto/acl-websocket topic read $SYS/# topic read mereni/# pattern readwrite house/%c/#
Uložení hesel uživatelů programem mosquitto_passwd
:
$ mosquitto_passwd -H sha512-pbkdf2 -b /etc/mosquitto/mosq_passwd uzivatel heslo
2.2 MQTT broker v cloudu – HiveMQ Cloud
HiveMQ provozuje veřejný MQTT broker nebo po registraci lze využít službu MQTT Cloud Broker v základní variantě zdarma (do 100 připojených klientů a 10 GB dat měsíčně, uchování dat 3 dny). Založení služby nabízí u poskytovatele AWS v Irsku a Azure ve Frankfurtu n.M.
Použití je velmi jednoduché – potřebné přihlašovací údaje jsou přehledně uvedeny na jedné stránce a je možné vytvořit několik různých uživatelů u kterých ale bohužel nelze omezit oprávnění. Nechybí podrobná nápověda jak službu použít z různých klientů a programovacích jazyků.
2.3 Odeslání a příjem datových zpráv MQTT
2.3.1 Programy mosquitto_pub
a mosquitto_sub
Na spoustě Linuxových distribucí jsou v balíčku mosquitto-clients
.
$ apt install mosquitto-clients
Odeslání zprávy na MQTT broker do tématu mereni/teplota:
$ mosquitto_pub -h adresa.mqtt.brokeru -p port -u uzivatel -P heslo -t "mereni/teplota" -m "28.5"
Přihlášení k odběru a zobrazení obsahu všech zpráv pod tématem mereni/:
$ mosquitto_sub -h adresa.mqtt.brokeru -p port -u uzivatel -P heslo -t "mereni/#" -v
2.3.2 V jazyce Python s použití knihovny Paho MQTT Client
Instalace v distribuci Linuxu nebo instalátorem balíčků Pythonu (v této ukázce pro Python 3):
$ apt install python3-paho-mqtt
$ pip3 install paho-mqtt
Skript mqtt-client
pro odesílání zpráv na MQTT broker (v tomto případě HiveMQ Cloud):
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import time
import sys
import re
broker = dict(
HOST = '42616269c5a14a655a6c6f64c49b6a.s2.eu.hivemq.cloud',
PORT = 8883,
USER = 'kralicek-itacek',
PASS = '***heslo***'
)
def on_connect(client, userdata, flags, rc):
if rc == 0:
print('Connected successfully ' + str(mqtt.connack_string(rc)))
else:
print('Connect returned result code: ' + str(rc) + ' ' + str(mqtt.connack_string(rc)))
def on_disconnect(client, obj, rc):
if rc == 0:
print('Disconnected')
else:
print('Unexpected disconnection code: ' + str(rc) + ' ' + str(mqtt.error_string(rc)))
def on_message(client, userdata, msg):
print('Received message: ' + str(msg.topic) + ' ' + str(msg.payload.decode('utf-8')))
def main():
client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message
client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
client.username_pw_set(broker['USER'], broker['PASS'])
x = client.connect(broker['HOST'], broker['PORT'], 60)
client.loop_start()
# client.subscribe("#") # debug
for line in sys.stdin:
m = re.match('(.*)=(.*)', line)
if m:
p = client.publish(m.group(1), payload=m.group(2))
p.wait_for_publish()
client.loop_stop()
time.sleep(2)
client.disconnect()
if __name__ == '__main__':
main()
Skript po spuštění očekává zadání dat v níže uvedeném formátu a po zadání znaku konce řádku (Enter na klávesnici) hodnoty odesílá jako zprávy na MQTT broker. Ukončuje se zadáním znaku konce souboru EOF (na klávesnici Ctrl+D).
jmeno/tematu/topic=hodnota # Příklad: mereni/doma/teplota1=24.44
Tento formát je ideální pro předávání dat získaných v předchozí kapitole tohoto seriálu.
$ sensors -u | awk '/_input:/ { gsub("_input:", ""); print "mereni/pocitac/" $1 "=" $2 }' | mqtt-client
Podrobnější informace ke zpracování a odesílání MQTT zpráv v Pythonu najdeme na webu MQTT and Python For Beginners (anglicky).