- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 IoT 设备每 5 分钟向 Azure IoT 中心发送一次消息。我想将每条消息保存在 Azure Blob 存储容器中。在 azure 门户内的消息路由
部分中,我创建了一条像这样的新路由。 接下来,我创建了一个像这样的自定义端点: 通过这样做,我可以将消息保存在 Blob 存储中。我想做的是创建一条动态路线。我希望每条发送的消息都保存在此路径中:{iothub}/{deviceId}/{messageParameter}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm }
其中 deviceId
是在 Azure IoT 中心注册的设备的名称,customValue
是 IoT 设备发送到 Azure 的 json 消息中的属性值物联网中心。这是我用来发送消息的代码:
public class Sender : ISender
{
private static DeviceClient _deviceClient;
public void SendDeviceToCloudMessage(string deviceId, string iotHubUri, string deviceKey, string message)
{
_deviceClient = DeviceClient.Create(iotHubUri,
new DeviceAuthenticationWithRegistrySymmetricKey(deviceId, deviceKey), TransportType.Mqtt);
var twin = _deviceClient.GetTwinAsync().ConfigureAwait(false).GetAwaiter().GetResult();
var desiredProperties = twin.Properties.Desired;
var messageObj = JObject.Parse(message);
if (desiredProperties.Contains("TelemetryData"))
{
var telemetryData = (TwinCollection)desiredProperties["TelemetryData"];
telemetryData["Temperature"] = messageObj["Temperature"];
telemetryData["Humidity"] = messageObj["Humidity"];
telemetryData["TimeStamp"] = messageObj["TimeStamp"];
}
else
{
var telemetryData = new TwinCollection();
telemetryData["Temperature"] = messageObj["Temperature"];
telemetryData["Humidity"] = messageObj["Humidity"];
telemetryData["TimeStamp"] = messageObj["TimeStamp"];
desiredProperties["TelemetryData"] = telemetryData;
}
// Update the reported properties with the updated desired properties
var reportedProperties = new TwinCollection();
reportedProperties["TelemetryData"] = desiredProperties["TelemetryData"];
_deviceClient.UpdateReportedPropertiesAsync(reportedProperties).ConfigureAwait(false).GetAwaiter().GetResult();
using var iotMessage = new Message(Encoding.UTF8.GetBytes(message))
{
ContentEncoding = "utf-8",
ContentType = "application/json",
};
// Submit the message to the hub.
_deviceClient.SendEventAsync(iotMessage).ConfigureAwait(false).GetAwaiter().GetResult();
}
}
message
输入是一个 json 字符串,如下所示:
{
"Temperature": 20,
"Humidity": 50,
"TimeStamp": "2023-02-26 14:02:59.7715110 +00:00",
"MessageId": "MessageIdentifier"
}
这可能吗?或者我需要手动将消息保存在 Azure Blob 存储容器中?
注意:我的目标是保存设备发送的消息,然后能够读取特定设备发送的消息(因此我将 deviceId 放在路径中)相关在发送的消息中找到的特定参数(messageParameter)
最佳答案
正如答案所提到的,Blob 存储的自定义终结点中没有满足您需求的内置 IoT 中心功能。以下示例显示了一种解决方法,其中使用 Azure 事件网格发布/订阅模型将设备遥测数据推送到 Blob 存储:
订阅者是一个 Azure EventGridTrigger 函数,用于处理 blob 名称等。
#r "Newtonsoft.Json"
#r "System.Text.Json"
#r "Azure.Storage.Blobs"
#r "System.Memory.Data"
#r "Azure.Core"
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.Extensions.Logging;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Specialized;
using Azure.Storage.Blobs.Models;
using System.Collections.Generic;
public static async Task Run(JObject eventGridEvent, BlobContainerClient blobContainer, ILogger log)
{
log.LogInformation(eventGridEvent.ToString());
string iothubname = eventGridEvent["data"]?["properties"]?["iothubname"]?.Value<string>() ?? "unknown";
string deviceId = eventGridEvent["data"]?["systemProperties"]?["iothub-connection-device-id"]?.Value<string>() ?? "unknown";
DateTime dt = eventGridEvent["data"]?["systemProperties"]?["iothub-enqueuedtime"]?.Value<DateTime>() ?? default(DateTime);
string blobName = $"{iothubname}/{deviceId}/{dt.ToString("yyyy/MM/dd/HH/mm/ss")}.json";
log.LogInformation($"blobname = {blobName}");
var tags = new Dictionary<string, string>();
tags.Add("iothubname", iothubname);
tags.Add("deviceId", deviceId);
tags.Add("value", "CustomValue");
var blobClient = blobContainer.GetBlobClient(blobName);
await blobClient.UploadAsync(BinaryData.FromString(eventGridEvent["data"]?["body"]?.ToString() ?? eventGridEvent.ToString() ), overwrite: true);
//blobClient.SetTags(tags); // option for 'blob index tags'
}
请注意,Azure IoT 中心路由消息可以通过设备孪生中的有用值(例如 $twin.tags.field 或 $twin.properties.desired.value)进行丰富,并在订阅者中将它们用作一部分blob 名称或 blob 索引标记中。
关于c# - 将设备到云消息从 Azure IoT 中心路由到 Azure Blob 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75578380/
我是一名优秀的程序员,十分优秀!