First sort of working mqtt routines
This commit is contained in:
132
software/test_software/mqtt_control.py
Normal file
132
software/test_software/mqtt_control.py
Normal file
@@ -0,0 +1,132 @@
|
||||
# NOTE: does not work, head exploded!
|
||||
import json
|
||||
import logging
|
||||
import random
|
||||
import time
|
||||
from paho.mqtt.client import Client
|
||||
from paho.mqtt.client import CallbackAPIVersion
|
||||
|
||||
BROKER = 'mqtt.meezenest.nl'
|
||||
PORT = 1883
|
||||
TOPIC = "python-mqtt/tcp"
|
||||
# generate client ID with pub prefix randomly
|
||||
CLIENT_ID = f'python-mqtt-tcp-pub-sub-{random.randint(0, 1000)}'
|
||||
USERNAME = 'emqx'
|
||||
PASSWORD = 'public'
|
||||
|
||||
FIRST_RECONNECT_DELAY = 1
|
||||
RECONNECT_RATE = 2
|
||||
MAX_RECONNECT_COUNT = 12
|
||||
MAX_RECONNECT_DELAY = 60
|
||||
|
||||
FLAG_EXIT = False
|
||||
|
||||
class MqttController(object):
|
||||
|
||||
def __init__(self, config: dict, message_processor=None):
|
||||
self.config = config
|
||||
|
||||
self.client = Client(
|
||||
client_id=self.config['mqtt_client'],
|
||||
clean_session=self.config['mqtt_clean_session'],
|
||||
userdata={"client": self.config['mqtt_client']},
|
||||
)
|
||||
|
||||
self.client.username_pw_set(self.config['mqtt_username'], self.config['mqtt_password'])
|
||||
|
||||
if self.config['mqtt_debug']:
|
||||
self.client.on_log = self._on_log
|
||||
|
||||
self.client.on_connect = self._on_connect
|
||||
#self.client.on_subscribe = self._on_subscribe
|
||||
self.client.on_message = self._on_message
|
||||
#self.client.on_publish = self._on_publish
|
||||
self.client.on_disconnect = self._on_disconnect
|
||||
|
||||
self.client.connect(self.config['mqtt_host'], self.config['mqtt_port'], 60)
|
||||
|
||||
if message_processor:
|
||||
self.message_processor = message_processor
|
||||
|
||||
def _on_connect(self, client, userdata, flags, rc, properties):
|
||||
if rc == 0 and self.client.is_connected():
|
||||
print("Connected to MQTT Broker!")
|
||||
self.client.subscribe(TOPIC)
|
||||
else:
|
||||
print(f'Failed to connect, return code {rc}')
|
||||
|
||||
|
||||
def _on_disconnect(self, client, userdata, rc):
|
||||
logging.info("Disconnected with result code: %s", rc)
|
||||
reconnect_count, reconnect_delay = 0, FIRST_RECONNECT_DELAY
|
||||
while reconnect_count < MAX_RECONNECT_COUNT:
|
||||
logging.info("Reconnecting in %d seconds...", reconnect_delay)
|
||||
time.sleep(reconnect_delay)
|
||||
|
||||
try:
|
||||
self.client.reconnect()
|
||||
logging.info("Reconnected successfully!")
|
||||
return
|
||||
except Exception as err:
|
||||
logging.error("%s. Reconnect failed. Retrying...", err)
|
||||
|
||||
reconnect_delay *= RECONNECT_RATE
|
||||
reconnect_delay = min(reconnect_delay, MAX_RECONNECT_DELAY)
|
||||
reconnect_count += 1
|
||||
logging.info("Reconnect failed after %s attempts. Exiting...", reconnect_count)
|
||||
global FLAG_EXIT
|
||||
FLAG_EXIT = True
|
||||
|
||||
def _on_message(self, client, userdata, msg):
|
||||
print(f'Received `{msg.payload.decode()}` from `{msg.topic}` topic')
|
||||
|
||||
def loop_start(self):
|
||||
self.client.loop_start()
|
||||
|
||||
def publish(self):
|
||||
msg_count = 0
|
||||
while not FLAG_EXIT:
|
||||
msg_dict = {
|
||||
'msg': msg_count
|
||||
}
|
||||
msg = json.dumps(msg_dict)
|
||||
if not self.client.is_connected():
|
||||
logging.error("publish: MQTT client is not connected!")
|
||||
time.sleep(1)
|
||||
continue
|
||||
result = self.client.publish(TOPIC, msg)
|
||||
# result: [0, 1]
|
||||
status = result[0]
|
||||
if status == 0:
|
||||
print(f'Send `{msg}` to topic `{TOPIC}`')
|
||||
else:
|
||||
print(f'Failed to send message to topic {TOPIC}')
|
||||
msg_count += 1
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
def run():
|
||||
mqtt_config = {
|
||||
"mqtt_client": "MeesElecronics",
|
||||
"mqtt_clean_session": "",
|
||||
"mqtt_username": "1964",
|
||||
"mqtt_password": "NoPasswd",
|
||||
"mqtt_debug": False,
|
||||
"mqtt_host": "mqtt.meezenest.nl",
|
||||
"mqtt_port": 1883
|
||||
}
|
||||
print(mqtt_config)
|
||||
logging.basicConfig(format='%(asctime)s - %(levelname)s: %(message)s',
|
||||
level=logging.DEBUG)
|
||||
client = MqttController(mqtt_config)
|
||||
client.loop_start()
|
||||
time.sleep(1)
|
||||
client.publish()
|
||||
#if client.is_connected():
|
||||
# publish()
|
||||
#else:
|
||||
# client.loop_stop()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
Reference in New Issue
Block a user