教程:将设备数据存储在 DynamoDB 表中 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:将设备数据存储在 DynamoDB 表中

本教程演示如何创建将消息数据发送到 DynamoDB 表的 Amazon IoT 规则。

在本教程中,您将创建一条规则来将消息数据从假想气象传感器设备发送到 DynamoDB 表。该规则将为来自许多气象传感器的数据设置格式,以便将其添加到单个数据库表中。

在本教程中您将学到
  • 如何创建 DynamoDB 表

  • 如何通过规则向 DynamoDB 表发送消息数据 Amazon IoT

  • 如何在 Amazon IoT 规则中使用替换模板

  • 如何在规则查询语句中使用简单的 SQL 查询和函数

  • 如何使用 MQTT 客户端测试规则 Amazon IoT

完成本教程需要大约 30 分钟。

在开始本教程之前,请确保您具有:

步骤 1:为本教程创建 DynamoDB 表

在本教程中,您将创建一个具有以下属性的 DynamoDB 表,以记录来自虚拟气象传感器设备的数据:

  • sample_time 是主键,描述了记录样本的时间。

  • device_id 是排序键,描述了提供示例的设备

  • device_data 是从设备接收并由规则查询语句格式化的数据

如需为本教程创建 DynamoDB 表
  1. 打开 DynamoDB 控制台,然后选择 Create table(创建表格)。

  2. Create table(创建表)中:

    1. Table name(表名称)框中输入表名:wx_data

    2. Partition key(分区键)中,输入 sample_time,然后在字段旁边的选项列表中,选择 Number

    3. Sort key(排序键)中,输入 device_id,然后在字段旁边的选项列表中,选择 Number

    4. 在页面底部,选择 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 规则
  1. 打开 Amazon IoT 控制台的规则中心。或者,您可以在中打开 Amazon IoT 主页 Amazon Web Services Management Console 并导航到 “消息路由” > “规则”。

  2. 要开始在 Rules(规则)中创建新规则,请选择 Create rule(创建规则)。

  3. Rule properties(规则属性)中:

    1. Rule name(规则名称)中,输入 wx_data_ddb

      请记住,规则名称在您的 Amazon Web Services 账户 和区域内必须是唯一的,并且不能有任何空格。我们在此名称中使用了下划线字符来分隔规则名称中的两个单词。

    2. Rule description(规则描述)中,描述规则。

      有意义的描述可以更容易地记住此规则的作用以及您创建它的原因。描述可以根据需要延长,因此请尽可能详细。

  4. 选择下一步以继续。

  5. SQL statement(SQL 语句)中:

    1. SQL version(SQL 版本)中,选择 2016-03-23

    2. SQL statement(SQL 语句)编辑框中,输入语句:

      SELECT temperature, humidity, barometer, wind.velocity as wind_velocity, wind.bearing as wind_bearing, FROM 'device/+/data'

      本语句:

      • 侦听主题符合 device/+/data主题筛选条件的 MQTT 消息。

      • wind属性的元素格式化为单个属性。

      • 传递 temperaturehumiditybarometer 属性,使其保持不变。

  6. 选择下一步以继续。

  7. Rule actions(规则操作)中:

    1. 要打开此规则的规则操作列表,请在 Action 1(操作 1)中,选择 DynamoDB

      注意

      确保选择 DynamoDB 而不是 DynamoDBv2 作为规则操作。

    2. Table name(表名称)中,选择在上一步中创建的 DynamoDB 表的名称:wx_data

      Partition key type(分区键类型)和 Sort key type(排序键类型)字段将使用 DynamoDB 表中的值填充。

    3. 分区键中,输入 sample_time

    4. 分区键值中,输入 ${timestamp()}

      这是您将在此规则中使用第一个 替换模板。它将使用 timestamp 函数返回的值,而不是消息负载中的值。要了解更多信息,请参阅《Amazon IoT Core 开发人员指南》中的时间戳

    5. Sort key(排序键)中,输入 device_id

    6. 排序键值中,输入 ${cast(topic(2) AS DECIMAL)}

      这是您将在此规则中使用的第二个 替换模板。它将第二个元素的值插入到主题名称,即设备的 ID,后面其将投射为十进制值以匹配密钥的数字格式。要了解有关主题的更多信息,请参阅《Amazon IoT Core 开发人员指南》中的主题。或者,要了解有关强制转换的更多信息,请参阅《Amazon IoT Core 开发人员指南》中的强制转换

    7. Write message data to this column (将消息数据写入到此列) 中,输入 device_data

      这将在 DynamoDB 表中创建 device_data列。

    8. Operation (操作) 留空。

    9. IAM Role(IAM 角色)中,选择 Create new role(创建新角色)。

    10. Create role(创建角色)对话框中,为 Role name(角色名称)输入 wx_ddb_role。这个新角色将自动包含前缀为 “aws-iot-rule” 的策略,该策略将允许该wx_data_ddb规则将数据发送到您创建的 D wx_data ynamoDB 表。

    11. IAM role(IAM 角色)中,选择 wx_ddb_role

    12. 在页面底部,选择 Next

  8. Review and create(审核和创建)页面的底部,选择 Create(创建)以创建规则。

步骤 3:测试 Amazon IoT 规则和 DynamoDB 表

要测试新规则,您将使用 MQTT 客户端发布和订阅此测试中使用的 MQTT 消息。

在新窗口中打开 Amazon IoT 控制台中的 MQTT 客户端。这将允许您在不丢失 MQTT 客户端配置的情况下编辑规则。如果您让其转到控制台中的其它页面,MQTT 客户端不会保留任何订阅或消息日志。您还需要在控制台的 D ynamoDB 表中心打开一个单独的控制台窗口 Amazon IoT ,以查看您的规则发送的新条目。

如需使用 MQTT 客户端来测试您的规则
  1. Amazon IoT 控制台中的 MQTT 客户端中,订阅输入主题,device/+/data

    1. 在 MQTT 客户端中,选择 Subscribe to a topic(订阅主题)。

    2. 对于 Topic filter(主题筛选条件)中,输入输入主题筛选条件的主题,device/+/data

    3. 选择订阅

  2. 现在,使用特定设备 ID device/22/data向输入主题发布消息。您无法发布到包含通配符的 MQTT 主题。

    1. 在 MQTT 客户端中,选择 Publish to a topic(发布到主题)。

    2. 对于 Topic name(主题名称),输入输入主题名称 device/22/data

    3. 对于 Message payload(消息负载),输入以下示例数据。

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. 要发布 MQTT 消息,请选择 Publish(发布)。

    5. 现在,在 MQTT 客户端中,选择 Subscribe to a topic(订阅主题)。在 Subscribe(订阅)列中,选择 device/+/data订阅。确认上一步骤中的示例数据是否显示在此处。

  3. 检查以查看您的规则创建的 DynamoDB 表中的行。

    1. 在控制台的 D ynamoDB 表中心中 Amazon IoT选择 wx_data,然后选择项目选项卡。

      如果您已经在 Items(项目)选项卡上,则可能需要通过选择表格标题右上角的刷新图标来刷新显示。

    2. 请注意,表中的 sample_time 值是链接,请打开一个。如果您刚刚发送了第一条消息,那么这将是列表中唯一的消息。

      此链接显示表的该行中所有的数据。

    3. 展开 device_data 条目以查看规则查询语句生成的数据。

    4. 浏览此显示中可用数据的不同表示形式。您也可以编辑此显示中的数据。

    5. 查看完此行数据后,要保存所做的任何更改,请选择 Save(保存),或者要退出而不保存任何更改,请选择 Cancel(取消)。

如果您未看到正确的行为,请检查故障排除提示。

故障排除 DynamoDB 规则

如果您没有看到期望的结果,可检查以下事项。

  • 您收到了一个错误的广告条

    如果在您发布输入消息时出现错误,请先更正该错误。以下步骤可帮助您更正此错误。

  • 您未在 MQTT 客户端中看到输入消息

    每次将输入消息发布到 device/22/data主题时,如果您如流程中所述订阅了 device/+/data主题筛选条件,则消息应当会在 MQTT 客户端中显示。

    要检查的事项
    • 检查您订阅的主题筛选条件

      如果您如流程中所述订阅了输入消息主题,则每次发布输入消息时都应看到该输入消息的副本。

      如果没有看到该消息,请检查您订阅的主题名称,并将其与您发布的主题进行比较。主题名称区分大小写,您订阅的主题必须与发布消息负载的主题相同。

    • 检查消息发布函数

      在 MQTT 客户端中,在 Subscriptions(订阅)项下,选择device/+/data,检查发布消息的主题,然后选择 Publish to topic(发布到主题)。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。

  • 您在 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 函数格式化通知