Skip to content

Instantly share code, notes, and snippets.

@roger-
Created December 24, 2020 20:04
Show Gist options
  • Save roger-/5bb914fb528495a0e9f53265e85dd3f9 to your computer and use it in GitHub Desktop.
Save roger-/5bb914fb528495a0e9f53265e85dd3f9 to your computer and use it in GitHub Desktop.
Redirect messages from one MQTT server to another
import sys
import time
import re
import paho.mqtt.client as mqtt
regex_address = re.compile(r'(?:(?P<username>.+):(?P<password>.+)@)?(?P<address>[\w.]+)(?::(?P<port>[0-9]+))?')
def on_message(client_src, userdata, message):
client_dest, topic_root = userdata
client_dest.publish(topic_root + message.topic, message.payload, message.qos, message.retain)
def connect_client(client, address):
params = regex_address.match(address).groupdict()
client.connect(params['address'], int(params['port']) if params['port'] else 1883)
if params['username']:
client.username_pw_set(params['username'], params['password'])
def redirect(broker_src_address, broker_dest_address, topic_root=''):
client_dest = mqtt.Client('Redirector destination')
client_src = mqtt.Client('Redirector source', userdata=(client_dest, topic_root))
connect_client(client_src, broker_src_address)
connect_client(client_dest, broker_dest_address)
client_src.subscribe('#')
client_src.on_message = on_message
client_src.loop_start()
client_dest.loop_forever()
if __name__ == '__main__':
if len(sys.argv) < 3:
print(f'usage: {sys.argv[0]} <src addr> <dest addr> [<topic root>]')
sys.exit(0)
if len(sys.argv) == 3:
redirect(sys.argv[1], sys.argv[2])
else:
redirect(sys.argv[1], sys.argv[2], sys.argv[3])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment