Функция Azure - сохранение в Table Storage из IoT Hub - PullRequest
1 голос
/ 13 мая 2019

У меня есть 5 устройств, подключенных к IoT Hub.Это устройство отправляет сообщение, и я сохранил это сообщение в таблице хранения Azure, а не в BLOB-объекте.

Я делаю все, основываясь на этом руководстве https://blog.maximerouiller.com/post/persisting-iot-device-messages-into-cosmosdb-with-azure-functions-and-iot-hub/ к сожалению, я могу без проблем добавлять ввод и вывод, к сожалению, я не могу справиться с написанием кода функции, который сохранит эти данные в таблице:(

Я могу сохранить данные из IoT Hub в хранилище BLOB-объектов, из IoT Hub с Stream Analytics в хранилище таблиц, но не могу сохранить из IoT Hub без SA в хранилище таблиц: (*

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Я бы предложил вам использовать azure table storage REST API для вашего случая.

Вы также можете использовать SDK для этого.Пожалуйста, посмотрите ниже.

Класс

public class Item : TableEntity
    {
        public Item()
        {
            PartitionKey = "YourPartionKey";
            RowKey = "YourRowKey";
        }
        public string Message{ get; set; }
        public string Description { get; set; }

    }

Внутренняя функция с использованием SDK

 Item entity = new Item("YourPartionKey", "YourRowKey")
            {
                Message= "I am From IOT Device",
                Description = "I am from IOT and Want to go to Storage"
            };
            // My Storage operation 
            var client = new CloudTableClient(new Uri("https://YourTableStorageAccountName.table.core.windows.net/"),
                      new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials("YourTableStorageAccountName", "YourStorageKey"));
            var table = client.GetTableReference("YourTableName");

            TableOperation insertOperation = TableOperation.Insert(entity);
            var insertOnstorage = await table.ExecuteAsync(insertOperation);

            Console.WriteLine("Entity inserted!");

Справочник по API REST

URL: https://YourAccount.table.core.windows.net/YourTableThatYouWantedToInsertMessase

Method: POST

Request Body:

{  

   "Message":"IOT Message",  
   "Description":"I am from IOT and Want to go to Storage",  
   "PartitionKey":"Yourpartitionkey",  
   "RowKey":"YourRowkey"  
}

Примечание: Для более подробной информации вы можете обратиться здесь

Если у вас есть еще вопросы, не стесняйтесь поделиться.Спасибо и счастливого кодирования!

0 голосов
/ 14 мая 2019

Вот код для C # Azure Function V2, которая сохраняет ваши данные в таблицу хранения, используя deviceId в качестве PartitionKey и messageId в качестве RowKey:

public static class IotHubToTableStorage
    {
        private static CloudTable _outputTable = CloudTableHelper.GetCloudTable("MyTableName");

        [FunctionName("IotHubToTableStorage")]
        public static async Task Run([EventHubTrigger("messages/events", Connection = "myConnectionString", ConsumerGroup = "myTablestorageConsumerGroup")]EventData eventData,
            ILogger log)
        {
            string message = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count);
            var deviceData = JsonConvert.DeserializeObject<JObject>(message);

            var dynamicTableEntity = new DynamicTableEntity();

            foreach (KeyValuePair<string, JToken> keyValuePair in deviceData)
            {
                if (keyValuePair.Key.Equals("deviceId"))
                {
                    dynamicTableEntity.PartitionKey = keyValuePair.Value.ToString();

                }
                else if (keyValuePair.Key.Equals("messageId"))
                {
                    dynamicTableEntity.RowKey = keyValuePair.Value.ToString();
                }
                else
                {
                    dynamicTableEntity.Properties.Add(keyValuePair.Key, EntityProperty.CreateEntityPropertyFromObject(keyValuePair.Value));
                }
            }

            var tableOperation = TableOperation.InsertOrMerge(dynamicTableEntity);
            await _outputTable.ExecuteAsync(tableOperation);

        }
    }

Используется этот помощник:

public class CloudTableHelper
        {
            public static CloudTable GetCloudTable(string tableName, string storageConnectionString)
            {
                // Retrieve storage account from connection string.
                CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);

                // Create the table client.
                CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

                // Retrieve a reference to a table.
                CloudTable table = tableClient.GetTableReference(tableName);

                // Create the table if it doesn't already exist
                table.CreateIfNotExistsAsync().Wait();

                return table;
            }
        }
...