本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:重新发布消息 MQTT
本教程演示如何创建在收到指定MQTT消息时发布MQTT消息的 AWS IoT 规则。可以在发布之前通过规则修改传入的消息负载。这样就可以创建针对特定应用程序量身定制的消息,而无需更改设备或固件。您还可以使用规则的筛选功能仅在满足特定条件时发布消息。
通过规则重新发布的消息就像任何其他 AWS IoT 设备或客户端发送的消息一样。设备可以像订阅任何其他消息主题一样订阅重新发布的MQTT消息。
您将在本教程中学到的内容:
-
如何在规则SQL查询语句中使用简单的查询和函数
-
如何使用MQTT客户端测试 AWS IoT 规则
完成本教程需要大约 30 分钟。
在开始本教程之前,请确保您具有:
-
设置 AWS 账户
你需要你的 AWS 账户 和 AWS IoT 主机才能完成本教程。
-
审核 通过 AWS IoT MQTT客户端查看MQTT消息
请务必使用MQTT客户端订阅和发布主题。在此过程中,您将使用MQTT客户端来测试您的新规则。
查看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消息时,这些元素会按如下方式对消息进行操作。
步骤 1:创建重新发布消息的 AWS IoT MQTT规则
你将在本教程中创建的 AWS IoT 规则订阅以下device/
MQTT主题 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 } }
该规则从消息负载和主题device_id
中获取temperature
值,然后将它们重新发布为带有device/data/temp
主题和MQTT消息负载的消息,如下所示:
{ "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(规则查询语句)中:
-
在使用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(添加操作)。
-
在 “选择操作” 中,选择 “将消息重新发布到 AWS IoT 主题”。
-
在操作列表底部,选择 Configure action(配置操作)以打开选定操作的配置页面。
-
-
在 Configure action(配置操作)中:
-
在 Topic(主题)中输入
device/data/temp
。这是该规则将发布的消息MQTT的主题。 -
在 Quality of Service(服务质量)中,选择 0 - The message is delivered zero or more times(0-消息传递零次或多次)。
-
在选择或创建角色以授予执行此操作的 AWS IoT 访问权限中:
-
请选择 Create Role(创建角色)。Create a new role(创建新角色)对话框打开。
-
输入描述新角色的名称。在本教程中,请使用
republish_role
。创建新角色时,将创建用于执行规则操作的正确策略并将其附加到新角色。如果更改此规则操作的主题或在其它规则操作中使用此角色,则必须更新该角色的策略以授权新主题或操作。要更新现有角色,请在本部分中选择 Update role(更新角色)。
-
选择 Create Role(创建角色)以创建角色并关闭对话框。
-
-
选择 Add action(添加操作)将操作添加到规则并返回到 Create a rule(创建规则)页。
-
-
“将消息重新发布到 AWS IoT 主题” 操作现在列在 “设置一个或多个操作” 中。
在新动作的磁贴中,在 Republish a message to an AWS IoT topic(将消息重新发布至 IoT 主题)下,您可以看到重新发布操作将发布到的主题。
这是您将添加到此规则的唯一规则操作。
-
在 Create a rule(创建规则)中,向下滚动到底部,然后选择 Create rule(创建规则)以创建规则并完成此步骤。
步骤 2:测试您的新规则
要测试您的新规则,您需要使用MQTT客户端发布和订阅此规则使用的MQTT消息。
在新窗口中打开 AWS IoT
控制台中的MQTT客户端
使用MQTT客户端测试您的规则
-
在AWS IoT 控制台的MQTT客户端中
,订阅输入主题,在本例中为 device/+/data
。-
在MQTT客户端的 “订阅” 下,选择 “订阅主题”。
-
在 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客户端的 “订阅” 下,选择 “发布到主题”。
-
在 Publish(发布)字段中,输入输入主题名称,
device/22/data
。 -
复制此处显示的示例数据,然后在主题名称下方的编辑框中粘贴示例数据。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
要发送MQTT消息,请选择发布到主题。
-
-
查看已发送的消息。
-
在MQTT客户端中,在 “订阅” 下,您之前订阅的两个主题旁边有一个绿点。
绿色圆点表示自您上次查看它们以来已收到一条或多条新消息。
-
在 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客户端的 “订阅” 下,选择 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 通知。
本教程中使用的“重新发布规则”操作也可以帮助您调试规则查询语句。例如,您可以将此操作添加到规则中,以查看其规则查询语句如何设置规则操作所使用的数据的格式。