【问题标题】:Can I retrieve the name of the AWS IoT Thing that triggered my Lambda function?我可以检索触发我的 Lambda 函数的 AWS IoT 事物的名称吗?
【发布时间】:2017-07-24 14:36:52
【问题描述】:

我有一个 Python Lambda 函数来处理来自 IoT Things 的触发器。

有没有办法读取传递给处理函数的context(使用 Boto 3)来识别触发事物的名称——例如正如thingName 中所期望的那样,提供给get_thing_shadow

【问题讨论】:

    标签: aws-lambda iot boto3 aws-iot


    【解决方案1】:

    AWS IoT 允许将多个证书关联到同一个事物,并将多个事物关联到同一个证书。这使得检测事物名称非常具有挑战性,除非您采用每个事物一个证书的方法。

    IoT 客户端不直接调用 Lambda 函数。相反,它实际上是一个调用函数的规则。规则从它正在侦听的主题中获取 JSON 格式的消息,可能使用 SQL 语法修改规则可用的数据,并将结果作为处理程序的 event 参数传递给 Lambda 函数。默认情况下,规则完全按照客户端发布的消息将消息传递给 Lambda,而不添加或删除任何数据,因此如果消息没有关于“名称”的数据,则 Lambda 函数也无法使用此数据。

    只有在 MQTT 消息中指定数据或由 Rule 的 SQL 添加到传递给 Lambda 函数的结果中时,您的 Lambda 函数才能从 event 参数中获取事物名称。

    简化的消息工作流程如下所示:

    • 客户端→(消息)→
    • 主题→(消息)→
    • 规则→SQL消息修改→(结果)→
    • Lambda 函数

    SQL functions 可用于在消息中不存在事物名称时向结果中添加一些附加数据。不幸的是,不存在返回事物名称的特殊 SQL 函数,但是在某些情况下,可以使用以下三种方法找到事物名称:

    1. 您可以使用 principal() SQL 函数 1 将委托人 ID 添加到结果中,然后在您的 Lambda 函数中,您可以使用该委托人 ID 通过 boto3 方法获取与该委托人关联的事物列表list_principal_things()

    2. 如果您的事物正在更新其影子或向包含事物名称的主题发送消息,您可以使用topic() SQL 函数将带有事物名称的主题部分添加到结果中,然后再将其发送到 Lambda,例如

      SELECT *, topic(3) as thingName FROM '$aws/things/+/shadow/update/accepted'
      
    3. 您可能会在您的事物的消息中指定事物名称,除非您使用 SQL 从结果中删除它,否则 Lambda 可以使用此数据。

    【讨论】:

      【解决方案2】:

      Lambda 函数传递一个名为 event 的参数。

      它是 JSON 对象。你得到什么对象取决于你使用的方法。

      更多详情请参考:http://docs.amazonaws.cn/en_us/iot/latest/developerguide/thing-shadow-mqtt.html

      exports.handler = (event, context, callback) => {
      }
      

      我建议你打印 event,这样你就可以看到 JSON 对象。它包含触发它的事物的状态。

      但是不能获取事物的名称,只能获取属性。

      【讨论】:

        猜你喜欢
        • 2017-07-22
        • 2016-10-01
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多