Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

51 řádky
1.9 KiB

  1. import os
  2. import time
  3. import paho.mqtt.client as mqtt
  4. class MqttSubscriber:
  5. def __init__(self, host: str, port: int, topic: str, protocol: str = "mqttv311",
  6. client_id: str = "ble-ai-localizer", keepalive: int = 60,
  7. username: str = "", password: str = "", qos: int = 0):
  8. self.host = host
  9. self.port = port
  10. self.topic = topic
  11. self.keepalive = keepalive
  12. self.qos = qos
  13. # protocol mapping
  14. proto_map = {
  15. "mqttv311": mqtt.MQTTv311,
  16. "mqttv31": mqtt.MQTTv31,
  17. "mqttv5": mqtt.MQTTv5,
  18. }
  19. proto = proto_map.get((protocol or "mqttv311").lower(), mqtt.MQTTv311)
  20. self.client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=client_id, protocol=proto)
  21. if username:
  22. self.client.username_pw_set(username=username, password=password if password else None)
  23. self.client.on_connect = self._on_connect
  24. self.client.on_disconnect = self._on_disconnect
  25. # callback utente (topic, payload_bytes)
  26. self.on_message_user = None
  27. self.client.on_message = self._on_message
  28. def _on_connect(self, client, userdata, flags, reason_code, properties=None):
  29. # subscribe
  30. client.subscribe(self.topic, qos=self.qos)
  31. print(f"MQTT connected rc={reason_code}, subscribed to {self.topic}", flush=True)
  32. def _on_disconnect(self, client, userdata, reason_code, properties=None):
  33. print(f"MQTT disconnected rc={reason_code}", flush=True)
  34. def _on_message(self, client, userdata, msg):
  35. if self.on_message_user:
  36. self.on_message_user(msg.topic, msg.payload)
  37. def start_forever(self):
  38. # reconnect loop gestito da loop_forever
  39. self.client.connect(self.host, self.port, self.keepalive)
  40. self.client.loop_forever(retry_first_connection=True)