我目前正在使用AWS GreenGrass,我已经完成了大部分基本示例。现在问题我已经理解了如何在lambda函数中执行不同的操作,具体取决于它触发的MQTT主题。我无法找到有关如何区分哪个主题触发我的python脚本中的函数处理程序的文档。我正在尝试构建的是一个用于我的sonos系统的小型控制器,它使用以下非常基本的主题:
sonos/play
只是尝试播放我硬编码的某首歌。
sonos/pause
哪个应该暂停系统。
我知道我可以为每个命令创建几个lambdas,但这看起来非常挑剔。有人可以解释一下如何处理这类问题吗?
答案 0 :(得分:1)
我实际上不认为这是可能的。如果您查看传递给lambda函数的event
和context
对象,则它们都不包含主题地址。
我要做的是拥有一个单独的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/play
或sonos/pause
消息(如果有)一起发送的有效载荷。
向您的规则添加一个操作,该操作将邮件重新发布到[xyz_lambda]/trigger
主题。
发送到您的lambda函数处理程序的JSON事件将具有属性action
,后跟sonos/play
或sonos/pause
消息的JSON有效载荷:
{
"action": "play",
...
}
或
{
"action": "pause",
...
}
希望这会有所帮助!