AWS GreenGrass检查Lambda中的主题

时间:2018-06-02 08:53:08

标签: amazon-web-services aws-lambda greengrass

我目前正在使用AWS GreenGrass,我已经完成了大部分基本示例。现在问题我已经理解了如何在lambda函数中执行不同的操作,具体取决于它触发的MQTT主题。我无法找到有关如何区分哪个主题触发我的python脚本中的函数处理程序的文档。我正在尝试构建的是一个用于我的sonos系统的小型控制器,它使用以下非常基本的主题:

sonos/play

只是尝试播放我硬编码的某首歌。

sonos/pause

哪个应该暂停系统。

我知道我可以为每个命令创建几个lambdas,但这看起来非常挑剔。有人可以解释一下如何处理这类问题吗?

4 个答案:

答案 0 :(得分:1)

我实际上不认为这是可能的。如果您查看传递给lambda函数的eventcontext对象,则它们都不包含主题地址。

我要做的是拥有一个单独的lambda函数来响应每个MQTT主题的消息。

如果可以的话,很高兴得到纠正。

答案 1 :(得分:1)

基于此dev guide,您可以在lambda中从上下文中获取主题:

def get_input_topic(context):
    try:
        topic = context.client_context.custom['subject']
    except Exception as e:
        logging.error('Topic could not be parsed. ' + repr(e))
    return topic
action = get_input_topic(context).split('/')[-1]

答案 2 :(得分:0)

您可以在lambda处理程序的上下文对象中检查客户端上下文。不要以为这是有据可查的。但这应该可以解决您的问题。

答案 3 :(得分:0)

您是否尝试过创建AWS IoT规则?

我遇到了类似的问题,因为我有多个AWS IoT Things,而且我不想创建数百个订阅和lambda。

在您的GG组中添加以下订阅:

Source    | Target       | Topic
----------|--------------|---------------------
IoT Cloud | [xyz_lambda] | [xyz_lambda]/trigger

然后转到AWS IoT上的 Act 部分,并使用以下语句创建一个规则:

SELECT topic(2) as action, * from 'sonos/#'

topic(2)函数捕获主题的第二部分(请参见AWS IoT SQL Reference - Functions)。我们将其重命名为action*捕获与sonos/playsonos/pause消息(如果有)一起发送的有效载荷。

向您的规则添加一个操作,该操作将邮件重新发布到[xyz_lambda]/trigger主题。

发送到您的lambda函数处理程序的JSON事件将具有属性action,后跟sonos/playsonos/pause消息的JSON有效载荷:

{
  "action": "play",
  ...
}

{
  "action": "pause",
  ...
}

希望这会有所帮助!