Как использовать переменные, полученные в функции обратного вызова при подписке на 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.

0 ответов

Другие вопросы по тегам