本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:将设备数据存储在 DynamoDB 表中
本教程演示如何创建将消息数据发送到 DynamoDB 表的 Amazon IoT 规则。
在本教程中,您将创建一条规则来将消息数据从假想气象传感器设备发送到 DynamoDB 表。该规则将为来自许多气象传感器的数据设置格式,以便将其添加到单个数据库表中。
在本教程中您将学到
-
如何创建 DynamoDB 表
-
如何通过规则向 DynamoDB 表发送消息数据 Amazon IoT
-
如何在 Amazon IoT 规则中使用替换模板
-
如何在规则SQL查询语句中使用简单的查询和函数
-
如何使用MQTT客户端测试 Amazon IoT 规则
完成本教程需要大约 30 分钟。
在本教程中,您将:
在开始本教程之前,请确保您具有:
-
设置 Amazon Web Services 账户
你需要你的 Amazon Web Services 账户 和 Amazon IoT 主机才能完成本教程。
-
审核 通过 Amazon IoT MQTT客户端查看MQTT消息
请务必使用MQTT客户端订阅和发布主题。在此过程中,您将使用MQTT客户端来测试您的新规则。
-
审核 Amazon DynamoDB 概览
如果您之前没有使用过 DynamoDB,请查看 DynamoDB 入门来熟悉 DynamoDB 的基本概念和操作。
步骤 1:为本教程创建 DynamoDB 表
在本教程中,您将创建一个具有以下属性的 DynamoDB 表,以记录来自虚拟气象传感器设备的数据:
-
sample_time
是主键,描述了记录样本的时间。 -
device_id
是排序键,描述了提供示例的设备 -
device_data
是从设备接收并由规则查询语句格式化的数据
如需为本教程创建 DynamoDB 表
-
打开 DynamoDB 控制台
,然后选择 Create table(创建表格)。 -
在 Create table(创建表)中:
-
在 Table name(表名称)框中输入表名:
wx_data
。 -
在 Partition key(分区键)中,输入
sample_time
,然后在字段旁边的选项列表中,选择Number
。 -
在 Sort key(排序键)中,输入
device_id
,然后在字段旁边的选项列表中,选择Number
。 -
在页面底部,选择 Create(创建)。
-
您将在稍后定义 device_data
,即您配置 DynamoDB 规则操作时。
步骤 2:创建向 DynamoDB 表发送数据的 Amazon IoT 规则
在此步骤中,您将使用规则查询语句格式化来自虚拟气象传感器设备的数据,以便写入数据库表。
从天气传感器设备接收的示例消息负载如下所示:
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
对于数据库条目,您将使用规则查询语句将消息负载的结构展平如下:
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind_velocity": 22, "wind_bearing": 255 }
在这个规则中,您还将使用几个 替换模板。替代模板是用于从函数和消息数据中插入动态值的表达式。
创建向 DynamoDB 表发送数据的 Amazon IoT 规则
-
打开 Amazon IoT 控制台的规则中心
。或者,您可以在中打开 Amazon IoT 主页 Amazon Web Services Management Console 并导航到 “消息路由” > “规则”。 -
要开始在 Rules(规则)中创建新规则,请选择 Create rule(创建规则)。
-
在 Rule properties(规则属性)中:
-
在 Rule name(规则名称)中,输入
wx_data_ddb
。请记住,规则名称在您的 Amazon Web Services 账户 和区域内必须是唯一的,并且不能有任何空格。我们在此名称中使用了下划线字符来分隔规则名称中的两个单词。
-
在 Rule description(规则描述)中,描述规则。
有意义的描述可以更容易地记住此规则的作用以及您创建它的原因。描述可以根据需要延长,因此请尽可能详细。
-
-
选择下一步以继续。
-
在SQL声明中:
-
在SQL版本中,选择
2016-03-23
。 -
在对SQL账单编辑框中,输入以下语句:
SELECT temperature, humidity, barometer, wind.velocity as wind_velocity, wind.bearing as wind_bearing, FROM 'device/+/data'
本语句:
-
监听主题与
device/+/data
主题筛选条件匹配的MQTT消息。 -
将
wind
属性的元素格式化为单个属性。 -
传递
temperature
、humidity
、barometer
属性,使其保持不变。
-
-
-
选择下一步以继续。
-
在 Rule actions(规则操作)中:
-
要打开此规则的规则操作列表,请在 Action 1(操作 1)中,选择
DynamoDB
。注意
请务必选择 DynamoDB 而不是 ynamoDBv D 2 作为规则操作。
-
在 Table name(表名称)中,选择在上一步中创建的 DynamoDB 表的名称:
wx_data
。Partition key type(分区键类型)和 Sort key type(排序键类型)字段将使用 DynamoDB 表中的值填充。
-
在分区键中,输入
sample_time
。 -
在分区键值中,输入
${timestamp()}
。这是您将在此规则中使用第一个 替换模板。它将使用 timestamp 函数返回的值,而不是消息负载中的值。要了解更多信息,请参阅《Amazon IoT Core 开发人员指南》中的时间戳。
-
在 Sort key(排序键)中,输入
device_id
。 -
在排序键值中,输入
${cast(topic(2) AS DECIMAL)}
。这是您将在此规则中使用的第二个 替换模板。它会在主题名称(即设备的 ID)中插入第二个元素的值,然后将其转换为与密钥的数字格式相匹配的DECIMAL值。要了解有关主题的更多信息,请参阅《Amazon IoT Core 开发人员指南》中的主题。或者,要了解有关强制转换的更多信息,请参阅《Amazon IoT Core 开发人员指南》中的强制转换。
-
在 Write message data to this column (将消息数据写入到此列) 中,输入
device_data
。这将在 DynamoDB 表中创建
device_data
列。 -
将 Operation (操作) 留空。
-
在IAM角色中,选择创建新角色。
-
在 Create role(创建角色)对话框中,为 Role name(角色名称)输入 wx_ddb_role。这个新角色将自动包含前缀为 “aws-iot-rule” 的策略,该策略将允许该
wx_data_ddb
规则将数据发送到您创建的 Dwx_data
ynamoDB 表。 -
在IAM角色中,选择
wx_ddb_role
。 -
在页面底部,选择 Next。
-
-
在 Review and create(审核和创建)页面的底部,选择 Create(创建)以创建规则。
步骤 3:测试 Amazon IoT 规则和 DynamoDB 表
要测试新规则,您将使用MQTT客户端发布和订阅此测试中使用的MQTT消息。
在新窗口中打开 Amazon IoT
控制台中的MQTT客户端
使用MQTT客户端测试您的规则
-
在Amazon IoT 控制台的MQTT客户端中
,订阅输入主题 device/+/data
。-
在MQTT客户端中,选择 “订阅主题”。
-
对于 Topic filter(主题筛选条件)中,输入输入主题筛选条件的主题,
device/+/data
。 -
选择订阅。
-
-
现在,使用特定设备 ID
device/22/data
向输入主题发布消息。您无法发布到包含通配符的MQTT话题。-
在MQTT客户端中,选择 “发布到主题”。
-
对于 Topic name(主题名称),输入输入主题名称
device/22/data
。 -
对于 Message payload(消息负载),输入以下示例数据。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
要发布MQTT消息,请选择发布。
-
现在,在MQTT客户端中,选择 “订阅主题”。在 Subscribe(订阅)列中,选择
device/+/data
订阅。确认上一步骤中的示例数据是否显示在此处。
-
-
检查以查看您的规则创建的 DynamoDB 表中的行。
-
在控制台的 D ynamoDB 表中心中 Amazon IoT
,选择 wx_data,然后选择项目选项卡。 如果您已经在 Items(项目)选项卡上,则可能需要通过选择表格标题右上角的刷新图标来刷新显示。
-
请注意,表中的 sample_time 值是链接,请打开一个。如果您刚刚发送了第一条消息,那么这将是列表中唯一的消息。
此链接显示表的该行中所有的数据。
-
展开 device_data 条目以查看规则查询语句生成的数据。
-
浏览此显示中可用数据的不同表示形式。您也可以编辑此显示中的数据。
-
查看完此行数据后,要保存所做的任何更改,请选择 Save(保存),或者要退出而不保存任何更改,请选择 Cancel(取消)。
-
如果您未看到正确的行为,请检查故障排除提示。
故障排除 DynamoDB 规则
如果您没有看到期望的结果,可检查以下事项。
-
您收到了一个错误的广告条
如果在您发布输入消息时出现错误,请先更正该错误。以下步骤可帮助您更正此错误。
-
你在MQTT客户端中看不到输入消息
如果您按照步骤中所述订阅了
device/22/data
主题筛选器,则每次向device/+/data
主题发布输入消息时,该消息都应出现在MQTT客户端中。要检查的事项
-
检查您订阅的主题筛选条件
如果您如流程中所述订阅了输入消息主题,则每次发布输入消息时都应看到该输入消息的副本。
如果没有看到该消息,请检查您订阅的主题名称,并将其与您发布的主题进行比较。主题名称区分大小写,您订阅的主题必须与发布消息负载的主题相同。
-
检查消息发布函数
在MQTT客户端的 “订阅” 下,选择 device/+/data,选中发布消息的主题,然后选择发布到主题。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。
-
-
您在 DynamoDB 表中看不到您的数据
要做的第一件事是通过选择表格标题右上角的刷新图标来刷新显示。如果没有显示您要查找的数据,请检查以下内容。
要检查的事项
-
检查 Amazon Web Services 区域 您的MQTT客户端和您创建的规则
您运行MQTT客户端的控制台必须与您创建的规则位于同一 Amazon 区域。
-
检查规则查询语句中的输入消息主题
要使规则起作用,它必须收到一条消息,其主题名称必须与规则查询语FROM句子句中的主题过滤器相匹配。
检查规则查询语句中主题筛选器的拼写和MQTT客户端中主题筛选器的拼写。主题名称区分大小写,消息的主题必须与规则查询语句中的主题筛选条件匹配。
-
检查输入消息负载的内容
要使规则起作用,它必须在语句中SELECT声明的消息负载中找到数据字段。
将规则查询语句中
temperature
字段的拼写与MQTT客户端中消息有效载荷的拼写进行检查。字段名称区分大小写,规则查询语句中temperature
字段必须与消息负载中的temperature
字段相同。确保消息负载中的JSON文档格式正确。如果有任何错误,例如缺少逗号,则规则将无法读取它。JSON
-
检查规则操作中使用的键名和字段名称
主题规则中使用的字段名称必须与已发布消息的JSON消息负载中的字段名称相匹配。
打开您在控制台中创建的规则,将规则操作配置中的字段名称与MQTT客户端中使用的字段名称进行核对。
-
检查规则所使用的角色
规则操作必须具有接收原始主题和发布新主题的权限。
授权规则接收消息数据和更新 DynamoDB 表的策略特定于所使用的主题。如果更改规则使用的主题或 DynamoDB 表名称,则必须更新规则操作的角色以更新其策略来匹配。
如果您怀疑存在问题,请编辑规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。
-
步骤 4:查看结果和后续步骤
使用此规则向 DynamoDB 表发送几条消息后,请尝试对其进行试验,以了解更改教程中的某些方面如何影响写入表的数据。以下想法可以帮助您开始操作。
-
改变
device_id
在输入消息的主题中,观察对数据的影响。您可以使用它来模拟从多个气象传感器接收数据。 -
更改规则查询语句中选定的字段,并观察对数据的影响。您可以使用它筛选存储在表中的数据。
-
添加重新发布规则操作,为添加到表中的每一行发送MQTT一条消息。您可以使用它进行调试。
完成本教程后,检查 教程:使用 Amazon Lambda 函数格式化通知。