fio_10
fio_10

Reputation: 63

Paho mqtt client not working properly

I'm new to MQTT and raspberry pi! I'm running a client script and I simply publish a message using another script. I'm using my own Mosquitto broker.

Client:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    client.subscribe("Example/test")
    client.subscribe("Example/topic")


def on_message(client, userdata, msg):

    print(msg.topic+" "+str(msg.payload))


    if msg.payload == "Hello":
        print("Received message #1, do something")

    if msg.payload == "World":
        print("Received message #2, do something else")


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("192.168.1.4", 1883)


client.loop_forever()

Publisher:

import paho.mqtt.publish as publish


publish.single("Example/test", "Hello", hostname="192.168.1.4")
publish.single("Example/topic", "World", hostname="192.168.1.4")

print("OK")

That's where things seem weird and those things happen. 1.When I run both the client and the publisher using the python3 command the if statements are skipped and only topic + payload are printed 2.When I run the client using python command and publisher using both python3 and python command everything works fine! 3.When I do all the above, while running the client on virtualenv again the if statements are ignored, in all occasions!

I would like to know if there is a compatibility reason for this to happen, or anything wrong in the code as I must run something more complicated like that on virtualenv!


UPDATE: I found a solution that works fine ! In the client code in the if statement I used

if msg.payload == b"Hello":

and

if msg.payload == b"World":

As far as I know it must have been due to a variable type thing and they didn't match.

Upvotes: 2

Views: 2836

Answers (2)

nbs
nbs

Reputation: 319

stumbled upon this post while trying Paho mqtt client -

It may be good to note how characters & bytes are treated in Python, as explained in detail in this post.

So, above snippet could also be written as,

if (msg.payload.decode() == 'Hello'):

Upvotes: 1

fio_10
fio_10

Reputation: 63

I found a solution that works fine ! In the client code in the if statement I used

if msg.payload == b"Hello":

and

if msg.payload == b"World":

As far as I know it must have been due to a variable type thing and they didn't match.

Upvotes: 2

Related Questions