mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-09 07:28:03 +01:00
Prozessabbildübertragung per MQTT begonnen
This commit is contained in:
129
revpipyload/mqttserver.py
Normal file
129
revpipyload/mqttserver.py
Normal file
@@ -0,0 +1,129 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# RevPiPyLoad
|
||||
#
|
||||
# Webpage: https://revpimodio.org/revpipyplc/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
"""Stellt die MQTT Uebertragung fuer IoT-Zwecke bereit."""
|
||||
import proginit
|
||||
from ssl import CERT_NONE
|
||||
from paho.mqtt.client import Client
|
||||
from threading import Thread, Event
|
||||
|
||||
|
||||
class MqttServer(Thread):
|
||||
|
||||
"""Server fuer die Uebertragung des Prozessabbilds per MQTT."""
|
||||
|
||||
def __init__(
|
||||
self, basetopic, sendinterval, host, port=1883,
|
||||
tls_set=False, username="", password=None, client_id=""):
|
||||
"""Init MqttServer class.
|
||||
|
||||
@param basetopic Basis-Topic fuer Datenaustausch
|
||||
@param sendinterval Prozessabbild alle n Sekunden senden
|
||||
@param host Adresse <class 'str'> des MQTT-Servers
|
||||
@param port Portnummer <class 'int'> des MQTT-Servers
|
||||
@param keepalive MQTT Ping bei leerlauf
|
||||
@param tls_set TLS fuer Verbindung zum MQTT-Server verwenden
|
||||
@param username Optional Benutzername fuer MQTT-Server
|
||||
@param password Optional Password fuer MQTT-Server
|
||||
@param client_id MQTT ClientID, wenn leer automatisch random erzeugung
|
||||
|
||||
"""
|
||||
# TODO: Parameterprüfung
|
||||
|
||||
super().__init__()
|
||||
|
||||
# Klassenvariablen
|
||||
self.__exit = False
|
||||
self._evt_data = Event()
|
||||
self._sendinterval = sendinterval
|
||||
self._host = host
|
||||
self._port = port
|
||||
|
||||
# Topics konfigurieren
|
||||
self._mqtt_picontrol = "{}/picontrol".format(basetopic)
|
||||
self._mqtt_pictory = "{}/pictory".format(basetopic)
|
||||
self._mqtt_sendpictory = "{}/needpictory".format(basetopic)
|
||||
|
||||
self._mq = Client(client_id)
|
||||
if username != "":
|
||||
self._mq.username_pw_set(username, password)
|
||||
if tls_set:
|
||||
self._mq.tls_set(cert_reqs=CERT_NONE)
|
||||
self._mq.tls_insecure_set(True)
|
||||
|
||||
# Handler konfigurieren
|
||||
self._mq.on_connect = self._on_connect
|
||||
self._mq.on_message = self._on_message
|
||||
# TODO: self._mq.on_disconnect = self._on_disconnect
|
||||
|
||||
def _on_connect(self, client, userdata, flags, rc):
|
||||
"""Verbindung zu MQTT Broker."""
|
||||
print("Connect rc:", rc)
|
||||
if rc > 0:
|
||||
self.__mqttend = True
|
||||
raise RuntimeError("can not connect to mqtt server")
|
||||
|
||||
# Subscribe piCtory Anforderung
|
||||
client.subscribe(self._mqtt_sendpictory)
|
||||
|
||||
def _on_message(self, client, userdata, msg):
|
||||
"""Sendet piCtory Konfiguration."""
|
||||
|
||||
with open(proginit.pargs.configrsc, "rb") as fh:
|
||||
client.publish(self._mqtt_pictory, fh.read())
|
||||
|
||||
# Prozessabbild senden
|
||||
self._evt_data.set()
|
||||
|
||||
def newlogfile(self):
|
||||
"""Konfiguriert die FileHandler auf neue Logdatei."""
|
||||
pass
|
||||
|
||||
def run(self):
|
||||
"""Startet die Uebertragung per MQTT."""
|
||||
proginit.logger.debug("enter MqttServer.start()")
|
||||
|
||||
# Prozessabbild öffnen
|
||||
try:
|
||||
fh_proc = open(proginit.pargs.procimg, "r+b", 0)
|
||||
except:
|
||||
fh_proc = None
|
||||
self.__exit = True
|
||||
proginit.logger.error(
|
||||
"can not open process image {}".format(proginit.pargs.procimg)
|
||||
)
|
||||
|
||||
# MQTT verbinden
|
||||
self._mq.connect(self._host, self._port, keepalive=60)
|
||||
self._mq.loop_start()
|
||||
|
||||
# mainloop
|
||||
while not self.__exit:
|
||||
self._evt_data.clear()
|
||||
|
||||
# FIXME: Ganzes Prozessabbild übertragen
|
||||
self._mq.publish(self._mqtt_picontrol, fh_proc.read(4096))
|
||||
fh_proc.seek(0)
|
||||
|
||||
self._evt_data.wait(self._sendinterval)
|
||||
|
||||
# MQTT trennen
|
||||
self._mq.loop_stop()
|
||||
self._mq.disconnect()
|
||||
|
||||
# FileHandler schließen
|
||||
if fh_proc is not None:
|
||||
fh_proc.close()
|
||||
|
||||
proginit.logger.debug("leave MqttServer.start()")
|
||||
|
||||
def stop(self):
|
||||
"""Stoppt die Uebertragung per MQTT."""
|
||||
proginit.logger.debug("enter MqttServer.stop()")
|
||||
self.__exit = True
|
||||
self._evt_data.set()
|
||||
proginit.logger.debug("leave MqttServer.stop()")
|
||||
Reference in New Issue
Block a user