当前位置: 首页 > 知识库问答 >
问题:

Azure函数-从IoT中心保存到表存储

邹铭
2023-03-14

我有5台设备连接到物联网集线器。此设备发送消息,我已将此消息保存到Azure存储表not blob。

我是根据这本指南做任何事情的https://blog.maximerouiller.com/post/persisting-iot-device-messages-into-cosmosdb-with-azure-functions-and-iot-hub/不幸的是,我可以毫无问题地添加输入和输出,不幸的是,我无法编写将此数据保存到表中的函数代码:(

我可以将数据从物联网中心保存到Blob存储,从具有流分析的物联网中心保存到表存储,但如果没有SA,我无法将数据从物联网中心保存到表存储:(

共有2个答案

苏涵润
2023-03-14

以下是C#Azure Function V2的代码,该代码将数据保存到存储表中,使用DeviceId作为分区密钥,使用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;
            }
        }
尉迟卓
2023-03-14

我建议您使用Azure表存储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!");

RESTAPI参考

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

方法:POST

请求正文:

{  

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

注意:有关更多详细信息,请参阅此处

如果您还有任何疑问,请随时与我们分享。谢谢你,快乐编码!

 类似资料:
  • 如何使用AZURE函数将遥测消息从Azure IOT中心路由到Data Lake存储。

  • 我最近在学习如何阅读

  • 我编写了一个Firebase云函数,可以通过REST API访问该函数。代码如下所示。 我需要做的是,当用户通过“Web服务URL”从前端提交一些值时。 1)我需要将这些数据保存在Firebase实时数据库中。 2.)我参考了网上的几个教程,不明白在下面的代码中做了什么。

  • 我正在研究一个函数,它使用递归调用将给定的输入分解为面值。 在每个步骤中,它都会递归为两个变量: 继续当前的硬币:将其添加到列表中并递归。 切换到下一个硬币:递增硬币pos和递归。 除了在剩余=0时打印列表中捕获的面额组合之外,我还打算捕获该列表的值并从函数返回它。 这是代码: 输出:[5,5,3]

  • 我一直在使用Azure iot-hub从许多物联网设备接收数据,并成功地使用默认/内置终结点读取数据/对其进行处理。我最近想开始保存数据,以便将来进行可能的分析,所以我在同一个资源组中创建了一个Azure存储帐户。我已经完成了关于如何设置路由的所有演练,并让一个正常工作的endpoint将数据发送到消息/事件内置endpoint(因为它在创建其他路由时被禁用为默认值)。但是,在我创建到存储帐户的路

  • 是否有方法通过使用azure函数备份cosmos DB并将.JSON文件保存在azure blob存储中