教程:发送 Amazon SNS 通知 - AWS IoT Core

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

教程:发送 Amazon SNS 通知

本教程演示如何创建 AWS IoT 规则,将MQTT消息数据发送到 Amazon SNS 主题,以便可以将其作为SMS短信发送。

在本教程中,您将创建一条规则,每当温度超过规则中设置的值时,就会将来自天气传感器的消息数据发送给 Amazon SNS 主题的所有订阅者。当报告的温度超过规则设置的值时,规则会检测到,并创建一个新的消息负载,其中仅包含设备 ID、报告的温度和超出的温度限制。该规则将新的消息负载作为JSON文档发送到SNS主题,该主题会通知该SNS主题的所有订阅者。

您将在本教程中学到的内容:
  • 如何创建和测试 Amazon SNS 通知

  • 如何根据 AWS IoT 规则调用 Amazon SNS 通知

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

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

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

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

步骤 1:创建用于发送SMS短信的 Amazon SNS 主题

此过程介绍如何创建您的天气传感器可以向其发送消息数据的 Amazon SNS 主题。然后,Amazon SNS 主题将通过SMS短信通知所有订阅者已超过温度限制。

创建发送SMS短信的 Amazon SNS 主题
  1. 创建 Amazon SNS 主题。

    1. 登录 Amazon SNS 控制台

    2. 在左侧导航窗格中,选择主题

    3. Topics(主题)页面上,选择 Create topic(创建主题)。

    4. Details(详细信息)中,选择 Standard(标准)类型。默认情况下,控制台会创建一个FIFO主题。

    5. 名称中,输入SNS主题名称。在本教程中,请输入 high_temp_notice

    6. 滚动到页面底部,然后选择 Create topic(创建主题)。

      控制台会打开新主题的详细信息页面。

  2. 创建 Amazon SNS 订阅。

    注意

    您将在本教程中发送的消息可能会使您在此订阅中使用的电话号码产生短信费用。

    1. high_temp_notice 主题详细信息页面上,选择 Create subscription(创建订阅)。

    2. 创建订阅详细信息部分的协议列表中,选择SMS

    3. Endpoint(端点)中,输入可接收文本消息的电话号码。请务必输入号码,以 +开头,包含国家和地区代码,并且不包括任何其它标点符号字符。

    4. 选择 Create subscription(创建订阅)。

  3. 测试 Amazon SNS 通知。

    1. Amazon SNS 控制台的左侧导航窗格中,选择主题

    2. 要打开主题的详细信息页面,请在 Topics(主题),在主题列表中,选择 high_temp_notice

    3. 打开 Publish message to topic(将消息发布到主题)页面中的 high_temp_notice详细信息页面,选择 Publish message(发布消息)。

    4. Publish message to topic(将消息发布到主题),在 Message body(消息正文)部分,Message body to send to the endpoint(要发送到端点的消息正文)中,输入一条简短的消息。

    5. 滚动到页面底部并选择 Publish message(发布消息)。

    6. 在使用您之前创建订阅时使用的号码的电话上,确认已收到消息。

    如果您没有收到测试消息,请仔细检查电话号码和手机的设置。

    在继续本教程之前,请确保您可以从 Amazon SNS 控制台发布测试消息。

步骤 2:创建发送短信的 AWS IoT 规则

您将在本教程中创建的 AWS IoT 规则将订阅以下device/device_id/dataMQTT主题,其中device_id是发送消息的设备的 ID。这些主题在主题筛选条件中描述为 device/+/data,其中,+ 是匹配两个正斜杠字符之间的任何字符串的通配符。此规则还测试消息负载中的 temperature字段值。

当规则收到来自匹配主题的消息时,它会device_id从主题名称中提取值,从消息负载中获取temperature值,然后为正在测试的限制添加一个常量值,然后将这些值作为JSON文档发送到 Amazon SNS 通知主题。

例如,来自气象传感器设备编号 32 的MQTT消息使用该device/32/data主题,其消息负载如下所示:

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

规则的规则查询语句从消息负载中获取temperature值,从主题名称device_id中获取值,然后将常量max_temperature值相加,将如下所示的消息有效负载发送到 Amazon SNS 主题:

{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30 }
创建用于检测超限温度值的 AWS IoT 规则并创建要发送到 Amazon SNS 主题的数据
  1. 打开AWS IoT 控制台的 “规则” 中心

  2. 如果这是您的第一条规则,请选择 Create(创建),或者 Create a rule(创建规则)。

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

    1. Name(名称)中,输入 temp_limit_notify

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

    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 as reported_temperature, 30 as max_temperature FROM 'device/+/data' WHERE temperature > 30

      本语句:

      • 监听主题与device/+/data主题筛选条件匹配且temperature值大于 30 的MQTT消息。

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

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

      • 创建常数值 30来表示限制值,并将其赋值给 max_temperature字段。

  5. 要打开此规则的规则操作列表,请在 Set one or more actions(设置一个或多个操作)中,选择 Add action(添加操作)。

  6. “选择操作” 中,选择 “以SNS推送通知形式发送消息”

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

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

    1. SNS目标中,选择选择,找到名为 high_temp_notice SNS 的主题,然后选择选择。

    2. 在 “消息格式” 中,选择RAW

    3. 选择或创建角色以授予执行此操作的 AWS IoT 访问权限中,选择创建角色

    4. Create a new role(创建新角色)中,Name(名称)项下,输入新角色的唯一名称。在本教程中,请使用 sns_rule_role

    5. 选择 Create role(创建角色)。

    如果要重复本教程或重复使用现有角色,请选择 Update role(更新角色)然后再继续。这会更新角色的策略文档以与SNS目标配合使用。

  9. 选择 Add action(添加操作),然后返回到 Create a rule(创建规则)页。

    在新操作的图块中,在 “以SNS推送通知形式发送消息” 下方,您可以看到您的规则将调用的SNS主题。

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

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

第 3 步:测试 AWS IoT 规则和 Amazon SNS 通知

要测试您的新规则,您需要使用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. 使用特定设备 ID device/32/data向输入主题发布消息。您无法发布到包含通配符的MQTT话题。

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

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

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

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. 选择 “发布到主题” 以发布您的MQTT消息。

  3. 确认文本消息已发送。

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

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

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

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    3. 检查您用来订阅该SNS主题的手机,并确认消息负载的内容如下所示:

      {"device_id":"32","reported_temperature":38,"max_temperature":30}

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

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

      cast(topic(2) AS DECIMAL)

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

  4. 尝试发送MQTT一条温度不超过极限的消息。

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

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

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

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

    您应该会看到您在 device/+/data订阅中发送的消息。但是,由于温度值低于规则查询语句中的最大温度,因此您应无法收到文本消息。

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

对您的SNS留言规则进行故障排除

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

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

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

  • 你在MQTT客户端中看不到输入消息

    如果您按照步骤中所述订阅了device/22/data主题筛选器,则每次向device/+/data主题发布输入消息时,该消息都应出现在MQTT客户端中。

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

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

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

    • 检查消息发布函数

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

  • 你没有收到SMS消息

    要使您的规则生效,它必须有正确的策略来授权它接收消息和发送SNS通知,并且它必须接收消息。

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

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

    • 检查消息负载中的温度值是否超过测试阈值

      如果温度值小于或等于 30(如规则查询语句中定义),则规则将不会执行其任何操作。

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

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

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

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

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

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

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

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

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

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

    • 检查规则所使用的角色

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

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

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

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

在本教程中:
  • 您创建并测试了 Amazon SNS 通知主题和订阅。

  • 您使用规则SQL查询语句中的简单查询和函数为通知创建了一条新消息。

  • 您创建了使用您的自定义消息负载发送 Amazon SNS 通知的 AWS IoT 规则。

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

后续步骤

使用此规则发送了几条文本消息后,请尝试使用它来了解更改教程的某些方面如何影响消息以及发送消息的时间。以下想法可以帮助您开始操作。

  • 改变 device_id 在输入消息的主题中,然后观察短信内容中的效果。

  • 更改规则查询语句中选定的字段,并观察文本消息内容中的效果。

  • 将规则查询语句中的测试更改为测试最低温度而不是最高温度。记得更改 max_temperature名称!

  • 添加重新发布规则操作,以便在发送SNS通知时发送MQTT消息。

  • 尝试本系列中的下一个教程,了解如何 教程:将设备数据存储在 DynamoDB 表中