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