Python библиотека paho MQTT, устанавливающая глобальные переменные при получении сообщения - PullRequest
0 голосов
/ 07 августа 2020

У меня возникают проблемы при сохранении глобальных переменных, когда я получаю сообщение MQTT на моей плате Raspberry PI:

Мой код инициализации:

import paho.mqtt.client as mqtt
import mysql.connector
import pandas as pd
import time



def on_message(client, userdata, message):
    print("message received " ,str(message.payload.decode("utf-8")))
    payload=str(message.payload.decode("utf-8"))
    print("message topic=",message.topic)
    print("message qos=",message.qos)
    print("message retain flag=",message.retain)
    print("MESSAGE RECEIVED PAYLOAD=",payload)
    if(payload=="DONE"):
        print("NEXT_DEVICE_FLAG_SET")
        flag_next_device=1
        print("updated flag_next_device = ",flag_next_device)
        #NEVER REACHES THE NEXT 2 LINES OF CODE????
        device_counter=device_counter+1
        print("updated device counter = ",device_counter)

hostname = 'localhost'
username = 'root'
password = 'password'
database = 'test'
mqttc=mqtt.Client()
mqttc.on_message=on_message #attach function to callback
mqttc.connect("localhost",1883,60)#mosquito broker port 1883

mqttc.loop_start() #start the loop

mqttc.subscribe("device1/status")

Меня беспокоит статус топи c. Я инициирую задачу между сервером и клиентом, отправляя статус topi c «АКТИВНЫЙ», когда АКТИВНОЕ устройство завершает задачу, оно отвечает на малиновый PI, отправляя сообщение тому же топу c «DONE».

print("activating first device")
string = Device_global[0]+"/"+"status";
mqttc.publish(string,"ACTIVE")


#LOOP UNTIL COMPLETED

while(1):
    print("flag_next_device=",flag_next_device)
    print("device counter=",device_counter)
    if(flag_next_device == 1):
            print("activating next device")
            string = Device_global[device_counter]+"/"+"status";
            mqttc.publish(string,"ACTIVE")
            flag_next_device=0;
    #else:
        print("flag not set")
        time.sleep(1)

Затем я определяю, содержит ли полученное сообщение строку «DONE». Если он содержит строку, я устанавливаю глобальный флаг, увеличиваю счетчик и запускаю задачу с другого удаленного устройства.

Проблема, с которой я сталкиваюсь, заключается в том, что обратный вызов on_message MQTT не работает должным образом - он не устанавливает глобальные переменные и отключается до достижения строки device_counter = device_counter + 1.

В моем while l oop я также распечатываю счетчик и флаг, чтобы проверить, установлен ли он или нет. И когда я отправляю сообщение «DONE», я вижу, что он не был установлен правильно: OUTPUT:

Using mysql.connector…
ITEMS MATCHED
device1 1
device3 2
device5 3
number of individual items in set= 3
activating first device
flag_next_device= 0
device counter= 0
message received  ACTIVE
message topic= device1/status
message qos= 0
message retain flag= 0
MESSAGE RECEIVED PAYLOAD= ACTIVE
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
message received  DONE
message topic= device1/status
message qos= 0
message retain flag= 0
MESSAGE RECEIVED PAYLOAD= DONE
NEXT_DEVICE_FLAG_SET
updated flag_next_device =  1
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0
flag_next_device= 0
device counter= 0

Объявление глобальных переменных:

def main():
    global flag_next_device
    global device_counter
    device_counter = 0
    flag_next_device = 0

Я называю это:

main()
myConnection = mysql.connector.connect( host=hostname, user=username, passwd=password, db=database )

insertData_komplektacija(myConnection,"rut2.csv");

update_current_operation(myConnection);
# WHEN FIRST DEVICE SENDS DONE, SEND ACTIVE TO 2ND DEVICE
print("activating first device")
string = Device_global[0]+"/"+"status";
mqttc.publish(string,"ACTIVE")


#LOOP UNTIL COMPLETED

while(1):
    print("flag_next_device=",flag_next_device)
    print("device counter=",device_counter)
    if(flag_next_device == 1):
        print("activating next device")
        string = Device_global[device_counter]+"/"+"status"
        mqttc.publish(string,"ACTIVE")
        flag_next_device=0

    time.sleep(1)
        


myConnection.close()

Может ли кто-нибудь помочь мне разобраться в этом странном поведении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...