Měření a ukládání dat v cloudu (2.)

  1. Měříme a získáváme měřené údaje
  2. Odesíláme údaje a sbíráme v cloudu
  3. Sebraná data ukládáme do databáze
  4. 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).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *