【发布时间】:2017-07-24 14:36:52
【问题描述】:
我有一个 Python Lambda 函数来处理来自 IoT Things 的触发器。
有没有办法读取传递给处理函数的context(使用 Boto 3)来识别触发事物的名称——例如正如thingName 中所期望的那样,提供给get_thing_shadow?
【问题讨论】:
标签: aws-lambda iot boto3 aws-iot
我有一个 Python Lambda 函数来处理来自 IoT Things 的触发器。
有没有办法读取传递给处理函数的context(使用 Boto 3)来识别触发事物的名称——例如正如thingName 中所期望的那样,提供给get_thing_shadow?
【问题讨论】:
标签: aws-lambda iot boto3 aws-iot
AWS IoT 允许将多个证书关联到同一个事物,并将多个事物关联到同一个证书。这使得检测事物名称非常具有挑战性,除非您采用每个事物一个证书的方法。
IoT 客户端不直接调用 Lambda 函数。相反,它实际上是一个调用函数的规则。规则从它正在侦听的主题中获取 JSON 格式的消息,可能使用 SQL 语法修改规则可用的数据,并将结果作为处理程序的 event 参数传递给 Lambda 函数。默认情况下,规则完全按照客户端发布的消息将消息传递给 Lambda,而不添加或删除任何数据,因此如果消息没有关于“名称”的数据,则 Lambda 函数也无法使用此数据。
只有在 MQTT 消息中指定数据或由 Rule 的 SQL 添加到传递给 Lambda 函数的结果中时,您的 Lambda 函数才能从 event 参数中获取事物名称。
简化的消息工作流程如下所示:
SQL functions 可用于在消息中不存在事物名称时向结果中添加一些附加数据。不幸的是,不存在返回事物名称的特殊 SQL 函数,但是在某些情况下,可以使用以下三种方法找到事物名称:
您可以使用 principal() SQL 函数 1 将委托人 ID 添加到结果中,然后在您的 Lambda 函数中,您可以使用该委托人 ID 通过 boto3 方法获取与该委托人关联的事物列表list_principal_things()。
如果您的事物正在更新其影子或向包含事物名称的主题发送消息,您可以使用topic() SQL 函数将带有事物名称的主题部分添加到结果中,然后再将其发送到 Lambda,例如
SELECT *, topic(3) as thingName FROM '$aws/things/+/shadow/update/accepted'
您可能会在您的事物的消息中指定事物名称,除非您使用 SQL 从结果中删除它,否则 Lambda 可以使用此数据。
【讨论】:
Lambda 函数传递一个名为 event 的参数。
它是 JSON 对象。你得到什么对象取决于你使用的方法。
更多详情请参考:http://docs.amazonaws.cn/en_us/iot/latest/developerguide/thing-shadow-mqtt.html
exports.handler = (event, context, callback) => {
}
我建议你打印 event,这样你就可以看到 JSON 对象。它包含触发它的事物的状态。
但是不能获取事物的名称,只能获取属性。
【讨论】: