You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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"]会报错。

正确处理步骤:

  1. 先把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:53:12