AWS IoT SDK Python订阅返回true但未调用回调参数

时间:2018-02-04 22:22:51

标签: python aws-lambda aws-sdk mqtt aws-iot

我正在做的一点概述是将传感器数据从Raspbery Pi发布到AWS,它将数据存储到DynamoDB并调用lambda函数。然后,此lambda函数将消息发布到由raspberry Pi订阅的主题。

所以我的问题是没有调用回调,所以我无法访问从AWS lambda发布的消息。我确认此消息正在发布到RaspberryPi在AWSIoT测试中订阅的主题。我在AWS lambda函数上使用覆盆子Pi和Boto3上的AWSIoTPythonSDK库。

另外,我已经通过使用AWS IoT影子阅读了一个可能的解决方案,但是这个解决方案已经接近完成了 - 我不想放弃我的努力,因为它似乎是一行代码而不是工作。 Send data from cloud to aws iot thing

请告诉我有关如何进一步排查问题的任何想法。

到目前为止,我已尝试在订阅功能之后打印堆栈,并从堆栈输出: *我没有让整个循环完成*

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

以下是Raspberry Pi代码:*****省略发布代码*********

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

以下是AWS lambda代码:

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

1 个答案:

答案 0 :(得分:1)

首先,围绕订阅的循环没有意义,因为永远不会使用<meta property="og:image" content="http://yoursite.com/ogp.jpg" /> ,您只需要订阅一次主题。每次调用subscribe时,MQTT客户端都不会轮询主题,它会通知代理它想要所有匹配的消息然后只是坐下来等待代理发送匹配的消息,直到您取消订阅或断开连接。 / p>

您应该在发布之前将订阅移动,然后在发布之前设置并等待响应消息,从而消除客户端错过消息的任何机会,因为它仍然尝试处理设置订阅。