【发布时间】:2023-02-01 03:44:37
【问题描述】:
对于任何不正确的格式表示歉意,很长一段时间以来我在堆栈溢出上发布了任何内容。
我希望将数据的 json 负载发送到 Azure IoT 中心,然后我将使用 Azure Function App 对其进行处理,以在 Azure Digital Twin 中显示实时遥测数据。
我可以将负载发布到 IoT 中心并使用资源管理器查看它,但是我的函数无法获取它并在 Azure 数字孪生中显示该遥测数据。通过谷歌搜索,我发现 json 文件需要进行 utf-8 加密并设置为 application/json,我认为这可能是我目前尝试修复此问题的问题。
我在下面包含了来自我的 azure 函数应用程序的日志流的片段,如图所示消息的“正文”部分被打乱,这就是为什么我认为这可能是有效负载编码方式的问题:
“iothub-message-source”:“Telemetry”},“body”:“eyJwb3dlciI6ICIxLjciLCAid2luZF9zcGVlZCI6ICIxLjciLCAid2luZF9kaXJlY3Rpb24iOiAiMS43In0 =”} 2023-01-27T13:39:05Z [错误] 摄取函数出错:无法访问 Newtonsoft.Json.Linq.JValue 上的子值。
我当前的测试代码如下,用于将有效载荷发送到 IoT 中心,潜在的问题是我没有正确编码有效载荷。
import datetime, requests
import json
deviceID = "JanTestDT"
IoTHubName = "IoTJanTest"
iotHubAPIVer = "2018-04-01"
iotHubRestURI = "https://" + IoTHubName + ".azure-devices.net/devices/" + deviceID + "/messages/events?api-version=" + iotHubAPIVer
SASToken = 'SharedAccessSignature'
Headers = {}
Headers['Authorization'] = SASToken
Headers['Content-Type'] = "application/json"
Headers['charset'] = "utf-8"
datetime = datetime.datetime.now()
payload = {
'power': "1.7",
'wind_speed': "1.7",
'wind_direction': "1.7"
}
payload2 = json.dumps(payload, ensure_ascii = False).encode("utf8")
resp = requests.post(iotHubRestURI, data=payload2, headers=Headers)
我尝试以几种不同的方式正确编码有效负载,包括 request.post 中的 utf-8,但这会产生一个错误,即无法对 dict 进行编码,或者仍然在 Function App 日志流中加密主体无法破译它。
感谢您对此提供的任何帮助和/或指导 - 很乐意进一步详细说明任何不清楚的地方。
【问题讨论】:
-
为什么不直接传递带有
requests.post()的json=参数的字典,让requests处理所有序列化和内容类型/字符集标头?
标签: python json utf-8 azure-iot-hub azure-digital-twins