我能否检索触发我的 Lambda 函数的 AWS IoT 事物的名称?

Can I retrieve the name of the AWS IoT Thing that triggered my Lambda function?

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

有没有办法读取传递给处理函数(使用 Boto 3)的 context 以确定触发事物的名称——例如正如预期 thingName 提供给 get_thing_shadow?

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

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

您的 Lambda 函数可以从 event 参数中获取事物名称,前提是该数据是在 MQTT 消息中指定的或由规则的 SQL 添加到传递给 Lambda 函数的结果中。

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

  • 客户端→(消息)→
  • 主题 →(留言)→
  • 规则→SQL消息修改→(结果)→
  • Lambda 函数
如果消息中不存在事物名称,

SQL functions 可用于向结果添加一些额外数据。不幸的是,没有特殊的 SQL 函数存在 returns 事物名称,但是在某些情况下,可以使用以下三种方法找到事物名称:

  1. 你可以使用 principal() SQL 函数 1 to add principal ID to the result, and then inside your Lambda function you can use that principal ID to get the list of Things associated to this principal using boto3 method list_principal_things().

  2. 如果您的Thing正在更新它的影子或向包含Things名称的主题发送消息,您可以使用topic() SQL函数添加带有Things名称的主题部分在将结果发送到 Lambda 之前,用

    之类的东西
    SELECT *, topic(3) as thingName FROM '$aws/things/+/shadow/update/accepted'
    
  3. 您可以在您的事物的消息中指定事物名称,Lambda 将可以使用此数据,除非您使用 SQL.[=17= 将其从结果中删除]

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

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

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

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

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

但是你无法获取东西的名称,你只能获取属性。