我有一个Python Lambda函数,用于处理IoT Things中的触发器。
有没有办法阅读递交给处理函数的context
(用Boto 3)来识别触发事件的名称 - 例如提供给thingName
的{{1}}中的预期结果?
答案 0 :(得分:6)
AWS IoT允许将多个证书与同一个Thing和多个Things关联到同一个证书。这使得检测事物名称非常具有挑战性,除非你为每件事采用了一个证书。
IoT客户端不直接调用Lambda函数。相反,它实际上是一个调用函数的规则。规则从其正在侦听的主题中获取JSON格式的消息,可能使用SQL语法修改规则可用的数据,并将结果作为处理程序的event
参数传递给Lambda函数。默认情况下,规则将消息传递给Lambda,与客户端发布的消息完全相同,而不添加或删除任何数据,因此如果消息没有关于“name”的数据,则Lambda函数也不会提供此数据。
只有在MQTT消息中指定了数据或者将Rule的SQL添加到传递给Lambda函数的结果时,您的Lambda函数才能从event
参数中获取Thing名称。
简化的消息工作流程如下所示:
SQL functions向结果添加一些其他数据。遗憾的是,没有特殊的SQL函数可以返回Thing名称,但在某些情况下可以使用以下三种方法找到Thing名称:
您可以使用principal()SQL函数1将结果ID添加到结果中,然后在Lambda函数中,您可以使用该主体ID来获取与此主体关联的事物列表boto3方法list_principal_things()
。
如果您的Thing正在更新其阴影或向包含Things name的主题发送消息,您可以使用topic()
SQL函数将具有Things名称的主题部分添加到结果中,然后再将其发送到Lambda,类似
SELECT *, topic(3) as thingName FROM '$aws/things/+/shadow/update/accepted'
您可以在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 的状态。
但是,您无法获得事物的名称,您只能获取属性。