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

从HttpTrigger函数读取Azure IoT集线器遥测

轩辕实
2023-03-14

用例

我有一个物联网中心设备,它向物联网中心发送遥测数据。我想处理遥测数据,例如使用函数存储到数据库。

功能

我在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-作为事件网格触发器的http触发器

事件订阅

在IoT Hub中,我使用Web钩子endpoint类型创建了一个触发函数的事件订阅。

问题

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

{{
  "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读取设备到云的消息来查看可读数据。网

我错过了什么?我如何解密尸体?

共有2个答案

云弘壮
2023-03-14

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

这是您的邮件的可读正文:{“DateTime”:“2019-10-05T10:09:29”,“ActualArrif”:1,“ActualPowerDelivered”:271.0,“TotalElectricityDeliveredTerrif1”:6015577.0,“TotalElectricityDeliveredTerrif2”:6027952.0}

颜实
2023-03-14

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

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

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

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

这里有更多细节。

 类似资料:
  • 我有一个Azure IOT解决方案,其中来自两台设备的数据将传输到同一IOT中心。从我的计算机上,我只需要从其中一个设备读取消息。我实现了ReadDeviceToCloudMessages。js inhttps://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-node-node-getstarted 但是我在IOThub里收到了所有的信息。如何仅从

  • 我在Azure (blob)存储上读取Blob中存储的文本时遇到问题。 blob只包含单行文本(字符串)。blob通过Azure Functions HttpTrigger (C#)填充文本,HttpTrigger通过POST接收文本,并用用户指定的名称将文本保存到blob中。保存blob时,名称全部转换为小写。 然后,用户可以访问一个简单的超文本标记语言网页,并在表单中输入blob的名称。当用户

  • 尝试使用CosmosDB bidning创建一个HttpTrigger v2 Azure函数,该函数将使用SQLQuery从路由数据中查找ID。这与Microsoft在这里提供的示例非常相似。我正在使用VS代码开发这个函数。代码如下: 函数(.../GetUser)错误:Microsoft.Azure.webjobs.host:错误索引方法'GetUser'。System.Private.Core

  • 在Azure IoT SDK节点的帮助下,我被指派使用NodeJS将遥测数据从设备发送到IoT hub。如何编写或如何找到d2c消息的适当示例。我很困惑这个特定SDK中用于设备到物联网中心遥测的示例代码。https://github.com/Azure/azure-iot-sdk-node“假设我的设备有一个废物水平传感器,并将废物填充水平发送到IoT hub,那么我如何从该SDK获取适当的样本以

  • 我想利用AZURE Function应用程序从AZURE BLOB存储中读取XLSX文件。该函数应由REST API调用来调用。我可以访问blob并下载文件,但我很难用pandas直接读取文件内容。我找了几个小时,但是找不到解决办法。我的最新方法是这样的: 在MS homepage*上,有一个从blob下载文件并随后进行处理的例子,但由于我使用的是功能应用程序,如果我没有遗漏任何内容,那么首先下载

  • 我们将有一个高负荷的遥测服务。我正在寻找能够扩展收集器和后端(zipkin)的解决方案 有一种扩展zipkin的解决方案。看起来很简单-只需使用内部平衡 但是,我找不到使用多个openTelemetry收集器的示例。运行几个收集器实例没有什么问题,但我如何说“myApp”来平衡它们呢?在Exporters中没有这样的选项。