AWS GreenGrass проверьте тему в Lambda

В настоящее время я возился с AWS GreenGrass и рассмотрел большинство основных примеров. Теперь у меня есть понимание того, как я буду выполнять различные действия в своей лямбда-функции в зависимости от темы MQTT, которая была инициирована. Мне не удалось найти документацию о том, как различить, какая тема запускает обработчик функции в моем скрипте python. Я пытаюсь создать небольшой контроллер для моей системы sonos, в котором используются следующие основные темы:

sonos/play

Которая просто пытается сыграть определенную песню, которую я жестко запрограммировал.

sonos/pause

Что должно приостановить систему.

Я знаю, что могу создать несколько лямбда-выражений для каждой команды, но это кажется довольно привередливым. Может кто-нибудь объяснить, как можно решить эту проблему?


person John Doe    schedule 02.06.2018    source источник


Ответы (4)


На основе этого руководства для разработчиков в лямбде вы можно получить тему из контекста:

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]
person John S    schedule 16.06.2019

Я вообще не думаю, что это возможно. Если вы посмотрите на оба объекта event и context, переданные в вашу лямбда-функцию, ни один из них не содержит адреса темы.

Что мне нужно было сделать, так это создать отдельную лямбда-функцию для ответа на сообщения для каждой темы MQTT.

Рад, что вас исправят, если это возможно.

person Remotec    schedule 03.09.2018

Вы можете проверить контекст клиента в объекте контекста обработчика лямбда. Не думайте, что это задокументировано. Но это должно решить вашу проблему.

person Alex    schedule 02.09.2018

Вы пробовали создать правило AWS IoT?

Я столкнулся с аналогичной проблемой, так как у меня несколько вещей AWS IoT, и я не хотел создавать сотни подписок и лямбда-выражений.

Добавьте следующую подписку в свою группу GG:

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

Затем перейдите в раздел Действие в AWS IoT и создайте правило со следующим утверждением:

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

or

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

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

person martip    schedule 13.01.2019