教程:重新发布消息 MQTT - AWS IoT Core

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

教程:重新发布消息 MQTT

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

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

您将在本教程中学到的内容:
  • 如何在规则SQL查询语句中使用简单的查询和函数

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

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

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

查看MQTT主题和 AWS IoT 规则

在谈论 AWS IoT 规则之前,了解MQTT协议会有所帮助。在物联网解决方案中MQTT,与其他网络通信协议相比,该协议具有一些优势HTTP,例如,这使其成为物联网设备使用的热门选择。本节回顾了适用于本教程的MQTT关键方面。有关与的MQTT比较结果的信息HTTP,请参阅为设备通信选择应用协议

MQTT协议

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

AWS IoT 规则

AWS IoT 规则由规则查询语句和一个或多个规则操作组成。当 AWS IoT 规则引擎收到MQTT消息时,这些元素会按如下方式对消息进行操作。

  • 规则查询语句

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

  • 规则操作

    规则中的每个规则操作都对规则的查询语句生成的数据起作用。 AWS IoT 支持许多规则操作。但是,在本教程中,您将重点介绍Republish规则操作,该操作将查询语句的结果作为带有特定主题的MQTT消息发布。

步骤 1:创建重新发布消息的 AWS IoT MQTT规则

你将在本教程中创建的 AWS IoT 规则订阅以下device/device_id/dataMQTT主题 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 } }

该规则从消息负载和主题device_id中获取temperature值,然后将它们重新发布为带有device/data/temp主题和MQTT消息负载的消息,如下所示:

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

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

创建重新发布消息的MQTT规则
  1. 打开AWS IoT 控制台的 “规则” 中心

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

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

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

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

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

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

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

    1. 使用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. “选择操作” 中,选择 “将消息重新发布到 AWS 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. 选择或创建角色以授予执行此操作的 AWS IoT 访问权限中:

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

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

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

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

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

  7. “将消息重新发布到 AWS IoT 主题” 操作现在列在 “设置一个或多个操作” 中。

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

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

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

步骤 2:测试您的新规则

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

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

使用MQTT客户端测试您的规则
  1. AWS IoT 控制台的MQTT客户端中,订阅输入主题,在本例中为device/+/data

    1. 在MQTT客户端的 “订阅” 下,选择 “订阅主题”。

    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客户端的 “订阅” 下,选择 “发布到主题”。

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

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

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. 要发送MQTT消息,请选择发布到主题

  4. 查看已发送的消息。

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

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

    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客户端的 “订阅” 下,选择 device/+/data,选中发布消息的主题,然后选择发布到主题。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。

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

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

    要检查的事项
    • 检查 AWS 区域 您的MQTT客户端和您创建的规则

      您运行MQTT客户端的控制台必须与您创建的规则位于同一 AWS 区域。

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

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

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

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

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

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

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

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

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

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

    • 检查规则所使用的角色

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

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

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

步骤 3:查看结果和后续步骤

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

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

  • 你使用MQTT客户端来测试你的 AWS IoT 规则。

后续步骤

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

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

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

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

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