本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:重新发布 MQTT 消息
本教程演示如何创建 AWS IoT规则,该规则在收到指定的 MQTT 消息时发布 MQTT 消息。可以在发布之前通过规则修改传入的消息负载。这样就可以创建针对特定应用程序量身定制的消息,而无需更改设备或固件。您还可以使用规则的筛选功能仅在满足特定条件时发布消息。
通过规则重新发布的消息行为类似于任何其它 AWS IoT设备或客户端发送的消息。设备可以订阅重新发布的消息,就像订阅任何其它 MQTT 消息主题一样。
您将在本教程中学到的内容:
-
如何在规则查询语句中使用简单的 SQL 查询和函数
-
如何使用 MQTT 客户端来测试 AWS IoT规则
完成本教程需要大约 30 分钟。
在开始本教程之前,请确保您具有:
-
设置 AWS 账户
您将需要用到您的 AWS 账户和 AWS IoT控制台以完成本教程。
-
审核 通过 AWS IoT MQTT客户端查看MQTT消息
请确保您可以使用 MQTT 客户端订阅和发布主题。您将使用 MQTT 客户端在此流程中测试新规则。
查看 MQTT 主题和 AWS IoT规则
在谈论 AWS IoT规则之前,它有助于了解 MQTT 协议。在 IoT 解决方案中,MQTT 协议相比于其它网络通信协议(如 HTTP)更具优势,这使得它成为 IoT 设备使用的常用选择。本部分回顾了 MQTT 的关键方面,因为它们适用于本教程。有关如何将 MQTT 与 HTTP 进行比较的信息,请参阅 为设备通信选择应用程序协议。
MQTT 协议
MQTT 协议在其主机上使用发布/订阅通信模式。要发送数据,设备会将主题标识的消息发布到 AWS IoT消息代理。要接收来自消息代理的消息,设备通过在订阅请求中向消息代理发送主题筛选条件,来订阅其将接收的主题。AWS IoT 规则引擎从消息代理接收 MQTT 消息。
AWS IoT 规则
AWS IoT 规则由规则查询语句和一个或多个规则操作组成。当 AWS IoT规则引擎接收 MQTT 消息,则这些元素将按如下方式操作消息。
步骤 1:创建重新发布 MQTT 消息的 AWS IoT规则
您将在本教程中为 device/
MQTT 主题创建的 AWS IoT规则,其中 device_id
/datadevice_id
是发送消息的设备的 ID。这些主题由主题筛选条件描述为 device/+/data
,其中,+
是匹配两个正斜杠字符之间的任何字符串的通配符。
当规则收到来自匹配主题的消息时,它会重新发布 device_id
和 temperature
的值,以 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 消息的规则
-
在 Rules(规则)中,选择 Create(创建)并开始创建新规则。
-
在 Create a rule(创建规则)顶部:
-
在 Name(名称)下,输入规则的名称。在本教程中,将其命名为
republish_temp
。请记住,规则名称在您的账户和区域中必须唯一,并且不能包含任何空格 我们在此名称中使用了下划线字符来分隔规则名称中的两个单词。
-
在 Description(说明)中,描述规则。
有意义的描述可以帮助您记住此规则的作用以及您创建它的原因。描述可以根据需要延长,因此请尽可能详细。
-
-
在 Create a rule(创建规则)的 Rule query statement(规则查询语句)中:
-
在 Using SQL version(使用 SQL 版本)中,选择
2016-03-23
。 -
在 Rule query statement(规则查询语句)编辑框中,输入语句:
SELECT topic(2) as device_id, temperature FROM 'device/+/data'
本语句:
-
侦听主题符合
device/+/data
主题筛选条件的 MQTT 消息。 -
从主题字符串中选择第二个元素,并将其分配给
device_id
字段。 -
从消息负载中选择
temperature
字段的值,并将其分配给temperature
字段。
-
-
-
在 Set one or more actions(设置一个或多个操作)中:
-
要打开此规则的规则操作列表,请选择 Add action(添加操作)。
-
在 Select an action(选择操作)中,选择 Republish a message to an AWS IoTtopic(将消息重新发布至 IoT 主题)。
-
在操作列表底部,选择 Configure action(配置操作)以打开选定操作的配置页面。
-
-
在 Configure action(配置操作)中:
-
在 Topic(主题)中输入
device/data/temp
。这是此规则将发布的消息 MQTT 主题。 -
在 Quality of Service(服务质量)中,选择 0 - The message is delivered zero or more times(0-消息传递零次或多次)。
-
在Choose or create a role to grant AWS IoTaccess to perform this action(选择或创建角色以向 IoT 授予执行此操作的权限)下:
-
选择 Create Role(创建角色)。Create a new role(创建新角色)对话框打开。
-
输入描述新角色的名称。在本教程中,请使用
republish_role
。创建新角色时,将创建用于执行规则操作的正确策略并将其附加到新角色。如果更改此规则操作的主题或在其它规则操作中使用此角色,则必须更新该角色的策略以授权新主题或操作。要更新现有角色,请在本部分中选择 Update role(更新角色)。
-
选择 Create Role(创建角色)以创建角色并关闭对话框。
-
-
选择 Add action(添加操作)将操作添加到规则并返回到 Create a rule(创建规则)页。
-
-
Republish a message to an AWS IoTtopic(将消息重新发布到 IoT 主题)操作现在列于 Set one or more actions(设置一个或多个操作)。
在新动作的磁贴中,在 Republish a message to an AWS IoTtopic(将消息重新发布至 IoT 主题)下,您可以看到重新发布操作将发布到的主题。
这是您将添加到此规则的唯一规则操作。
-
在 Create a rule(创建规则)中,向下滚动到底部,然后选择 Create rule(创建规则)以创建规则并完成此步骤。
步骤 2:测试您的新规则
要测试新规则,您将使用 MQTT 客户端发布和订阅此规则所使用的 MQTT 消息。
在新窗口中打开 AWS IoT控制台中的 MQTT 客户端
如需使用 MQTT 客户端来测试您的规则
-
在 AWS IoT控制台中的 MQTT 客户端
中,订阅输入主题,在本例中为 device/+/data
。-
在 MQTT 客户端中,在 Subscriptions(订阅)项下,选择 Subscribe to a topic(订阅主题)。
-
在 Subscription topic(订阅主题)中,输入输入主题筛选条件的主题,
device/+/data
。 -
将其它字段保留为默认设置。
-
选择 Subscribe to topic(订阅主题)。
在 Subscriptions(订阅)栏,在 Publish to a topic(发布到主题)项下,将会显示
device/+/data
。
-
-
订阅您的规则将发布的主题:
device/data/temp
。-
在 Subscriptions(订阅)中,再次选择 Subscribe to a topic(订阅主题),并在 Subscription topic(订阅主题)中,输入重新发布消息的主题,
device/data/temp
。 -
将其它字段保留为默认设置。
-
选择 Subscribe to topic(订阅主题)。
在 Subscriptions(订阅)栏,在 device/+/data 下,将会显示
device/data/temp
。
-
-
使用特定设备 ID
device/22/data
向输入主题发布消息。您无法发布到包含通配符的 MQTT 主题。-
在 MQTT 客户端中,在 Subscriptions(订阅)项下,选择 Subscribe to a topic(订阅主题)。
-
在 Publish(发布)字段中,输入输入主题名称,
device/22/data
。 -
复制此处显示的示例数据,然后在主题名称下方的编辑框中粘贴示例数据。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
要发送您的 MQTT 消息,请选择 Publish to topic(发布到主题)。
-
-
查看已发送的消息。
-
在 MQTT 客户端中,在 Subscriptions(订阅)项下,您之前订阅的两个主题旁边有一个绿点。
绿色圆点表示自您上次查看它们以来已收到一条或多条新消息。
-
在 Subscriptions(订阅)中,选择 device/+/data 来检查消息负载是否与刚刚发布的内容匹配,如下所示:
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
在 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)
值设置为数字值仅在主题的该部分仅包含数字字符时才起作用。
-
-
如果您看到正确的消息已发布到 device/data/temp 主题,那么您的规则已起作用。请在下一部分中了解有关“重新发布规则”操作的更多信息。
如果您没有看到正确的消息发布到 device/+/data 或者 device/data/temp 主题中,请查看故障排除提示。
重新发布消息规则疑难解答
如果您没有看到期望的结果,可检查以下事项。
-
您收到了一个错误的广告条
如果在您发布输入消息时出现错误,请先更正该错误。以下步骤可帮助您更正此错误。
-
您未在 MQTT 客户端中看到输入消息
每次将输入消息发布到
device/22/data
主题时,如果您如流程中所述订阅了device/+/data
主题筛选条件,则消息应当会在 MQTT 客户端中显示。要检查的事项
-
检查您订阅的主题筛选条件
如果您如流程中所述订阅了输入消息主题,则每次发布输入消息时都应看到该输入消息的副本。
如果没有看到该消息,请检查您订阅的主题名称,并将其与您发布的主题进行比较。主题名称区分大小写,您订阅的主题必须与发布消息负载的主题相同。
-
检查消息发布函数
在 MQTT 客户端中,在 Subscriptions(订阅)项下,选择device/+/data,检查发布消息的主题,然后选择 Publish to topic(发布到主题)。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。
-
-
您未在 MQTT 客户端中看到您的重新发布的消息
要使规则起作用,规则必须具有授权其接收和重新发布消息的正确策略,并且必须接收消息。
要检查的事项
-
检查 MQTT 客户端的 AWS 区域和您创建的规则
您在其中运行 MQTT 客户端的控制台必须位于您所创建规则的同一 AWS区域。
-
检查规则查询语句中的输入消息主题
要使规则起作用,它必须收到一条消息,消息主题名称应与规则查询语句 FROM 子句中的主题筛选条件相匹配。
检查规则查询语句中主题筛选条件的拼写与 MQTT 客户端中主题的拼写。主题名称区分大小写,消息的主题必须与规则查询语句中的主题筛选条件匹配。
-
检查输入消息负载的内容
要使规则起作用,则必须在 SELECT 语句中声明的消息负载中找到数据字段。
检查规则查询语句
temperature
字段中的拼写与 MQTT 客户端中消息负载的拼写。字段名称区分大小写,规则查询语句中temperature
字段必须与消息负载中的temperature
字段相同。确保消息负载中的 JSON 文档格式正确。如果 JSON 有任何错误(例如缺少逗号),则规则将无法读取它。
-
在规则操作中检查重新发布的消息主题
重新发布规则操作向其发布新消息的主题必须与您在 MQTT 客户端中订阅的主题匹配。
在控制台中打开您创建的规则,然后检查规则操作将重新发布消息的主题。
-
检查规则所使用的角色
规则操作必须具有接收原始主题和发布新主题的权限。
授权规则接收消息数据并重新发布的策略特定于所使用的主题。如果更改用于重新发布消息数据的主题,则必须更新规则操作的角色,以更新其策略来匹配当前主题。
如果怀疑这里出现了问题,请编辑“重新发布”规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。
-
步骤 3:查看结果和后续步骤
在本教程中:
-
您在规则查询语句中使用了一个简单的 SQL 查询和几个函数来生成新的 MQTT 消息。
-
您创建了重新发布该新消息的规则。
-
您可以使用 MQTT 客户端来测试您的 AWS IoT规则。
后续步骤
使用此规则重新发布几条消息后,请尝试使用该规则进行实验,以了解更改教程的某些方面如何影响重新发布的消息。以下想法可以帮助您开始操作。
-
在输入消息的主题中更改
device_id
,并观察重新发布的消息负载中的效果。 -
更改规则查询语句中选定的字段,并观察重新发布的消息负载中的效果。
-
尝试本系列中的下一个教程,了解如何 教程:发送 Amazon SNS 通知。
本教程中使用的“重新发布规则”操作也可以帮助您调试规则查询语句。例如,您可以将此操作添加到规则中,以查看其规则查询语句如何设置规则操作所使用的数据的格式。