【问题标题】:Is it possible to receive MQTT messages from many IoT devices using only one Lambda function?是否可以仅使用一个 Lambda 函数从多个 IoT 设备接收 MQTT 消息?
【发布时间】:2018-12-19 10:28:22
【问题描述】:

我们正在 AWS 中设置基础设施以从 IOT 设备收集数据。注册设备后,它们将开始向一些 MQTT 主题发送 json 消息。为了接收消息并解析它们并将数据保存到数据库中,我计划创建一个规则,在收到消息时触发 Lambda 函数。 Lambda 函数进行解析。

基于AWS IoT documentation,可以在物联网下创建一个规则来评估你的事物发送的消息,查询如SELECT * FROM 'mymsgs/+'。该规则似乎与任何特定设备无关。那么我可以假设它可以收听同一帐户下所有设备的主题吗?如果是这种情况,我可以只使用一个 Lambda 函数来处理来自不同设备的所有消息。

【问题讨论】:

    标签: aws-lambda mqtt aws-iot


    【解决方案1】:

    正确的主题规则不与任何设备关联。使用 FROM 语句来控制他们接收的消息。您可能希望将 SQL 语句更新为

    SELECT * as data, topic() as topic FROM mymsgs/+
    

    这样您的 lambda 就可以知道消息是针对哪个主题发送的。如果设备在主题mymsgs/device 上发布{ foo: "bar", baz: 100 } 那么

    {
      "data": {
        "foo": "bar",
        "baz": 0
      },
      "topic": "mymsgs/device1"
    }
    

    将被发送到 lambda 函数。

    您还可以使用附加到事物证书的 IoT 策略来强制事物仅在其应该发布的主题上发布。

    【讨论】:

    • 您的 SELECT 语句基本上涵盖了所有主题,对吧?并且您的 SELECT 语句中的data 将用作 lambda 函数的输入?
    • 我已经更新了示例。 SELECT 子句控制发送到 lambda(或其他规则操作)的内容,FROM 子句控制使用 MQTT 主题通配符 + 和 # 的主题。 WHERE 子句可以根据负载中的数据进行过滤。
    【解决方案2】:

    如果主题数量较少,您可以执行以下操作

    SELECT *, topic() as topic FROM 'mylog/+' where regexp_matches(topic(), 'mylog/\b(info|error|warn)\b') = TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多