IoT集线器事件不会接收设备双胞胎中记录的属性更改。例如,属性ledState由实际设备(带有修补程序)更新,设备双胞胎更新报告的属性,但IoT集线器事件不会接收该事件。这就限制了我将这个属性更改传递给一个具有天蓝色功能的数字双胞胎。
IoT集线器事件不显示更新的属性,不像IoT集线器事件接收的遥测。考虑到IoT集线器事件只接收创建、删除、连接、断开、遥测事件类型的设备。
如何使IoT集线器事件订阅属性更新?
进一步说明:
实际的设备发送数据包(MQTT函数_nxd_mqtt_client_publish_packet_send),我可以看到这个登录在Termite:_nxd_mqtt_client_publish_packet_send中。集线器成功地用204响应。
这是我的设备,如IoT集线器中所示,当我按下mxchip中的A按钮时,该设备的ledState (reported)属性被更新为true:

{
"deviceId": "mxchip",
"etag": "AAAAAAAAAF8=",
"deviceEtag": "NDY5NTIxODE1",
"status": "enabled",
"statusUpdateTime": "0001-01-01T00:00:00Z",
"connectionState": "Connected",
"lastActivityTime": "2022-09-16T14:51:32.9293466Z",
"cloudToDeviceMessageCount": 0,
"authenticationType": "sas",
"x509Thumbprint": {
"primaryThumbprint": null,
"secondaryThumbprint": null
},
"modelId": "dtmi:azurertos:devkit:gsgmxchip;2",
"version": 5310,
"properties": {
"desired": {
"telemetryInterval": 5,
"$metadata": {
"$lastUpdated": "2022-09-16T12:44:24.4494023Z",
"$lastUpdatedVersion": 95,
"telemetryInterval": {
"$lastUpdated": "2022-09-16T12:44:24.4494023Z",
"$lastUpdatedVersion": 95
}
},
"$version": 95
},
"reported": {
"deviceInformation": {
"__t": "c",
"manufacturer": "MXCHIP",
"model": "AZ3166",
"swVersion": "1.0.0",
"osName": "Azure RTOS",
"processorArchitecture": "Arm Cortex M4",
"processorManufacturer": "STMicroelectronics",
"totalStorage": 1024,
"totalMemory": 128
},
"ledState": true,
"telemetryInterval": {
"ac": 200,
"av": 1,
"value": 5
},
"$metadata": {
"$lastUpdated": "2022-09-16T14:55:52.6321409Z",
"deviceInformation": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z",
"__t": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"manufacturer": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"model": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"swVersion": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"osName": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"processorArchitecture": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"processorManufacturer": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"totalStorage": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
},
"totalMemory": {
"$lastUpdated": "2022-09-16T13:54:57.5894378Z"
}
},
"ledState": {
"$lastUpdated": "2022-09-16T14:55:52.6321409Z"
},
"telemetryInterval": {
"$lastUpdated": "2022-09-16T13:54:58.1675571Z",
"ac": {
"$lastUpdated": "2022-09-16T13:54:58.1675571Z"
},
"av": {
"$lastUpdated": "2022-09-16T13:54:58.1675571Z"
},
"value": {
"$lastUpdated": "2022-09-16T13:54:58.1675571Z"
}
}
},
"$version": 5215
}
},
"capabilities": {
"iotEdge": false
}
}
我在代码中注释掉了遥测消息,因此只将记录的属性更改发送到IoT集线器,但是属性更改不会显示事件:

发布于 2022-10-16 16:31:19
我在理解这个问题时遇到了一些困难,但似乎您正在尝试在Twin事件上获得一个事件网格订阅。简单的回答是:你不能。事件网格不支持设备双事件。
如何使IoT集线器事件订阅属性更新?
您提到要将设备Twin更改发送到Azure函数,您可以通过利用端点和消息路由来实现这一点。您可以将消息路由配置为这样做:[

端点可以是:
F 216
所有这些都可以用作Azure函数的输入。
发布于 2022-10-17 18:32:27
下面的代码片段显示了一个简单的IoTHubTrigger发布函数到Azure事件网格自定义主题的示例。
#r "Newtonsoft.Json"
using System;
using System.Collections;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
static HttpClient client = new HttpClient() { BaseAddress = new Uri(Environment.GetEnvironmentVariable("AEG_CustomTopic1")) };
public static async Task Run(string myIoTHubMessage, IDictionary<string, object> properties, IDictionary<string, object> systemProperties, ILogger log)
{
log.LogInformation($"\nProperties: \n\t{string.Join(" | ", properties.Select(i => $"{i.Key}={i.Value}"))}");
log.LogInformation($"\nSystemProperties: \n\t{string.Join(" | ", systemProperties.Select(i => $"{i.Key}={i.Value}"))}");
log.LogInformation(myIoTHubMessage);
// select only twinChangeEvents
//if((string)systemProperties["iothub-message-source"] != "twinChangeEvents")
// return;
// Fire event
var ege = new {
id=$"{systemProperties["Offset"]}",
subject=$"devices/{systemProperties["iothub-connection-device-id"]}",
eventType=$"{systemProperties["iothub-message-source"]}",
eventTime=systemProperties["iothub-enqueuedtime"],
data= new { properties = properties, systemProperties = systemProperties.ToDictionary(x=>x.Key, x=>$"{x.Value}"), body = JObject.Parse(myIoTHubMessage)},
dataVersion="1.0"
};
var response = await client.PostAsJsonAsync("", new[] { ege } );
log.LogInformation($"FireEvent: {response.StatusCode}");
await Task.CompletedTask;
}function.json:
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "myIoTHubMessage",
"direction": "in",
"eventHubName": "******",
"connection": "******",
"consumerGroup": "function",
"cardinality": "one"
}
]
}注意,上面的函数使用REST请求(没有输出AEG绑定)通过自定义主题将事件激发到Azure事件网格。
发布于 2022-10-17 10:15:44
非常有帮助的指南@Matthijs van der Veer!我最终做到了这一点,现在可以捕获数字双变化事件。如果它对任何人都有帮助的话,扩展答案:
。
使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Text;使用System.Threading.Tasks;使用Azure.Messaging.EventHubs;使用Microsoft.Azure.WebJobs;使用Microsoft.Extensions.Logging;命名空间BladeFunctionApps {公共静态类DeviceTwinSendAndReceivePropertyToEventHub {公共静态异步任务运行(EventHubTrigger(“robo”,Connection = "EventHubConnectionString") EventData[] events,ILogger日志){ var异常=新列表();foreach (事件中的eventData eventData){尝试用处理逻辑替换这两行。log.LogInformation($"C#事件集线器触发器函数处理消息:{eventData.EventBody}");等待Task.Yield();} catch (异常e) { //我们需要继续处理其余批处理-捕获此异常并继续。//此外,请考虑捕获失败处理的消息的详细信息,以便以后可以再次处理。exceptions.Add(e);} //一旦批处理完成,如果批处理中有任何消息失败,则抛出异常,从而记录故障。如果(exceptions.Count > 1) {log.LogInformation(“我们有异常:”+ exceptions.Count);抛出新的AggregateException(异常);} if (exceptions.Count == 1) {log.LogInformation(“我们有异常:”+ exceptions.Count);抛出exceptions.Single();}}
}
https://stackoverflow.com/questions/74086085
复制相似问题