我尝试使用 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”的影子,但它仍然不起作用。我错过了什么?
非常感谢!