从HttpTrigger函数阅读Azure IoT中心遥测

时间:2019-10-05 09:45:50

标签: c# .net azure azure-iot-hub

用例

我有一个Iot Hub设备,它将遥测数据发送到IoT Hub。 我想使用功能来处理遥测,例如存储到数据库中。

功能

我在VS2019中创建了以下功能,并将其发布到Azure:

[FunctionName("HttpTrigger")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequestMessage req,
ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    var messages = await req.Content.ReadAsAsync<JArray>();

    // If the request is for subscription validation, send back the validation code.
    if (messages.Count > 0 && string.Equals((string)messages[0]["eventType"],
        "Microsoft.EventGrid.SubscriptionValidationEvent",
        System.StringComparison.OrdinalIgnoreCase))
    {
        log.LogInformation("Validate request received");
        return req.CreateResponse<object>(new
        {
            validationResponse = messages[0]["data"]["validationCode"]
        });
    }

    // The request is not for subscription validation, so it's for one or more events.
    foreach (JObject message in messages)
    {
        // Handle one event.
        EventGridEvent eventGridEvent = message.ToObject<EventGridEvent>();
        log.LogInformation($"Subject: {eventGridEvent.Subject}");
        log.LogInformation($"Time: {eventGridEvent.EventTime}");
        log.LogInformation($"Event data: {eventGridEvent.Data.ToString()}");
    }

    return req.CreateResponse(HttpStatusCode.OK);
}

来源:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-grid#use-an-http-trigger-as-an-event-grid-trigger

事件订阅

在IoT中心中,我使用Web Hook端点类型创建了一个触发该功能的事件订阅。

问题

事件数据的主体似乎已加密(?):

{{
  "properties": {},
  "systemProperties": {
    "iothub-connection-device-id": "smartmeter",
    "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
    "iothub-connection-auth-generation-id": "637057961942743477",
    "iothub-enqueuedtime": "2019-10-05T08:09:17.973Z",
    "iothub-message-source": "Telemetry"
  },
  "body": "eyJEYXRlVGltZSI6IjIwMTktMTAtMDVUMTA6MDk6MjkiLCJBY3R1YWxUYXJyaWYiOjEsIkFjdHVhbFBvd2VyRGVsaXZlcmVkIjoyNzEuMCwiVG90YWxFbGVjdHJpY2l0eURlbGl2ZXJlZFRhcnJpZjEiOjYwMTU1NzcuMCwiVG90YWxFbGVjdHJpY2l0eURlbGl2ZXJlZFRhcnJpZjIiOjYwMjc5NTIuMH0="
}}

尽管在Cloud Shell中我可以看到可读数据。我还可以通过使用.Net中的EventHubClient读取设备以将消息云化的方式来查看可读数据。

我想念什么?我该如何解密尸体?

2 个答案:

答案 0 :(得分:2)

您的设备发送遥测数据时未指定内容类型内容编码,请参见 systemProperties 对象中缺少这些属性。

在发送遥测数据时,设备需要填充这些系统属性,然后您将在事件消息中看到:

 "systemProperties":{
    "iothub-content-type":"application/json",
    "iothub-content-encoding":"utf-8",
    ...
事件的

data.body 将是json格式的文本。

更多详细信息here

答案 1 :(得分:0)

主体是Base64编码的,您可以使用 https://docs.microsoft.com/en-us/dotnet/api/system.convert.frombase64string?view=netframework-4.8

这是您邮件的可读内容: {“ DateTime”:“ 2019-10-05T10:09:29”,“ ActualTarrif”:1,“ ActualPowerDelivered”:271.0,“ TotalElectricityDeliveredTarrif1”:6015577.0,“ TotalElectricityDeliveredTarrif2”:6027952.0}