Azure 逻辑应用:从 IoT 中心消息中读取遥测数据作为动态内容

Azure Logic App: Read telemetry data as dynamic content from IoT hub message

我正在使用 webhook 通过 IoT 事件和事件网格将遥测消息路由到逻辑应用程序。逻辑应用允许您输入示例 JSON 消息,然后使用动态内容将信息添加到我发送的电子邮件警报中(O365:发送电子邮件 V2)

我可以包含像 "iothub-connection-device-id" 这样的系统属性,但是当我尝试选择遥测数据时,出现以下错误:

InvalidTemplate. Unable to process template language expressions in action 'Send_an_email_(V2)' inputs at line '1' and column '1680': 'The template language expression 'items('For_each')?['data']?['body']?['windingTemp1']' cannot be evaluated because property 'windingTemp1' cannot be selected. Property selection is not supported on values of type 'String'. Please see https://aka.ms/logicexpressions for usage details.'.

当我查看 webhook 连接器的原始输出时,它显示了以下消息,但遥测点显然不存在。我希望在 "body" 属性 中看到它们,但只有字符串:"eyJ3aW5kaW5nVGVtcDEiOjg2LjYzOTYxNzk4MjYxODMzLCJ3aW5kaW5nVGVtcDIiOjc4LjQ1MDc4NTgwMjQyMTUyLCJ3aW5kaW5nVGVtcDMiOjg1LjUzMDYxMDY5OTQ1MzY1LCJMb2FkQSI6MjAyOS44NDgyMTg4ODYxMTEsIkxvYWRCIjoyMDQwLjgxMDk4OTg0MDMzMzgsIkxvYWRWIjoyMDA0LjYxMTkzMjMyNTQ2MTgsIk9pbFRlbXAiOjk5LjA2MjMyNjU2MTY4ODU4fQ=="

寻求帮助以确定可能导致此问题的原因以及如何正确传递遥测数据,以便我可以在电子邮件警报中动态包含它。

谢谢!

{
"headers": {
    "Connection": "Keep-Alive",
    "Accept-Encoding": "gzip,deflate",
    "Host": "prod-24.northeurope.logic.azure.com",
    "aeg-subscription-name": "TEMPALERT",
    "aeg-delivery-count": "1",
    "aeg-data-version": "",
    "aeg-metadata-version": "1",
    "aeg-event-type": "Notification",
    "Content-Length": "1017",
    "Content-Type": "application/json; charset=utf-8"
},
"body": [
    {
        "id": "c767fb91-3806-324c-ec3c-XXXXXXXXXX",
        "topic": "/SUBSCRIPTIONS/XXXXXXXXXXXX",
        "subject": "devices/Device-001",
        "eventType": "Microsoft.Devices.DeviceTelemetry",
        "data": {
            "properties": {
                "TempAlarm": "true"
            },
            "systemProperties": {
                "iothub-connection-device-id": "Device-001",
                "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
                "iothub-connection-auth-generation-id": "637264713410XXXX",
                "iothub-enqueuedtime": "2020-06-01T23:05:58.3130000Z",
                "iothub-message-source": "Telemetry"
            },
            "body": "eyJ3aW5kaW5nVGVtcDEiOjg2LjYzOTYxNzk4MjYxODMzLCJ3aW5kaW5nVGVtcDIiOjc4LjQ1MDc4NTgwMjQyMTUyLCJ3aW5kaW5nVGVtcDMiOjg1LjUzMDYxMDY5OTQ1MzY1LCJMb2FkQSI6MjAyOS44NDgyMTg4ODYxMTEsIkxvYWRCIjoyMDQwLjgxMDk4OTg0MDMzMzgsIkxvYWRWIjoyMDA0LjYxMTkzMjMyNTQ2MTgsIk9pbFRlbXAiOjk5LjA2MjMyNjU2MTY4ODU4fQ=="
        },
        "dataVersion": "",
        "metadataVersion": "1",
        "eventTime": "2020-06-01T23:05:58.313Z"
    }
]

}

这是我使用触发器的示例输入:

[{
  "id": "9af86784-8d40-fe2g-8b2a-bab65e106785",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>", 
  "subject": "devices/LogicAppTestDevice", 
  "eventType": "Microsoft.Devices.DeviceTelemetry",
  "eventTime": "2019-01-07T20:58:30.48Z",
  "data": {        
      "body": {            
          "windingTemp1": 95.62818310718433       
      },
        "properties": {            
          "Status": "Active"        
        },
        "systemProperties": {            
            "iothub-content-type": "application/json",
            "iothub-content-encoding": "utf-8",
            "iothub-connection-device-id": "d1",
            "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
            "iothub-connection-auth-generation-id": "123455432199234570",
            "iothub-enqueuedtime": "2019-01-07T20:58:30.48Z",
            "iothub-message-source": "Telemetry"        
        }    
    },
  "dataVersion": "",
  "metadataVersion": "1"
}]

要回答的摘要评论,以帮助有同样问题的其他人。

您提供的正文是 Base64 编码的,您可以使用 Convert.FromBase64String(String) 方法对其进行解码。

byte[] newBytes = Convert.FromBase64String(body);

更多细节,你可以参考这个

更新:

在我的应用中添加以下代码即可解决问题。

message.ContentEncoding = "utf-8"; 
message.ContentType = "application/json";