重新发布 MQTT 消息 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

重新发布 MQTT 消息

本教程演示如何创建 Amazon IoT 规则,该规则在收到指定的 MQTT 消息时发布 MQTT 消息。传入消息负载可以在发布之前按规则对其进行修改,从而可以创建针对特定应用程序量身定制的消息,而无需更改设备或其固件。您还可以使用规则的筛选功能仅在满足特定条件时发布消息。

通过规则重新发布的消息行为类似于任何其他 Amazon IoT 设备或客户端发送的消息。设备可以订阅重新发布的消息,就像订阅任何其他 MQTT 消息主题一样。

您将在本教程中学到的内容:

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

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

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

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

查看 MQTT 主题和 Amazon IoT 规则

在谈论 Amazon IoT 规则之前,它有助于了解 MQTT 协议。在 IoT 解决方案中,MQTT 协议相比于其他网络通信协议(如 HTTP)更具优势,这使得它成为 IoT 设备使用的常用选择。本部分回顾了 MQTT 的关键方面,因为它们适用于本教程。有关如何将 MQTT 与 HTTP 进行比较的信息,请参阅 为设备通信选择协议

MQTT 协议

MQTT 协议在其主机上使用发布/订阅通信模式。要发送数据,设备会将主题标识的消息发布到 Amazon IoT 消息代理。要接收来自消息代理的消息,设备通过在订阅请求中向消息代理发送主题筛选条件来订阅其将接收的主题。Amazon IoT 规则引擎从消息代理接收 MQTT 消息。

Amazon IoT 规则

Amazon IoT 规则由规则查询语句和一个或多个规则操作组成。当 Amazon IoT 规则引擎接收 MQTT 消息,则这些元素将按如下方式操作消息。

  • 规则查询语句

    规则的查询语句描述了要使用的 MQTT 主题,解释消息负载中的数据,并按类似于常用 SQL 数据库使用的语句的 SQL 语句的描述设置数据的格式。查询语句的结果是发送到规则操作的数据。

  • 规则操作

    规则中的每个规则操作都会对规则的查询语句生成的数据进行操作。Amazon IoT 支持许多规则操作. 但是,在本教程中,您将专注于 Republish 规则操作,该操作将查询语句的结果发布为带有特定主题的 MQTT 消息。

创建 Amazon IoT 重新发布 MQTT 消息的规则

您将在本教程中为 device/device_id/data MQTT 主题创建的 Amazon IoT 规则,其中 device_id 是发送消息的设备的 ID。这些主题由主题筛选条件描述为 device/+/data,其中,+ 是匹配两个正斜杠字符之间的任何字符串的通配符。

当规则收到来自匹配主题的消息时,它会取出 device_idtemperature 的值,并以 device/data/temp 主题将它们重新发布为新的 MQTT 消息。

例如,具有 device/22/data 主题的 MQTT 消息负载如下所示:

{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }

该规则将 temperature 值从消息负载中取出,将 device_id 从主题中取出,并将其作为 MQTT 消息以 device/data/temp 为主题和类似下面这样的消息负载重新发布:

{ "device_id": "22", "temperature": 28 }

使用此规则,只需要设备 ID 和温度数据的设备会订阅 device/data/temp 主题以仅接收该信息。

创建重新发布 MQTT 消息的规则

  1. 打开 Amazon IoT 控制台的 Rules(规则)页面

  2. Rules(规则)中,选择 Create(创建)并开始创建新规则。

  3. Create a rule(创建规则)顶部:

    1. Name(名称)下,输入规则的名称。在本教程中,将其命名为 republish_temp

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

    2. Description(说明)中,描述规则。

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

  4. Create a rule(创建规则)的 Rule query statement(规则查询语句)中:

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

    2. Rule query statement(规则查询语句)编辑框中,输入语句:

      SELECT topic(2) as device_id, temperature FROM 'device/+/data'

      本语句:

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

      • 从主题字符串中选择第二个元素,并将其分配给 device_id 字段。

      • 从消息负载中选择 temperature 字段的值,并将其分配给 temperature 字段。

  5. Set one or more actions(设置一个或多个操作)中:

    1. 要打开此规则的规则操作列表,请选择 Add action(添加操作)。

    2. Select an action(选择操作)中,选择 Republish a message to an Amazon IoT topic(将消息重新发布至 IoT 主题).

    3. 在操作列表底部,选择 Configure action(配置操作)以打开选定操作的配置页面。

  6. Configure action(配置操作)中:

    1. Topic(主题)中输入 device/data/temp。这是此规则将发布的消息 MQTT 主题。

    2. Quality of Service(服务质量)中,选择 0 - The message is delivered zero or more times(0-消息传递零次或多次)。

    3. Choose or create a role to grant Amazon IoT access to perform this action(选择或创建角色以向 IoT 授予执行此操作的权限)下:

      1. 选择 Create Role(创建角色)。Create a new role(创建新角色)对话框打开。

      2. 输入描述新角色的名称。在本教程中,请使用 republish_role

        创建新角色时,将创建用于执行规则操作的正确策略并将其附加到新角色。如果更改此规则操作的主题或在其他规则操作中使用此角色,则必须更新该角色的策略以授权新主题或操作。要更新现有角色,请在本部分中选择 Update role(更新角色)。

      3. 选择 Create Role(创建角色)以创建角色并关闭对话框。

    4. 选择 Add action(添加操作)将操作添加到规则并返回到 Create a rule(创建规则)页。

  7. Republish a message to an Amazon IoT topic(将消息重新发布到 IoT 主题)操作现在列于 Set one or more actions(设置一个或多个操作)。

    在新动作的磁贴中,在 Republish a message to an Amazon IoT topic(将消息重新发布至 IoT 主题)下,您可以看到重新发布操作将发布到的主题。

    这是您将添加到此规则的唯一规则操作。

  8. Create a rule(创建规则)中,向下滚动到底部,然后选择 Create rule(创建规则)以创建规则并完成此步骤。

测试您的新规则

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

在新窗口中打开 Amazon IoT 控制台中的 MQTT 客户端。这将允许您在不丢失 MQTT 客户端配置的情况下编辑规则。如果您让其转到控制台中的其他页面,MQTT 客户端不会保留任何订阅或消息日志。

如需使用 MQTT 客户端来测试您的规则

  1. Amazon IoT 控制台中的 MQTT 客户端中,订阅输入主题,在本例中为 device/+/data

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

    2. Subscription topic(订阅主题)中,输入输入主题筛选条件的主题,device/+/data

    3. 将其他字段保留为原定设置。

    4. 选择 Subscribe to topic(订阅主题)。

      Subscriptions(订阅)栏,在 Publish to a topic(发布到主题)项下,将会显示 device/+/data

  2. 订阅您的规则将发布的主题:device/data/temp

    1. Subscriptions(订阅)中,再次选择 Subscribe to a topic(订阅主题),并在 Subscription topic(订阅主题)中,输入重新发布消息的主题,device/data/temp

    2. 将其他字段保留为原定设置。

    3. 选择 Subscribe to topic(订阅主题)。

      Subscriptions(订阅)栏,在 device/+/data 下,将会显示 device/data/temp

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

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

    2. Publish(发布)字段中,输入输入主题名称,device/22/data

    3. 复制此处显示的示例数据,然后在主题名称下方的编辑框中粘贴示例数据。

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. 要发送您的 MQTT 消息,请选择 Publish to topic(发布到主题)。

  4. 查看已发送的消息。

    1. 在 MQTT 客户端中,在 Subscriptions(订阅)项下,您之前订阅的两个主题旁边有一个绿点。

      绿色圆点表示自您上次查看它们以来已收到一条或多条新消息。

    2. Subscriptions(订阅)中,选择 device/+/data 来检查消息负载是否与刚刚发布的内容匹配,如下所示:

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    3. Subscriptions(订阅)中,选择 device/data/temp 来检查重新发布的消息负载,如下所示:

      { "device_id": "22", "temperature": 28 }

      请注意,device_id 值是一个带引号的字符串,temperature 值为数字。这是因为 topic() 函数从输入消息的主题名称中提取字符串,而 temperature 值使用输入消息负载中的数值。

      如果您想使 device_id 值为数值,请在规则查询语句中将 topic(2) 替换为:

      cast(topic(2) AS DECIMAL)

      请注意,将 topic(2) 值设置为数字值仅在主题的该部分仅包含数字字符时才起作用。

  5. 如果您看到正确的消息已发布到 device/data/temp 主题,那么您的规则已起作用。请在下一部分中了解有关“重新发布规则”操作的更多信息。

    如果您没有看到正确的消息发布到 device/+/data 或者 device/data/temp 主题中,请查看故障排除提示。

重新发布消息规则疑难解答

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

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

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

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

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

    要检查的事项

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

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

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

    • 检查消息发布函数

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

  • 您未在 MQTT 客户端中看到您的重新发布的消息

    要使规则起作用,规则必须具有授权其接收和重新发布消息的正确策略,并且必须接收消息。

    要检查的事项

    • 检查 MQTT 客户端的 Amazon Web Services 区域 和您创建的规则

      您在其中运行 MQTT 客户端的控制台必须位于您所创建规则的同一 Amazon 区域。

    • 检查规则查询语句中的输入消息主题

      要使规则起作用,它必须收到一条消息,消息主题名称应与规则查询语句 FROM 子句中的主题筛选条件相匹配。

      检查规则查询语句中主题筛选条件的拼写与 MQTT 客户端中主题的拼写。主题名称区分大小写,消息的主题必须与规则查询语句中的主题筛选条件匹配。

    • 检查输入消息负载的内容

      要使规则起作用,则必须在 SELECT 语句中声明的消息负载中找到数据字段。

      检查规则查询语句 temperature 字段中的拼写与 MQTT 客户端中消息负载的拼写。字段名称区分大小写,规则查询语句中 temperature 字段必须与消息负载中的 temperature 字段相同。

      确保消息负载中的 JSON 文档格式正确。如果 JSON 有任何错误(例如缺少逗号),则规则将无法读取它。

    • 在规则操作中检查重新发布的消息主题

      重新发布规则操作向其发布新消息的主题必须与您在 MQTT 客户端中订阅的主题匹配。

      在控制台中打开您创建的规则,然后检查规则操作将重新发布消息的主题。

    • 检查规则所使用的角色

      规则操作必须具有接收原始主题和发布新主题的权限。

      授权规则接收消息数据并重新发布的策略特定于所使用的主题。如果更改用于重新发布消息数据的主题,则必须更新规则操作的角色,以更新其策略来匹配当前主题。

      如果怀疑这里出现了问题,请编辑“重新发布”规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。

查看结果和后续步骤

在本教程中:

  • 您在规则查询语句中使用了一个简单的 SQL 查询和几个函数来生成新的 MQTT 消息。

  • 您创建了重新发布该新消息的规则。

  • 您可以使用 MQTT 客户端来测试您的 Amazon IoT 规则。

后续步骤

使用此规则重新发布几条消息后,请尝试使用该规则进行实验,以了解更改教程的某些方面如何影响重新发布的消息。以下想法可以帮助您开始操作。

  • 在输入消息的主题中更改 device_id,并观察重新发布的消息负载中的效果。

  • 更改规则查询语句中选定的字段,并观察重新发布的消息负载中的效果。

  • 尝试本系列中的下一个教程,了解如何 发送 Amazon SNS 通知

本教程中使用的“重新发布规则”操作也可以帮助您调试规则查询语句。例如,您可以将此操作添加到规则中,以查看其规则查询语句如何设置规则操作所使用的数据的格式。