Как получить название вещи из темы MQTT в конвейере AWS Iot Analytics?

В AWS Iot Analytics я создал следующее:

  • Канал: основной шаблон темы => $aws/ вещи /+/ тень / обновление / принято
  • Трубопровод: ФРС от предыдущего канала, выбирает атрибуты из сообщения
  • Хранилище данных для сохранения сообщений

Входящее сообщение на канал является теневым обновлением / принято и выглядит так:

{
  "state": {
    "reported": {
      "active": false,
      "telemetry": {
        "temperature": 72,
        "humidity": 58,
        "occupancy": 28
      },
      "config": null
    }
  },
  "metadata": {
    "reported": {
      "active": {
        "timestamp": 1533059587
      },
      "telemetry": {
        "temperature": {
          "timestamp": 1533059587
        },
        "humidity": {
          "timestamp": 1533059587
        },
        "occupancy": {
          "timestamp": 1533059587
        }
      },
      "config": {
        "timestamp": 1533059587
      }
    }
  },
  "version": 89,
  "timestamp": 1533059587,
  "clientToken": "..."
}

Я хочу извлечь название вещи из структуры темы, которая у меня есть здесь подстановочный знак:

$aws/things/+/shadow/update/accepted

Есть ли способ сделать это или он должен быть включен непосредственно в тело сообщения, если я хочу использовать его здесь для обработки?

Благодарю.

1 ответ

Решение

По-видимому, это достигается путем обогащения полезной нагрузки, которая покидает ядро ​​IOT, путем добавления оператора SQL в правило ядра IOT, которое передает полезную нагрузку в IOT Analytics.

Использование topic() function inside SQL statement:

SELECT *, topic() AS topic FROM 'your/thing/+/topic'

https://docs.aws.amazon.com/en_us/iot/latest/developerguide/iot-substitution-templates.html

Есть принятый ответ, но, похоже, он упустил эту часть вопроса, которая

Я хочу извлечь название предмета из структуры темы, которое у меня здесь как дикая карта

$aws/things/+/shadow/update/accepted

Я подумал, что отправлю это для тех, кому нужно извлечь имя вещи. Если вы хотите извлечь имя вещи, вы можете использовать topic(3)поскольку он оценивается как 3 (это позиция названия предмета в теме). Вот пример правила, которое повторно публикуется в теме, которая использует имя объекта, полученное из темы.

{
  "sql": "SELECT state, version FROM '$aws/things/+/shadow/update/delta'",
  "ruleDisabled": false,
  "actions": [
    {
      "republish": {
        "topic": "${topic(3)}/delta",
        "roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
      }
    }
  ]
}

Вот ссылка на приведенный выше пример. "topic()"возвращает полную тему. Они называются шаблонами подстановки.

Также следует отметить одну важную вещь (которая может привести к ненужному времени на отладку) - это повторная публикация в зарезервированной теме, которая начинается с $, используйте $$(экранируйте '$', используя другой '$'). Например, для повторной публикации в теневой теме устройства $aws/things/MyThing/shadow/updateукажите тему как $$aws/things/MyThing/shadow/update

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