I’ve got a project in mind and I want to put a bit of pub/sub in it. It’s an “Internet of Things” (IOT) project and the idea is that my devices will be pretty simple – i’ll just publish some values from a sensor to my broker; and do the heavy lifting of analysing and acting on the readings using a “real” computer or server. The devices will be simple and low-powered so a lightweight protocol like MQTT seems like a good choice.
It looks like the premier open source broker for MQTT is Mosquitto; so let’s use that to get a broker up and running; publish some messages to it; and have a subscriber log those messages out to the console. This, by the way; is all going to be on Debian Jessie.
I don’t like to “pollute” my laptop with every hobby project that momentarily grabs my attention; so first let’s get docker installed and then start up the toke/mosquitto container.
sudo apt-get install docker.io sudo docker run -ti -p 1883:1883 -p 9001:9001 toke/mosquitto
Next we’ll run up a couple of python scripts in a virtualenv: (I assume you’ve already done a apt-get virtualenv
to install virtualenv and Python on your system) These will, respectively; publish messages to the broker (under a test
topic) and subscribe to that topic.
mkdir mqtt-test cd mqtt-test virtualenv env source env/bin/activate pip install paho-mqtt
publisher.py
#!/usr/bin/env python import time import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client = mqtt.Client() client.on_connect = on_connect print("I'm alive!") client.connect("localhost", 1883, 60) while True: client.publish("test", "This is a test transmission!") time.sleep(1)
subscriber.py
#!/usr/bin/env python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("test") def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message print("I'm alive!") client.connect("localhost", 1883, 60) client.loop_forever()
Don’t forget to chmod +x *.py
and then you can ./publisher.py
and ./subscriber.py
in two separate consoles to see your dockerised MQTT broker in action. Now I just need to wait for my devices to be delivered and I can get to the interesting bit!