我可以检索触发我的Lambda函数的AWS IoT Thing的名称吗?

时间:2017-03-04 13:28:32

标签: aws-lambda iot boto3 aws-iot

我有一个Python Lambda函数,用于处理IoT Things中的触发器。

有没有办法阅读递交给处理函数的context(用Boto 3)来识别触发事件的名称 - 例如提供给thingName的{​​{1}}中的预期结果?

2 个答案:

答案 0 :(得分:6)

AWS IoT允许将多个证书与同一个Thing和多个Things关联到同一个证书。这使得检测事物名称非常具有挑战性,除非你为每件事采用了一个证书。

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

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

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

  • 客户→(留言)→
  • 主题→(消息)→
  • 规则→SQL消息修改→(结果)→
  • Lambda函数
如果消息中不存在Thing名称,则可以使用

SQL functions向结果添加一些其他数据。遗憾的是,没有特殊的SQL函数可以返回Thing名称,但在某些情况下可以使用以下三种方法找到Thing名称:

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

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

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

答案 1 :(得分:0)

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

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

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

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

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

但是,您无法获得事物的名称,您只能获取属性。