Можно ли динамически изменять правила ядра aws iot? - PullRequest
0 голосов
/ 26 января 2020

Я работаю над Iot-включенным автоматом c, который использует aws IoT core. Каждая машина имеет свой собственный уровень температуры, который варьируется, и я хочу запустить AWS SNS в зависимости от их уровня температуры. Каждый из компьютеров публикует sh данных в одной и той же топике c, разделенных их идентификатором. Имя topi c выглядит следующим образом:

 machine/+/data

Где знак + указывает на machine_id. Мои правила написаны ниже.

 select * from machine/+/data where temperature > 25 

, который теперь работает для всех тем. проблема с температурным уровнем не одинакова для всех машин, например, машина с id = 1 может иметь уровень температуры 30, другая машина с id = 2 может иметь 28.

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

Заранее спасибо за ваш ответ.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Проблема с вашим подходом заключается в том, как работает AWS IoT Queries - после активации запроса AWS будет пытаться проверить / выполнить его для каждого отдельного сообщения на основе фильтра topi c, который вы предоставляете в предложение SELECT.

Таким образом, у вас не может быть одного запроса для достижения того, что вы хотите (с различными значениями температуры_уровня).

В вашей задаче есть две переменные - machine_id, Temperature_level. Оба связаны друг с другом.

Возможно, вы захотите подойти к вашей проблеме с помощью:

Option-1 :: Rudimentary - Создайте несколько запросов (по одному для machine_id, комбинации температур) и разверните.

Option-2 :: Dynami c - Хранить переменные в виде кортежей в хранилище по вашему выбору, например, AWS DynamoDB. Иметь DB Stream / Trigger для уведомления об изменениях в таблице и обрабатывать их с помощью AWS Lambda, который динамически воссоздает AWS IoT Rules (с использованием AWS SDK / API) по мере изменения данных в DynamoDB.

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

0 голосов
/ 20 февраля 2020

Правило IoT можно сделать динамическим c с помощью функций get_dynamodb, aws_lambda или get_thing_shadow в WHERE предложение.

С https://forums.aws.amazon.com/thread.jspa?messageID=932907&#932907

У вас есть 3 способа извлечения данных в AWS IoT Topi c Правило. Все можно использовать в оценке предложения WHERE.

  1. aws_lambda () функция (https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot -fun c - aws -lambda ) который вернул бы данные, которые вам нужны из вашей лямбды в оценке Правил. Наиболее полезно для получения значения из другого сервиса.
  2. get_dynamodb () функция (https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot - sql -function-get-Dynamodb ), которая позволяет вам выбирать данные из вашей таблицы DynamoDB. Вы можете хранить пороговые значения для каждой вещи в таблице.
  3. get_thing_shadow () функция (https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot - sql -функция-получить-вещь-тень ) который позволяет получать данные из ваших документов Thing Shadow. Если вы уже используете Thing Shadow, проще всего сохранить пороговое значение для каждой вещи.

Например, документация get_thing_shadow содержит:

SELECT * from 'a/b'
WHERE
get_thing_shadow("MyThing","arn:aws:iam::123456789012:role/AllowsThingShadowAccess")
  .state.reported.alarm = 'ON'

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

SELECT * FROM machine/+/data
WHERE
temperature > get_thing_shadow(topic(2),"arn:aws:iam::123456789012:role/AllowsThingShadowAccess")
  .state.threshold
...