Функция on_message получает значения, которые не отправляются - PullRequest
1 голос
/ 08 июля 2019

Как получить MQTT и передать его в скрипт bash, который я настроил?Я получаю значения, которые увеличиваются между сообщением, которое я отправляю, и когда я получаю свое сообщение, я не могу сказать, выполнил ли он сценарий bash, и он не печатает строки, следующие за ним, чтобы проверить, поэтому я подозреваю, что что-топредыдущая ошибка.

Последняя напечатанная строка:

voltage = "voltage = %s" %volts
print(voltage)

Я попытался поместить код для создания сценария bash с сообщением MQTT в функцию on_message.

Я запустил bash-скрипт в терминале, чтобы убедиться, что его функция работает.Я создал скрипт Python, для которого вручную вводил значения при вызове скрипта, и он работал.По сути, я поместил этот скрипт в функцию on_message.


#! /usr/bin/python
import os, time, sys, datetime, paho.mqtt.client as mqtt
print("Starting script")
#while True:
def on_connect(client, userdata, flags, rc):
        print("Connected with result code "+str(rc))
        client.subscribe("$SYS/#")



def on_message(client, userdata,message):
        print("message received")
        split = str(message.payload.decode("utf-8"))
        value = str(datetime.datetime.now())
        value = """  "%s" """ %value
        split = split.split(',')
        print(split)
        num = str(982123456)
        RFID = "RFID = %s" %num
        start = "Super secret start sequence"
        username = """ "Secret name" """
        password = """ "Secret password" """
        volts = split[0]
        voltage = "voltage = %s" %volts
        print(voltage)
        if split[2] == "None":
                lat = 22
                long = 141
                print("IF NONE")
        else:
                lat = split[2]
                long = split[3]
                print("IF SOMEThING")
        os.system(start +  RFID + "," +  "DateTime = %s" %value + "," + "lat =" + lat + "," + "long =" + long + "," + voltage +  "," + "username = " +  username  + "," + "password = " + password + ")'" )
        print(start +  RFID + "," +  "DateTime = %s" %value + "," + "lat =" + lat + "," + "long =" + long + "," + voltage +  "," + "username = " +  username  + "," + "password = " + password + ")'" )
        print(split)
client= mqtt.Client("demo",clean_session=True, userdata=None, transport="tcp")
#       print("Connecting...")
client.connect("localhost")
#client.loop_start()
client.subscribe("test")
#       print("subscribed")
print("Checker")
client.on_message=on_message
print("Client Message:")
print(client.on_message)
client.on_connect=on_connect
#       print("loop")
client.loop_forever()
#       time.sleep(0.1)

Я ожидаю:

message received
['4.69172', 'None', 'None', 'None']
voltage = 4.69172
*response from bash script*

Но я получаю:

Connected with result code 0
message received
['mosquitto version 1.4.15']
voltage = mosquitto version 1.4.15
message received
['Wed', ' 13 Feb 2019 00:27:01 +0000']
voltage = Wed
message received
['3626777 seconds']
voltage = 3626777 seconds
message received
['4']
voltage = 4
message received
['6']
voltage = 6
message received
['2']
voltage = 2
message received
['2']
voltage = 2
message received
['2']
voltage = 2
message received
['2']
voltage = 2
message received
['0']
voltage = 0
message received
['49']
voltage = 49
message received
['6762187']
voltage = 6762187
message received
['10594382']
voltage = 10594382

1 Ответ

0 голосов
/ 08 июля 2019

Вы подписались на несколько тем.

Сначала вы подписываетесь на тему test, которая, как я полагаю, содержит ожидаемые вами данные.

Но в функции on_connect вы также подписываетесь на $SYS/#, который будет возвращать множество различных сообщений в зависимости от внутреннего состояния брокера MQTT, таких как время безотказной работы, количество подключенных клиентов, количество отправленных или полученных сообщений. Если вы удалите эту строку, вы должны получать только те сообщения, которые ожидаете.

...