AWS GreenGrass проверить тему в лямбде - PullRequest
0 голосов
/ 02 июня 2018

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

sonos/play

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

sonos/pause

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

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

Ответы [ 4 ]

0 голосов
/ 16 июня 2019

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

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]
0 голосов
/ 03 сентября 2018

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

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

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

0 голосов
/ 13 января 2019

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

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

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

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

Затем перейдите в раздел Act в 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",
  ...
}

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

0 голосов
/ 02 сентября 2018

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

...