Simple MQTT Tutorial


  • Pybytes Beta

    I found the error. The port is wrong.
    It should be: 1883.
    Then connect is working.


  • Pybytes Beta

    @MrPy Are you sure those are you messages? I checked and somebody else was publishing these messages.


  • Pybytes Beta

    @vruizvil

    My code is as following:

    import time
    import machine
    from umqtt import MQTTClient

    def settimeout(duration): pass

    def connect():
    if machine.reset_cause() != machine.SOFT_RESET:
    client = MQTTClient("MyLoPy", "broker.mqttdashboard.com", port=8000)
    client.settimeout = settimeout
    client.connect()
    print('Connected MQTT Broker.')
    return client

    def send(client):
    while True:
    print("Sending ON")
    client.publish("/lopy", "ON")
    time.sleep(1)
    print("Sending OFF")
    client.publish("/lopy", "OFF")
    time.sleep(1)

    I do a connect() and the result is as following:

    client.connect()
    0xc b'10:12:00:04:4d:51:54:54:04:02:00:00'
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "umqtt.py", line 86, in connect
    IndexError: bytes index out of range

    Still going wrong. What could be the solution?



  • @gertjanvanhethof Hi!, try with machine.reset(), then try your code one more time, you need only one client socket, when you try few times the code, I think the socket doesn't work fine. That is the way to solve the same problem in my tests, but I don't know the reason.


  • Pybytes Beta

    @MainSheet I'am not able to connect.
    What do I wrong?

    In my main.py I setup the wifi connection successfully.
    I checked that by doing an http get call and I was able to get HTML data from a website. So internet connection is working.

    I went to: http://www.hivemq.com/demos/websocket-client/

    And created a connection with the following details:

    Host: broker.hivemq.com
    Port: 8000
    ClientID: MyLoPy

    I created a subscription and tested some messages. All works.

    Then I typed the following commands on my LoPy:

    MicroPython v1.8.6-40-gd10463e on 2016-11-25; LoPy with ESP32
    Type "help()" for more information.

    from umqtt import MQTTClient
    def settimeout(duration): pass
    ...

    client = MQTTClient("MyLoPy", "broker.hivemq.com", port=8000)
    client.settimeout = settimeout
    client.connect()
    0xc b'10:12:00:04:4d:51:54:54:04:02:00:00'
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "umqtt.py", line 86, in connect
    IndexError: bytes index out of range



  • @vruizvil
    For Windows, I use MQTTFX Client. Here the link
    http://www.jensd.de/apps/mqttfx/



  • @MainSheet said in Simple MQTT Tutorial:

    broker.hivemq.com

    Try client.disconnect(), then client.connect(). Try on firefox, it works fine in my tests, and try another topic (without slash), ie.: "mylopytopic"



  • Dummy question,

    I have the code on my LoPy working :

    from simple import MQTTClient
    import  time
    def settimeout(duration): pass
    client = MQTTClient("MainSheet", "broker.hivemq.com", port=8000)
    client.settimeout = settimeout
    client.connect()
    while True:
        print("Sending ON")
        client.publish("/lights", "ON")
        time.sleep(1)
        print("Sending OFF")
        client.publish("/lights", "OFF")
        time.sleep(1)
    

    output is this

    connected with goofy, channel 1
    Sending ON
    Sending OFF
    Sending ON
    Sending OFF
    Sending ON
    Sending OFF
    Sending ON
    Sending OFF
    Sending ON
    Sending OFF
    

    Connecting to http://www.hivemq.com/demos/websocket-client/? with Chrome
    Host = broker.hivemq.com
    ClientID = MainSheet
    Port = 8000. ( I tried setting the port to 1883 but then I can't connect to hivemq. I also tried to set the code above to connect to port 8000, however, got an out of range error)
    subscribed to /lights

    however, the messages never get through to HiveMQ

    Steve



  • Well, thanks a lot for the comments.
    After uppgrade recent firmware, the code works fine connecting mosquitto broker.
    But, I can't connect two differents sockets with two differentes brokers at same time.
    It needs run .disconnect() function to be abel to use the other one broker.
    I don't know the reason....., well, I'am not a python expert.

    # Initialize MQTT Client
    def settimeout(duration): pass
    
    
    def t3_publication(topic, msg):
    	print (topic, ';', msg)
    	pycom.rgbled(0xff00)
    
    
    UNIQUE_ID = machine.unique_id()
    MQTT_BROKER = "192.168.2.220"
    MQTT_PORT = 1883
    mqtt_client = MQTTClient(UNIQUE_ID, MQTT_BROKER, port=MQTT_PORT)
    mqtt_client.settimeout = settimeout
    mqtt_client.set_callback(t3_publication)
    mqtt_client.connect()
    
    MQTT_BROKER_2 = "test.mosquitto.org"
    #MQTT_PORT = 1883
    mqtt_client2 = MQTTClient(UNIQUE_ID, MQTT_BROKER_2, port=MQTT_PORT)
    mqtt_client2.settimeout = settimeout
    mqtt_client2.set_callback(t3_publication)
    mqtt_client2.connect()
    


  • @thibault My apologies, I was replying to vruizil below.



  • Sorry i don't speak very well english, so i hav'nt really understand what you says exactly. But i mean you want data about the different version
    I have use the pycom_update_0.9.3.b2 on the lopy. And for the mosquitto the version is 1.3.4-2. I'm begin in the IoT world, and maybe i have too few knowledge in it for understand you. If i have not answer that you wait, feel good about explain another way.



  • Hmmm, do you have your Mosquito broker details to hand to i can test?

    I usually have a node-red instance running that connects to my broker so i can quickly test if the broker is up or down. A few of these public test brokers are not that stable so 9/10 it's the broker being down that causes my issues.



  • My try was successful with this on debian:
    https://pallavichaurasia94.wordpress.com/2014/10/14/mosquitto-in-debian/
    for install MQTT brockers.

    On the lopy i use this initialisation:

    from umqtt import MQTTClient
    def settimeout(duration): pass
    
    client = MQTTClient("joe", "192.168.4.2", port=1883)
    client.settimeout = settimeout
    client.connect()
    

    that give me the possibility to publish fine on my brockers with the command:

    client.publish("hello/world", "My publication")
    

    I have make some try to basic read brocker's data from lopy, We need to define a function who have been called if message are find:

    import pycom
    def t3_publication(topic, msg):
        print (topic, ':', msg)
        pycom.rgbled(0xff00)
    
    

    and assign it:

    client.set_callback(t3_publication)
    

    now we can subscribe to the desired channel:

    client.subscribe("hello/world", qos=1)
    

    I put data to the MQTT brockers from another terminal (localhost from brocker's server) mosquitto_pub -d -t hello/world -m "Hello, MQTT. This is my first message.", and i launch the check of the brocker's message from lopy by:

    client.check_msg()
    

    That's print message in channel, and set led to green (who's been reset by the heartbeat).

    I hope that will help you.



  • The code works fine on my lopy (release 0.9.1.b1) to connect broker.hivemq.com, but it doesn't work to connect test.mosquitto.org. I have a mosquitto broker on local machine, but...... not working. Please, help about this issue. Thanks.


 

Pycom on Twitter