Update 2011-09-28 This post only applies to Mosquitto v0.12. From v0.13, the ctypes extraction is done by mosquitto itself, and the msg.payload is a proper python string. msg.payload_len and msg.payload_str disappear.
Prior to 0.12, mosquitto‘s python bindings converted the message payload to a string. This was very convenient, you defined a simple on_message
handler like so:
def on_message(msg): print "Received message on topic:%s, body: %s" % (msg.topic, msg.payload) |
This was all well and good, but if you were receiving binary data on a topic, you were out of luck. This has now been rectified, but it is a breaking change for people expecting string data. To keep interpreting the payload as a string, just use msg.payload_str
instead of msg.payload
But, how about that binary data? If you don’t get this right first time, you might get quite confused about all the ctypes magic types that keep showing up, but it’s not really that difficult when you get it worked out.
def on_message(msg): print "Received message on topic %s, length: %d bytes" % (msg.topic, msg.payloadlen) print "As binary data (hex): ", for i in range(msg.payloadlen): print "%s " % (hex(msg.payload[i])), print "" print "As binary data (chars): ", for i in range(msg.payloadlen): print " %c " % (chr(msg.payload[i])), print "" print "As string data (msg.payload_str): %s" % (msg.payload_str) |
And, the output after sending a message witha \0
character in the middle:
Received message on topic test, length: 10 bytes As binary data (hex): 0x68 0x65 0x6c 0x6c 0x6f 0x0 0x6b 0x61 0x72 0x6c As binary data (chars): h e l l o k a r l As string data (msg.payload_str): hello |
There, not so hard now, and your code didn’t need to know anything about c types :)
Leave a Comment