AWS IOT将温度存储到DynamoDB
问题描述:
我是AWS IOT的新用户。我有以下python代码,将随机温度发布到主题“温度”。 我正在关注Hackster.io项目教程,但在该教程中,作者只是将数据发送到AWS IOT并使用其他Python脚本接收数据。我想将这些数据存储到DynamoDB中。AWS IOT将温度存储到DynamoDB
import paho.mqtt.client as paho
import os
import socket
import ssl
from time import sleep
from random import uniform
connflag = False
def on_connect(client, userdata, flags, rc):
global connflag
connflag = True
print("Connection returned result: " + str(rc))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
#def on_log(client, userdata, level, buf):
# print(msg.topic+" "+str(msg.payload))
mqttc = paho.Client()
mqttc.on_connect = on_connect
mqttc.on_message = on_message
#mqttc.on_log = on_log
awshost = "data.iot.eu-west-1.amazonaws.com"
awsport = 8883
clientId = "myThingName"
thingName = "myThingName"
caPath = "aws-iot-rootCA.crt"
certPath = "cert.pem"
keyPath = "privkey.pem"
mqttc.tls_set(caPath, certfile=certPath, keyfile=keyPath, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
mqttc.connect(awshost, awsport, keepalive=60)
mqttc.loop_start()
while 1==1:
sleep(0.5)
if connflag == True:
tempreading = uniform(20.0,25.0)
mqttc.publish("temperature", tempreading, qos=1)
print("msg sent: temperature " + "%.2f" % tempreading)
else:
print("waiting for connection...")
运行上面的脚本后,我能够看到它使用了“测试”功能发送给AWS IOT数据。
我已经创建了一个规则作为
"SELECT * FROM #"
一个DynamoDB动作为:
Table name : temperature
Hash key: temperature
Hash key type: STRING
Hash key value: ${temperature()}
Range key: timestamp
Range key type: STRING
Range key value: ${timestamp()}
和阴影如下:
https://c1.staticflickr.com/5/4259/35723809136_d968acf299_o.png
的DynamoDB表被配置为:
Partition key: temperature{String}
Sort key: timestamp{String}
温度未保存在DynamoDB表中。我究竟做错了什么?
答
转到AWS IoT控制台,然后设置并启用CloudWatch Logs,以便我们可以看到发生了什么。 另外,检查您的事情政策是否允许您将数据放入DynamoDB。 既然你只是做一个教程,你可以使用这样的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iot:*"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
不要忘了这个策略附加到您的证书。