First tests with micropython and MQTT.
On Ubuntu 17.04:
If we want to use our system as a MQTT broker, we need the mosquitto daemon. The mosquitto-clients package include commands to test publishing and subscribing from the command line:
sudo apt-get install mosquitto mosquitto-clients
To install micropython just follow instructions for Debian-based systems.
Then we need to install a MQTT library for micropython. Used ‘umqtt.simple‘:
./micropython -m upip install micropython-umqtt.simple
They have some examples, let’s test ‘example_pub.py‘:
from umqtt.simple import MQTTClient def main(server="localhost"): c = MQTTClient("umqtt_client", server) c.connect() c.publish(b"foo_topic", b"hello") c.disconnect() if __name__ == "__main__": main()
This example publish “hello” message to topic “foo_topic” on a broker on our localhost. If we have installed ‘mosquitto’, it is already started (at least on Ubuntu) so we just need to subscribe for messages under “foo_topic”:
mosquitto_sub -h localhost -t foo_topic
We can now run the example (on another terminal):
./micropython example_pub.py
and we should get:
hello
Now let’s use a public MQTT broker. There are several available but since we are already using mosquitto client we will also use mosquitto own public broker (i.e. ‘test.mosquitto.org‘).
Since it is a public broker, it has considerable traffic so we use a less general topic:
from umqtt.simple import MQTTClient SERVER='test.mosquitto.org' def main(server=SERVER): c = MQTTClient("umqtt_client", server) c.connect() print("Connected") c.publish(b"ev3dev_topic", b"Make my day!") c.disconnect() print("Sent") if __name__ == "__main__": main()
And we subscribe to it:
mosquitto_sub -h test.mosquitto.org -t ev3dev_topic
and it still works. It’s not instant messaging but it sure takes less than a second (please note that a public broker cannot assure 100% availability or performance; even it the service is available performance can be degraded if lots of publishers and subscribers are connected passing lots of messages).
Now let’s do the opposite – subscribe with micropython. We use another example, ‘example_sub.py’:
import time from umqtt.simple import MQTTClient # Publish test messages e.g. with: # mosquitto_pub -t foo_topic -m hello SERVER = "test.mosquitto.org" # Received messages from subscriptions will be delivered to this callback def sub_cb(topic, msg): print((topic, msg)) def main(server=SERVER"): c = MQTTClient("umqtt_client", server) c.set_callback(sub_cb) c.connect() c.subscribe(b"ev3dev_topic") while True: if True: # Blocking wait for message c.wait_msg() else: # Non-blocking wait for message c.check_msg() # Then need to sleep to avoid 100% CPU usage (in a real # app other useful actions would be performed instead) time.sleep(1) c.disconnect() if __name__ == "__main__": main()
For this script to run we also need ‘time’ library for micropython:
./micropython -m upip install micropython-time
So if we now publish something:
mosquitto_pub -h test.mosquitto.org -t ev3dev_topic -m Yahoo!
we’ll get:
$ ./micropython testsub.py (b'ev3dev_topic', b'Yahoo!')
Next: port this to ev3dev.
Now the first test: