Un aperçu de ce que je fais est de publier les données de capteur d'un Raspbery Pi sur AWS, qui stocke les données dans DynamoDB et appelle une fonction lambda. Cette fonction lambda publie ensuite un message sur une rubrique abonnée par le raspberry Pi.
Donc, mon problème est qu'un rappel n'est pas appelé, donc je ne peux pas accéder au message publié depuis AWS lambda. J'ai vérifié que ce message est en cours de publication sur un sujet abonné par le test RaspberryPi on AWSIoT. J'utilise la bibliothèque AWSIoTPythonSDK sur le raspberry Pi et Boto3 sur la fonction AWS lambda.
De plus, j'ai lu une solution possible en utilisant AWS IoT shadow, mais cette solution est si proche d'être terminée - je ne veux pas abandonner mes efforts quand il semble qu'une ligne de code ne fonctionne pas. Envoyez des données du cloud vers aws iot thing
Veuillez me faire part de vos idées sur la façon de résoudre ce problème.
Jusqu'à présent, j'ai essayé d'imprimer la pile après la fonction d'abonnement et cela sort de la pile: * Je n'ai pas laissé toute la boucle se terminer *
pi@raspberrypi:~/eve-pi $ pi@raspberrypi:~/eve-pi $ python3 sensor_random.py
for line in traceback.format_stack():
File "sensor_random.py", line 66, in <module>
for line in traceback.format_stack():
^CTraceback (most recent call last):
File "sensor_random.py", line 68, in <module>
time.sleep(2)
KeyboardInterrupt
-bash: pi@raspberrypi:~/eve-pi: No such file or directory
import json
import time
import pytz
import traceback
import inspect
from time import sleep
from datetime import date, datetime
from random import randint
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
# AWS IoT certificate based connection
# MQQT client is an ID so that the MQTT broker can identify the client
myMQTTClient = AWSIoTMQTTClient("XXXXXXXX")
# this is the unique thing endpoint with the .503 certificate
myMQTTClient.configureEndpoint("XXXXXXXXX.us-west-2.amazonaws.com", 8883)
myMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing
myMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz
myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec
myMQTTClient.configureMQTTOperationTimeout(20) # 5 sec
def customCallback(client, userdata, message):
traceback.print_stack()
print('in callback 1')
print(message.payload)
print('in callback 2')
def rand_sensor_data():
print('randomizing sensor data')
for each in payload:
each = randint(1, 51)
try:
rand_sensor_data()
print(payload)
msg = json.dumps(payload)
myMQTTClient.publish("thing01/data", msg, 0)
print('before subscribe')
for x in range(5):
myMQTTClient.subscribe("thing02/water", 0, customCallback)
for line in traceback.format_stack():
print(line.strip())
time.sleep(2)
print('after subscribe')
except KeyboardInterrupt:
GPIO.cleanup()
print('exited')
import json
import boto3
def lambda_handler(event, context):
#testing for pi publishing
message = {
'topic': 'thing02/water',
'payload': {'message': 'test'}
}
boto3.client(
'iot-data',
region_name='us-west-2',
aws_access_key_id='<access-key>',
aws_secret_access_key='<secret-access-key'
).publish(
topic='thing02/water',
payload=json.dumps(message),
qos=1
)
print(json.dumps(message))
Premièrement, la boucle autour de l'abonnement n'a aucun sens car elle x
n'est jamais utilisée et vous ne devriez avoir à vous abonner à un sujet qu'une seule fois. Le client MQTT n'interroge pas un sujet à chaque fois que l'abonnement est appelé, il notifie au courtier qu'il veut tous les messages correspondants, puis se rassemble et attend que le courtier envoie les messages correspondants jusqu'à ce que vous vous désabonniez ou vous déconnectiez.
Vous devez déplacer l'abonnement avant la publication, puis il est configuré et attendre les messages de réponse avant la publication, ce qui supprime toute possibilité que le client manque le message car il tente toujours de gérer la configuration de l'abonnement.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots