Прочитать Azure IoT Hub Telemetry из функции HttpTrigger - PullRequest
1 голос
/ 05 октября 2019

Вариант использования

У меня есть устройство Iot Hub, которое отправляет данные телеметрии в IoT Hub. Я хочу обработать телеметрию, например, сохранить в базе данных, используя функцию.

Funtion

Я создал следующую функцию в 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 Hub я создал подписку на события, которая вызывает функцию с помощью веб-хукаТип конечной точки.

Проблема

Тело данных события, похоже, зашифровано (?):

{{
  "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="
}}

хотя и в облакеShell я могу видеть читаемые данные. Я также могу видеть читаемые данные, читая сообщения устройства в облако с помощью EventHubClient в .Net.

Чего мне не хватает? Как я могу расшифровать тело?

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

ваше устройство отправило данные телеметрии, не указав тип контента и кодировка контента , см. Отсутствующие эти свойства в объекте systemProperties .

Устройство должно заполнить эти системные свойства при отправке данных телеметрии, затем вы увидите в сообщении о событии:

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

и data.body события будетбыть отформатированным в формате JSON.

Подробнее здесь .

0 голосов
/ 05 октября 2019

Тело имеет кодировку 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}

...