Paho mqtt клиент не работает должным образом - PullRequest
0 голосов
/ 02 мая 2018

Я новичок в MQTT и Raspberry Pi! Я запускаю клиентский скрипт и просто публикую сообщение, используя другой скрипт. Я использую своего собственного брокера Mosquitto.

Клиент:

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()

Издатель:

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

Вот где вещи кажутся странными, и такие вещи случаются. 1.При запуске клиента и издателя с помощью команды python3 операторы if пропускаются и печатаются только тема + полезная нагрузка 2. Когда я запускаю клиент с помощью команды python, а издатель с помощью команд python3 и python, все работает отлично! 3. Когда я делаю все вышеперечисленное, во время запуска клиента на virtualenv операторы if игнорируются во всех случаях!

Я хотел бы знать, есть ли причина совместимости для этого или что-то не так в коде, так как я должен выполнить что-то более сложное, например, в virtualenv!


ОБНОВЛЕНИЕ: Я нашел решение, которое отлично работает! В коде клиента в операторе if я использовал

if msg.payload == b"Hello":

и

if msg.payload == b"World":

Насколько я знаю, это должно быть из-за переменных типов, и они не совпадали.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

наткнулся на этот пост при попытке клиента Paho mqtt -

Можно отметить, как обрабатываются символы и байты в Python, как подробно описано в этом посте.

Итак, приведенный выше фрагмент также можно записать как

if (msg.payload.decode() == 'Hello'):
0 голосов
/ 02 мая 2018

Я нашел решение, которое отлично работает! В коде клиента в операторе if я использовал

if msg.payload == b"Hello":

и

if msg.payload == b"World":

Насколько я знаю, это произошло из-за переменных типов, и они не совпадали.

...