首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IoT集线器事件不接收Azure设备双更新记录属性

IoT集线器事件不接收Azure设备双更新记录属性
EN

Stack Overflow用户
提问于 2022-10-16 09:51:23
回答 3查看 64关注 0票数 0

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:

代码语言:javascript
复制
{
"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集线器,但是属性更改不会显示事件:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-16 16:31:19

我在理解这个问题时遇到了一些困难,但似乎您正在尝试在Twin事件上获得一个事件网格订阅。简单的回答是:你不能。事件网格不支持设备双事件。

如何使IoT集线器事件订阅属性更新?

您提到要将设备Twin更改发送到Azure函数,您可以通过利用端点和消息路由来实现这一点。您可以将消息路由配置为这样做:[

端点可以是:

  • a Azure事件中心
  • Azure Service总线队列
  • Azure Service Bus主题
  • Blob Storage

F 216

所有这些都可以用作Azure函数的输入。

票数 1
EN

Stack Overflow用户

发布于 2022-10-17 18:32:27

下面的代码片段显示了一个简单的IoTHubTrigger发布函数到Azure事件网格自定义主题的示例。

代码语言:javascript
复制
#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:

代码语言:javascript
复制
{
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "myIoTHubMessage",
      "direction": "in",
      "eventHubName": "******",
      "connection": "******",
      "consumerGroup": "function",
      "cardinality": "one"
    }
  ]
}

注意,上面的函数使用REST请求(没有输出AEG绑定)通过自定义主题将事件激发到Azure事件网格。

票数 1
EN

Stack Overflow用户

发布于 2022-10-17 10:15:44

非常有帮助的指南@Matthijs van der Veer!我最终做到了这一点,现在可以捕获数字双变化事件。如果它对任何人都有帮助的话,扩展答案:

  1. 创建事件集线器->创建事件集线器实例。然后为该实例创建共享访问策略,以接收mssgs.

  1. 创建事件集线器触发函数应用程序。加入金块pckg Azure.Messaging.EventHubs.Processor和Microsoft.Azure.WebJobs.Extensions.EventHubs

使用系统;使用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();}}

}

  1. 向IotHub添加了消息路由:在消息路由中选择事件集线器,并从事件集线器实例共享访问策略中创建和终结点。然后为数字双胞胎更改创建路由,将这些更改路由到端点。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74086085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档