AWS GreenGrass проверить тему в лямбде
В настоящее время я возился с AWS GreenGrass и прошел большинство основных примеров. Теперь у меня есть проблема с пониманием того, как я буду выполнять различные действия в своей лямбда-функции в зависимости от темы MQTT, с которой она была вызвана. Я не мог найти документацию о том, как определить, какая тема вызывает функцию-обработчик в моем скрипте Python. Я пытаюсь создать небольшой контроллер для моей системы Sonos, в котором используются следующие основные темы:
sonos/play
Который просто пытается играть определенную песню, которую я жестко закодировал.
sonos/pause
Который должен приостановить систему.
Я знаю, что мог бы создать несколько лямбд для каждой команды, но это кажется довольно привередливым. Может кто-нибудь объяснить, как можно решить эту проблему?
2 ответа
Основываясь на этом руководстве разработчика, в своей лямбде вы можете получить тему из контекста:
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]
Я на самом деле не думаю, что это возможно. Если вы посмотрите на оба event
а также context
объекты, переданные в вашу лямбда-функцию, ни один из них не содержит адрес темы.
Мне нужно было иметь отдельную лямбда-функцию для ответа на сообщения по каждой теме MQTT.
Рад поправиться, если это можно сделать.
Вы можете проверить клиентский контекст в объекте контекста лямбда-обработчика. Не думайте, что это задокументировано. Но это должно решить ваш вопрос.
Вы пытались создать правило AWS IoT?
Я столкнулся с аналогичной проблемой, поскольку у меня есть несколько вещей, связанных с IoT, и я не хотел создавать сотни подписок и лямбд.
Добавьте следующую подписку в вашу группу GG:
Source | Target | Topic
----------|--------------|---------------------
IoT Cloud | [xyz_lambda] | [xyz_lambda]/trigger
Затем перейдите в раздел " Акт " по IoT AWS и создайте правило со следующим утверждением:
SELECT topic(2) as action, * from 'sonos/#'
topic(2)
Функция захватывает второй сегмент темы (см. Справочник по AWS IoT SQL - Функции). Переименовываем action
, *
захватывает полезную нагрузку, отправленную вместе с sonos/play
или же sonos/pause
сообщение (если есть).
Добавьте в правило действие, которое повторно публикует сообщение в [xyz_lambda]/trigger
тема.
Событие JSON, отправленное вашему обработчику лямбда-функции, будет иметь свойство action
с последующей полезной нагрузкой JSON sonos/play
или же sonos/pause
сообщение:
{
"action": "play",
...
}
или же
{
"action": "pause",
...
}
Надеюсь это поможет!