58 lines
2.1 KiB
Python
58 lines
2.1 KiB
Python
import paho.mqtt.client as mqtt
|
|
import json
|
|
import time
|
|
from dotenv import dotenv_values
|
|
|
|
class MosquittoDynamicSecurity:
|
|
def __init__(self):
|
|
config = dotenv_values(".env")
|
|
self.broker_url = config["MQTT_HOST"]
|
|
self.broker_port = config["MQTT_PORT"]
|
|
self.broker_keepalive = config["MQTT_KEEPALIVE"]
|
|
self.user = config["MQTT_USER"]
|
|
self.password = config["MQTT_PASSWORD"]
|
|
self.topic = config["MQTT_DS_TOPIC"]
|
|
self.resp_topic = config["MQTT_DS_RESP_TOPIC"]
|
|
self.response = None
|
|
self.client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, protocol=mqtt.MQTTv5)
|
|
self.client.on_connect = self.on_connect
|
|
self.client.on_disconnect = self.on_disconnect
|
|
self.client.on_message = self.on_message
|
|
|
|
def on_disconnect(self, mqtt_client, obj, flags, rc, properties):
|
|
print('Disconnesso da Mosquitto con codice:', rc)
|
|
|
|
def on_connect(self, client, userdata, flags, rc, properties):
|
|
if rc == 0:
|
|
print("Connesso a Mosquitto con codice:", rc)
|
|
# Sottoscriviti al topic di risposta
|
|
client.subscribe(self.resp_topic)
|
|
else:
|
|
print("Errore di connessione a Mosquitto con codice:", rc)
|
|
|
|
def on_message(self, client, userdata, msg):
|
|
|
|
print('Response:', msg.payload.decode())
|
|
# Memorizza la risposta
|
|
self.response = msg.payload.decode()
|
|
|
|
def send_command(self, command):
|
|
# Pubblica il comando sul topic di controllo
|
|
self.client.username_pw_set(self.user, self.password)
|
|
self.client.connect(self.broker_url, int(self.broker_port), int(self.broker_keepalive))
|
|
self.client.loop_start()
|
|
time.sleep(0.2)
|
|
self.client.publish(self.topic, json.dumps(command))
|
|
|
|
# Attendi la risposta (timeout di 5 secondi)
|
|
start_time = time.time()
|
|
while self.response is None and time.time() - start_time < 5:
|
|
time.sleep(0.2)
|
|
|
|
self.client.loop_stop()
|
|
self.client.disconnect()
|
|
|
|
if self.response:
|
|
return json.loads(self.response)
|
|
else:
|
|
return {"error": "Timeout: nessuna risposta da Mosquitto"} |