如何将IoT Hub遥测数据传入Azure Digital Twins?故障排查求助
一、先确认IoT Hub传过来的完整JSON结构
要排查取值问题,第一步得先看到Event Grid触发函数接收到的完整JSON payload,直接在C#函数里加日志输出:
// 在函数入口处添加日志,输出整个event对象 log.LogInformation($"Received Event Grid payload: {JsonConvert.SerializeObject(eventGridEvent)}");
部署后去Azure门户的函数应用→监控→日志里查看,就能拿到完整的JSON结构,明确body的实际格式。
二、修正遥测数据的取值方式
你用Python发的{"Auto": true}本身格式没问题,但IoT Hub的Event Grid事件里,遥测数据的body大概率是字符串格式的JSON,而非直接的JSON对象,所以直接用deviceMessage["body"]["Auto"]会报错。
正确处理步骤:
- 先把body的字符串反序列化为JObject:
// 假设deviceMessage是从eventGridEvent里解析出的遥测部分 var bodyStr = deviceMessage["body"].ToString(); var bodyObj = JsonConvert.DeserializeObject<JObject>(bodyStr); var autoValue = bodyObj["Auto"].Value<bool>();
如果日志显示body已经是JObject(而非字符串),那直接检查路径是否正确——比如部分场景下IoT Hub会把遥测包在properties或其他嵌套字段里,以实际日志结构为准。
三、解决两个错误
1. "Cannot access child value on Newtonsoft.Json.Linq.JValue"
这个错误是因为你试图从**值类型(比如字符串、布尔值)**里访问子节点,比如deviceMessage["body"]本身是字符串时,直接用["Auto"]访问就会触发。按照上面的方法先把字符串转成JObject再取值就能解决。
2. "Value cannot be null. (Parameter 'source')"
这个错误通常是更新Azure Digital Twins时source参数传了null。检查调用Digital Twins API的代码,确保source是有效的实体ID(比如设备对应的孪生模型ID),不能是空值。示例:
var update = new DigitalTwinsUpdateOperations(); // 确保source是正确的孪生ID,不是null或空字符串 update.AppendReplace("/properties/Auto", autoValue, source: "your-device-twin-id");
四、Python发送数据的格式确认
你的Python发送内容格式没问题,但要确保发送时是JSON字符串,且设置正确的内容类型。用Azure IoT SDK的话,代码应该是这样:
from azure.iot.device import IoTHubDeviceClient, Message client = IoTHubDeviceClient.create_from_connection_string("your-connection-string") msg = Message('{"Auto": true}') msg.content_encoding = "utf-8" msg.content_type = "application/json" client.send_message(msg)
必须设置content_type为application/json,这样IoT Hub才能正确识别body格式。
内容的提问来源于stack exchange,提问作者user21912389

