Как использовать переменные, полученные в функции обратного вызова при подписке на AWS Greengrass?
У меня есть отдельное приложение, которое отправляет некоторые координаты в AWS Greengrass. Что я пытаюсь сделать с помощью этого кода, так это получить эти координаты и использовать их.
Чтобы подписаться на Greengrass, я использую AWSIoTPythonSDK.MQTTLib.
По сути, я подписываюсь на тему на Greengrass, и сообщения принимаются / обрабатываются в функции обратного вызова.
Хочу уточнить, что я могу подписаться и получить координаты в функции обратного вызова. Чего я не могу сделать, так это использовать эти значения дальше в моем коде.
Краткая версия моего кода будет выглядеть так:
coordinateX=0
coordinateY=0
def callbackFunction():
#unpacks the payload and extracts the coordinates
coordinateX=unpackedCoordinateX
coordinateY=unpackedCoordinateY
class configureAWS:
#holds the necessary data in order to connect to AWS
def connectAws():
#connects to AWS
main:
connectAws()
myAWSIoTMQTTClient.subscribe()
while(True):
#I want to do something with the variables coordinateX and coordinateY but they are always 0
Вот фактический код:
import numpy as np
import cv2
import time
import os
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
coordinateX=0
coordinateY=0
def customCallback(client, userdata, message):
payload=json.loads(message.payload)
#payload is a string representing a json in the form of 'rover':'(x,y)'
coordinates=list(payload['rover'].split(','))
coordinateX=int(coordinates[0].replace('(',''))
coordinateY=int(coordinates[1].replace(')',''))
class configureAWS:
host = ...
rootCAPath = ...
certificatePath = ...
privateKeyPath = ...
clientId = ...
topic_rover = ...
useWebsocket=False
def __init__(self):
pass
def get_aws_host(self):
return self.host
def set_aws_host(self, aws_host):
self.host = aws_host
def get_root_file(self):
return self.rootCAPath
def set_root_file(self, root_file_path):
self.rootCAPath = root_file_path
def get_cert_file(self):
return self.certificatePath
def set_cert_file(self, cert_file_path):
self.certificatePath = cert_file_path
def get_priv_file(self):
return self.privateKeyPath
def set_priv_file(self, priv_file_path):
self.privateKeyPath = priv_file_path
def get_thing_name(self):
return self.clientId
def set_thing_name(self, thing_name):
self.clientId = thing_name
def get_topic(self, keyword):
if keyword=="rover":
return self.topic_rover
if keyword=="target":
return self.topic_target
else:
return 'default/topic'
def set_topic(self, keyword):
if keyword=="rover":
self.topic_rover = keyword
if keyword=="target":
self.topic_target= keyword
myAWSConfig=configureAWS()
host = myAWSConfig.get_aws_host()
rootCAPath = myAWSConfig.get_root_file()
certificatePath = myAWSConfig.get_cert_file()
privateKeyPath = myAWSConfig.get_priv_file()
clientId = myAWSConfig.get_thing_name()
topic_rover = myAWSConfig.get_topic("rover")
useWebsocket=myAWSConfig.useWebsocket
def connect_aws():
if useWebsocket and certificatePath and privateKeyPath:
print("X.509 cert authentication and WebSocket are mutual exclusive. Please pick one.")
exit(2)
if not useWebsocket and (not certificatePath or not privateKeyPath):
print("Missing credentials for authentication.")
exit(2)
# Port defaults
if useWebsocket: # When no port override for WebSocket, default to 443
port = 443
if not useWebsocket: # When no port override for non-WebSocket, default to 8883
port = 8883
myAWSIoTMQTTClient = None
if useWebsocket:
myAWSIoTMQTTClient = AWSIoTMQTTClient(clientId, useWebsocket=True)
myAWSIoTMQTTClient.configureEndpoint(host, port)
myAWSIoTMQTTClient.configureCredentials(rootCAPath)
else:
myAWSIoTMQTTClient = AWSIoTMQTTClient(clientId)
myAWSIoTMQTTClient.configureEndpoint(host, port)
myAWSIoTMQTTClient.configureCredentials(rootCAPath, privateKeyPath, certificatePath)
# AWSIoTMQTTClient connection configuration
myAWSIoTMQTTClient.configureAutoReconnectBackoffTime(1, 32, 20)
myAWSIoTMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing
myAWSIoTMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz
myAWSIoTMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec
myAWSIoTMQTTClient.configureMQTTOperationTimeout(5) # 5 sec
# Connect and subscribe to AWS IoT
myAWSIoTMQTTClient.connect()
return myAWSIoTMQTTClient
if __name__ == "__main__":
myAWSIoTMQTTClient=connect_aws()
myAWSIoTMQTTClient.subscribe(topic_rover, 1, customCallback)
print("subscribed")
while(True):
print(coordinateX)
Если я попытаюсь распечатать координаты в функции обратного вызова, она распечатает правильные значения, но в основной функции в цикле while она печатает только нули.
Код может иметь некоторые накладные расходы и некоторые вещи, которые могут не иметь смысла, но, пожалуйста, игнорируйте это, я быстро собрал это, и важно то, что он работает (кроме той части, которую я не могу заставить работать lol)
Я уверен, что мне не хватает чего-то довольно простого, но я новичок в Python.