L'abonnement Python du kit AWS IoT SDK renvoie true mais le paramètre de rappel n'est pas appelé

giovmoya

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

Voici le code Raspberry Pi: ***** Code de publication omis *********

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')

Voici le code lambda AWS:

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))
hardillb

Premièrement, la boucle autour de l'abonnement n'a aucun sens car elle xn'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.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Filtrer le dataframe basé sur plusieurs colonnes d'un autre dataframe

  2. 2

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  3. 3

    Enregistrer le chemin de l'image de la galerie vers la base de données de la salle et l'afficher dans la liste des recycleurs

  4. 4

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  5. 5

    Microsoft.WebApplication.targets

  6. 6

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  7. 7

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  8. 8

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  9. 9

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

  10. 10

    comment afficher un bouton au-dessus d'un autre élément ?

  11. 11

    Comment centrer un div tout en utilisant la transition et transformer avec l'échelle

  12. 12

    Filtrer les données en fonction des conditions d'une trame de données

  13. 13

    ESP8266 HADRWARE MINUTERIE, USA pour cocher une macro étrange

  14. 14

    Comment définir du texte dans un QLabel et afficher les caractères '<>'?

  15. 15

    System.Data.SqlClient.SqlException: 'Nom de colonne non valide' ApplicationRoleId '.'

  16. 16

    Pourquoi Phantomjs ne fonctionne pas avec ce site ?

  17. 17

    Stop jQuery execution after one time execution

  18. 18

    Concaténer des variables dans ansible

  19. 19

    Comment calculer la probabilité du graphique de densité?

  20. 20

    php ajouter et fusionner des données de deux tables

  21. 21

    Redirection HTTP vers HTTPS dans Java à l'aide de HTTPURLConnection

chaudétiquette

Archive