AWS сохраняет сообщение MQTT для DynamoDB

Я создал скрипт на Python, который периодически отправляет сообщение MQTT.

Это строка JSON, отправленная на бэкэнд:

{"Id": "1234", "Ut": 1488395951, "Temp": 22.86, "Rh": 48.24}

На стороне сервера я хочу сохранить сообщение MQTT в таблице DynamoDB.

Я выполнил руководство Amazon, и данные, содержащиеся в сообщениях MQTT, хранятся в таблице.

Моя проблема касается столбцов таблицы.

В таблице всего 3 столбца:

  • Id: ключ раздела
  • Ut: ключ сортировки
  • Полезная нагрузка: содержит сообщение mqtt.

Можно ли иметь столбцы для каждого ключа, содержащегося в сообщении MQTT?

У меня были бы такие столбцы: - Id - Ut - Temp - Rh

Спасибо за помощь!


person Federico    schedule 01.03.2017    source источник
comment
У вас есть фиксированные атрибуты или атрибуты могут быть очень динамичными? В обоих случаях атрибуты можно хранить отдельно. Однако вам может потребоваться проанализировать json и установить значения соответственно.   -  person notionquest    schedule 01.03.2017
comment
Нужно ли мне вызывать лямбда-функцию, которая анализирует json и сохраняет данные в DynamoDB? Спасибо   -  person Federico    schedule 02.03.2017


Ответы (4)


Да, ты можешь.

В DynamoDB вам не нужно создавать то, что вы называете «столбцами». Единственное требование для успешной операции put - указать основные атрибуты (в вашем случае Id и Ut).

Из документов:

Карта пар имя / значение атрибута, по одной для каждого атрибута. Требуются только атрибуты первичного ключа; при желании вы можете указать для элемента другие пары имя-значение атрибута.

В python вы можете сделать что-то подобное (возможно, потребуется проверить синтаксис и настроить типы столбцов):

import boto3
client = boto3.client('dynamodb')
response = client.put_item(
    TableName = 'Messages',
    Item={
        'Id': {
            'S': '1234'
        },
        'Ut': {
            'S': '1488395951'
        },
        'Temp': {
            'S': '22.86'
        },
        'Rh': {
            'S': '48.24'
        }
    }
)
person Vor    schedule 01.03.2017
comment
Спасибо за ответ. Я забыл упомянуть, что отправка сообщений автоматически запускается правилом в консоли AWS IoT. Мой скрипт python отправляет сообщение MQTT в AWS MQTT Broker. Можно ли настроить это правило для разделения данных? - person Federico; 02.03.2017

Да, безусловно. Вы можете создавать столбцы для всего, что вы хотите сохранить в таблице DynamoDB, вместо или в дополнение к хранению полной полезной нагрузки.

После шага 3.1: создайте новый элемент из этого руководства, вы должны обновить свой код put_item, включив в него все сведения о вашем элементе ...

#Parse your JSON message and get out all your attributes
id = message["Id"]
ut = message["Ut"]
temp = message["Temp"]
rh = message["Rh"]

response = table.put_item(
   Item={
        'id': id,
        'ut': ut,
        'temp': temp,
        'rh': rh
    }
)

Теперь, если вы посмотрите на свою таблицу в консоли DynamoDB, вы увидите, что для ваших дополнительных атрибутов были созданы новые столбцы.

person readyornot    schedule 01.03.2017
comment
Ссылка на учебное пособие больше не указывает на учебное пособие, а скорее указывает на начальную страницу «Приступая к работе с DynamoDB». - person Paulo S. Abreu; 30.10.2018

Я предполагаю, что вы пытаетесь придумать правило шлюза Интернета вещей, сохраняющее ваше сообщение в таблице DynamoDB. К сожалению, правила IoT не позволяют хранить данные в нескольких столбцах - вы можете хранить полезную нагрузку (или ее подмножество) только в одном столбце. В настоящее время нет возможности извлекать свойства из полезной нагрузки в несколько разных столбцов.

Единственный способ обойти это (который я нашел до сих пор) - вызвать лямбда-функцию через правила IoT, которые запускают код, аналогичный тому, что показали другие ответы.

person ChrisWue    schedule 29.05.2017

Можно ли иметь столбцы для каждого ключа, содержащегося в сообщении MQTT?

У меня были бы такие столбцы: - Id - Ut - Temp - Rh

Самый простой и легкий способ реализовать это - использовать действие AWS IoT DynamoDBv2 без необходимости реализации Lambda.

Из https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html#dynamodb-v2-rule:

Действие DynamoDBv2 позволяет записывать все или часть сообщения MQTT в таблицу DynamoDB. Каждый атрибут полезной нагрузки записывается в отдельный столбец в базе данных DynamoDB.

Полезная нагрузка сообщения MQTT должна содержать ключ корневого уровня, который соответствует ключу первичного раздела таблицы, и ключ корневого уровня, который соответствует первичному ключу сортировки таблицы, если он определен.

Таблица может по-прежнему иметь Id в качестве ключа разделения и Ut в качестве ключа сортировки. Сообщение MQTT уже содержит ключ раздела и сортировки, поэтому оператор SQL AWS IoT может быть просто:

SELECT * FROM 'mytopic'
person Ben T    schedule 30.03.2020