0

我尝试使用 AWS IoT Shadow 功能让 AWS IoT 脚本在 Raspberry Pi 上运行。

当我尝试使用 shadowGet(...) 获取当前状态时,返回回调(函数 customShadowCallback_Get)返回 responseStatus=timeout。

这是代码:

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient

# Custom Shadow callback
def customShadowCallback_Get(payload, responseStatus, token):
    print(responseStatus)
    payloadDict = json.loads(payload)
    print("++++++++GET++++++++++")
    print("property: " + str(payloadDict["state"]["property"]))
    print("version: " + str(payloadDict["version"]))
    print("+++++++++++++++++++++++\n\n")

# Init AWSIoTMQTTShadowClient
myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient('RPi3a')
myAWSIoTMQTTShadowClient.configureEndpoint(host, port)
myAWSIoTMQTTShadowClient.configureCredentials(rootCAPath, privateKeyPath, certificatePath)

# AWSIoTMQTTShadowClient connection configuration
myAWSIoTMQTTShadowClient.configureAutoReconnectBackoffTime(1, 32, 20)
myAWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10)  # 10 sec
myAWSIoTMQTTShadowClient.configureMQTTOperationTimeout(5)  # 5 sec

# Connect and subscribe to AWS IoT
myAWSIoTMQTTShadowClient.connect()

# Create a deviceShadow with persistent subscription
deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName('RPi3a-shadow', True)

# get current shadow status.
deviceShadowHandler.shadowGet(customShadowCallback_Get, 5)
print('Shadow get!')

while True:
    time.sleep(1)
    
myAWSIoTMQTTShadowClient.disconnect()

相关政策是:

  {
      "Effect": "Allow",
      "Action": [
        "iot:UpdateThingShadow",
        "iot:GetThingShadow",
        "iot:DeleteThingShadow",
        "iot:Subscribe"
      ],
      "Resource": "arn:aws:iot:us-east-1:<mycode>:topicfilter/$aws/things/RPi3a-shadow/*"
    }

有人知道为什么我会超时吗?我还尝试在 AWS IoT 控制台中创建一个名为“RPi3a-shadow”的影子,但它仍然不起作用。我错过了什么?

非常感谢!

4

0 回答 0