A weapons grade MQTT packet encoder and decoder (codec).
The mqtt-codec package is an MQTT 3.1.1 packet encoder and decoder (codec). The library has high test coverage (~94%) and is known to perform well in distributed IoT networks with thousands of nodes.
The mqtt-codec package can be from pypi.org with pip:
pip install mqtt-codec
An encode/decode cycle looks like this:
>>> from io import BytesIO
>>> from binascii import b2a_hex
>>> import mqtt_codec.packet
>>> import mqtt_codec.io
>>>
>>> # Encode a Connect packet
>>> will = mqtt_codec.packet.MqttWill(qos=0, topic='hello', message='message', retain=True)
>>> connect = mqtt_codec.packet.MqttConnect(client_id='client_id', clean_session=False, keep_alive=0, will=will)
>>> with BytesIO() as f:
... num_bytes_written = connect.encode(f)
... buf = f.getvalue()
...
>>> assert len(buf) == num_bytes_written
>>> print('0x{} ({} bytes)'.format(b2a_hex(buf), len(buf)))
0x102500044d515454042400000009636c69656e745f6964000568656c6c6f00076d657373616765 (39 bytes)
>>>
>>> # Decode the connect packet and assert equality.
>>> with mqtt_codec.io.BytesReader(buf) as f:
... num_bytes_read, decoded_connect = connect.decode(f)
...
>>> assert len(buf) == num_bytes_written
>>> assert connect == decoded_connect
>>> print(' Encoded {}'.format(connect))
Encoded MqttConnect(client_id='client_id', clean_session=False, keep_alive=0, username=***, password=***, will=MqttWill(topic=hello, payload=0x6d657373616765, retain=True, qos=0))
>>> print('= Decoded {}'.format(decoded_connect))
= Decoded MqttConnect(client_id=u'client_id', clean_session=False, keep_alive=0, username=***, password=***, will=MqttWill(topic=hello, payload=0x6d657373616765, retain=True, qos=0))
The mqtt-codec
project has been tested on Linux against these
environments:
- Python 2.7
- Python 3.4
- Python 3.5
- Python 3.6
- Python 3.7
Python versions Python 3.0 - 3.3 may work but are not tested as part of the project continuous integration infrastructure.
When running Python versions less than 3.4 the enum34
package is
required. There are no other package requirements.
The project is coordinated through public infrastructure available at several places: