Issue publishing via mqtt
-
I seem to narrow down the issues I have with the mqtt lib that I found here;
https://github.com/pycom/pycom-libraries/blob/master/examples/mqtt/mqtt.py
I am now able to connect and also publish messages, currently to adafruit io every two seconds. The problem with the subscription remains, I would hope someone has a clue.
My current subscribe method looks liek this
def subscribe(self, topic, qos=0): assert self.cb is not None, "Subscribe callback is not set" pkt = bytearray(b"\x82\0\0\0") self.pid += 1 struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid) #print(hex(len(pkt)), hexlify(pkt, ":")) self.sock.write(pkt) self._send_str(topic) self.sock.write(qos.to_bytes(1, sys.byteorder)) while 1: op = self.wait_msg() if op == 0x90: resp = self.sock.read(4) #print(resp) assert resp[1] == pkt[2] and resp[2] == pkt[3] if resp[3] == 0x80: raise MQTTException(resp[3]) return
I had to import sys and change the line
self.sock.write(qos.to_bytes(1))
to
self.sock.write(qos.to_bytes(1, sys.byteorder))
I otherwise cannot call the qos.to_bytes method as it expects the byteorder on the micropython lopy that I have. Unfortunately I cannot see messages that I send to the topic - I've verified that messages are sent using another mqtt client that subscribed.
Can anyone help? What is the correct code for subscribing?
thx
Sven
-
You have to set a callback to the subscribe, in easier words, the subscribe function need to know what to do with the msg it will get back from the server.
so you have to write a callback function before start using the subscribe function.
The correct code for subscribing should be like that:
from time import sleep from umqtt.simple import MQTTClient CLIENT_ID = 'Board_Name' #name your board any name you want SERVER = 'm13.cloudmqtt.com' #info from servce provider Port=14250 #info from servce provider User='kaeugs' #info from servce provider Password='Euif_Ehf674qi' #info from servce provider def sub_cb(topic, msg): #the action you want to happen, when you receive a msg print((topic, msg)) client = MQTTClient(CLIENT_ID, SERVER, Port, User, Password) client.connect() # Connect to MQTT broker while True: client.set_callback(sub_cb) #callback function client.subscribe(b'Proportional') #b'Proportional is just a topic sleep(2)
following this code, you should be able to subscribe to a topic and print the msg in the python console.
A very helpful examples could be found here, take care these examples is for Micropython on
esp8266, but the main idea is the same
https://github.com/micropython/micropython-lib/blob/mqtt/umqtt.simple/example_pubsub.py
https://github.com/micropython/micropython-lib/blob/mqtt/umqtt.simple/example_sub.py
https://github.com/micropython/micropython-lib/blob/mqtt/umqtt.simple/example_sub_led.py