3

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

sonos/play

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

sonos/pause

哪个应该暂停系统。

我知道我可以为每个命令创建几个 lambda,但这似乎很挑剔。有人可以解释一下如何解决这类问题吗?

4

4 回答 4

3

根据这个开发指南,在您的 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]
于 2019-06-16T19:34:47.287 回答
1

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

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

如果可以做到这一点,很高兴得到纠正。

于 2018-09-03T08:52:46.290 回答
0

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

于 2018-09-02T01:23:45.663 回答
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 参考 - 函数)。我们将其重命名为action. *捕获与sonos/playorsonos/pause消息(如果有)一起发送的有效负载。

向规则添加一个操作,将消息重新发布到[xyz_lambda]/trigger主题。

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

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

或者

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

希望这可以帮助!

于 2019-01-13T08:30:48.857 回答