У меня возникают проблемы при сохранении глобальных переменных, когда я получаю сообщение 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()
Может ли кто-нибудь помочь мне разобраться в этом странном поведении?