AWS将MQTT消息存储到DynamoDB

时间:2017-03-01 19:29:12

标签: python amazon-web-services amazon-dynamodb mqtt

我构建了一个定期发送MQTT消息的python脚本。

这是发送到后端的JSON字符串:

{"Id": "1234", "Ut": 1488395951, "Temp": 22.86, "Rh": 48.24}

在后端方面,我想将MQTT消息存储到DynamoDB表中。

我遵循了亚马逊教程,包含在MQTT消息中的数据存储在表中。

我的问题是关于表格列。

该表只有3个列:

  • Id:分区键
  • Ut:排序键
  • Payload:包含mqtt消息。

可以在MQTT消息中包含每个密钥的列吗?

我会有这些专栏:  - ID   - 呃   - 温度   - Rh

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

是的,你可以。

在DynamoDB中,您无需创建所谓的“列”。成功投放操作的唯一要求是您提供主要属性(在您的情况下为IdUt)。

来自docs

  

属性名称/值对的映射,每个属性对应一个。只有   主键属性是必需的;你可以选择提供其他   该项的属性名称 - 值对。

在python中你可以做类似的事情(可能需要检查语法并调整列类型):

import boto3
client = boto3.client('dynamodb')
response = client.put_item(
    TableName = 'Messages',
    Item={
        'Id': {
            'S': '1234'
        },
        'Ut': {
            'S': '1488395951'
        },
        'Temp': {
            'S': '22.86'
        },
        'Rh': {
            'S': '48.24'
        }
    }
)

答案 1 :(得分:1)

是的,当然。您可以为要存储在DynamoDB表中的任何内容创建列,而不是存储完整的有效负载。

按照步骤3.1:从this tutorial创建新项目,您需要更新put_item代码以包含所有商品详情......

#Parse your JSON message and get out all your attributes
id = message["Id"]
ut = message["Ut"]
temp = message["Temp"]
rh = message["Rh"]

response = table.put_item(
   Item={
        'id': id,
        'ut': ut,
        'temp': temp,
        'rh': rh
    }
)

现在,如果您在DynamoDB控制台中查看您的表,您将看到已为您的其他属性创建了新列。

答案 2 :(得分:1)

我假设您正在尝试在DynamoDB表中提供存储消息的IoT网关规则。遗憾的是,IoT规则不允许将数据存储在多个列中 - 您只能将有效负载(或其子集)存储在单个列中。目前没有规定将有效负载中的属性提取到几个不同的列中。

解决这个问题的唯一方法(我到目前为止找到的)是通过IoT规则调用lambda函数,该规则运行的代码与其他答案所显示的类似。

答案 3 :(得分:0)

是否可能在MQTT消息中包含每个键的列?

我要输入以下列:-ID-Ut-Temp-Rh

最简单,最简单的方法是使用AWS IoT DynamoDBv2操作,而无需实现Lambda。

来自https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html#dynamodb-v2-rule

dynamoDBv2操作允许您将MQTT消息的全部或部分写入DynamoDB表。有效负载中的每个属性都被写入DynamoDB数据库的单独列中。

MQTT消息有效负载必须包含一个与表的主分区键匹配的根级密钥,以及一个与表的主排序键匹配的根级密钥(如果已定义)。

该表可以继续将Id作为分区键,并将Ut作为排序键。 MQTT消息已经包含分区和排序键,因此AWS IoT SQL语句可以简单地是:

SELECT * FROM 'mytopic'