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",
  ...
}

Надеюсь это поможет!

Другие вопросы по тегам