MQTT cannot subscribe to adafruit



  • I have tried out the MQTT example with IO Adafruit platform following this example
    https://www.hackster.io/bucknalla/mqtt-micropython-044e77
    and the code I used is from Github.

    I managed to publish and I can see the changes of the button at Adafruit but I cannot subscribe. I want to control the led at lopy to switch on and off at Adafruit.

    the coding for mqtt.py follow exactly same as the code in github, sometimes I get the error "subscribe callback is not set"

    mqtt.py

    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, "little"))
            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
    

    main.py coding from alex's corner
    https://www.youtube.com/watch?v=3NDPSbr5J14&t=997s

    def settimeout(duration): 
       pass
    
    def sub_cb(topic, msg): 
       print(msg)
    
    client = MQTTClient(client_id="xxx", server="io.adafruit.com",user="xxx",
    password="xxx", port=1883) 
    client.settimeout=settimeout
    client.set_callback(sub_cb)
    
    client.connect()
    print("connected to broker\n")
    client.publish(topic="vickyho/feeds/lights",msg="False")
    print("Published!")
    time.sleep(10)
    client.subscribe(topic="vickyho/feeds/lights")
    print("Subscribed!")
    
    while True:
         client.check_msg()
         if client.subscribe(topic="vickyho/feeds/digital",msg="ON")  
              pycom.rgbled(0xff00)
              print("Led ON")
              time.sleep(3)
    
         if client.subscribe(topic="vickyho/feeds/digital",msg="OFF")
              pycom.heartbeat(False)  
              pycom.rgbled(0x0000)
              print("Led OFF")
              time.sleep(3)
    
    

    here is the error:

      File "main.py", line 40
    SyntaxError: invalid syntax
    

    line 40 is at pycom.rgbled(0xff00)

    Can anyone help? Im new to python language so I dont know how to code. Thanks!



  • @seb Hi sorry seb, because the upper part is only wifi configuration so i didnt show it.

    Here is the whole main.py

    from network import WLAN
    from mqtt import MQTTClient
    import machine
    import time
    import pycom
    
    #from machine import Pin
    #pin=Pin('P10',mode=Pin.IN, pull=Pin.PULL_UP)
    
    wlan = WLAN(mode=WLAN.STA)
    wlan.antenna(WLAN.EXT_ANT)
    wlan.connect("xxx", auth=(WLAN.WPA2, "xxx"), timeout=5000)
    
    while not wlan.isconnected(): 
         machine.idle()
    print("Connected to Wifi\n")
    
    def settimeout(duration): 
       pass
    
    def sub_cb(topic, msg): 
       print(msg)
    
    client = MQTTClient(client_id="xxx", server="io.adafruit.com",user="vickyho",
                        password="xxx", port=1883) 
    client.settimeout=settimeout
    client.set_callback(sub_cb)
    
    client.connect()
    print("connected to broker\n")
    client.publish(topic="vickyho/feeds/lights",msg="False")
    print("Published!")
    time.sleep(10)
    client.subscribe(topic="vickyho/feeds/lights")
    print("Subscribed!")
    
    while True:
         client.check_msg()
         if client.subscribe(topic="vickyho/feeds/digital",msg="ON")  
              pycom.rgbled(0xff00)
              print("Led ON")
              time.sleep(3)
    
         if client.subscribe(topic="vickyho/feeds/digital",msg="OFF")
              pycom.heartbeat(False)  
              pycom.rgbled(0x0000)
              print("Led OFF")
              time.sleep(3)
    

    thanks for your reply btw!



  • @vicky_

    The main.py code you posted above is only 31 lines line



Pycom on Twitter