Azure IoT-如果服务器和客户端都在更改设备属性怎么办?

Azure IoT-如果服务器和客户端都在更改设备属性怎么办?,azure,azure-iot-hub,azure-iot-sdk,Azure,Azure Iot Hub,Azure Iot Sdk,我有一个使用远程监控加速器的Azure IoT解决方案。服务器(远程监控web)和客户端(设备)都在更改设备属性。有时,这些属性会进入“同步”状态,并且似乎无法摆脱 那么,对于谁有权更改设备双胞胎属性以及何时更改,有哪些规则 顺便说一句,我使用IoTubDeviceClient_LL_SendReportedState()函数更改设备端的属性。Azure IoT设备孪生表示可断开的分布式端(如面向设备端和面向服务端)的轻量级通用数据(状态)模型。双设备支持以过渡方式在这些端点之间创建“卷影副本”

我有一个使用远程监控加速器的Azure IoT解决方案。服务器(远程监控web)和客户端(设备)都在更改设备属性。有时,这些属性会进入“同步”状态,并且似乎无法摆脱

那么,对于谁有权更改设备双胞胎属性以及何时更改,有哪些规则


顺便说一句,我使用IoTubDeviceClient_LL_SendReportedState()函数更改设备端的属性。

Azure IoT设备孪生表示可断开的分布式端(如面向设备端和面向服务端)的轻量级通用数据(状态)模型。双设备支持以过渡方式在这些端点之间创建“卷影副本”。基本上,每一端都拥有写入(或更新)其属性的所有权,另一端会收到有关此更改的通知

基于此通知、版本控制和设备孪生元数据,可以可靠地将状态从一端传输到另一端。注意,轻量级状态机必须在每一端实现,例如由通知更改触发的设备和后端

上图来自文档,在这里详细描述了此模型

更新:

以下屏幕片段是使用Device Twin属性在设备和后端之间转换状态的序列图示例:

在上面的示例中,这个分布式状态机处理设备和后端之间来自inprocess、ack、done、null的传输状态。可以创建类似的转换,例如:inprocess、nack、null、后端和设备之间的转换、断开连接的设备转换等


此示例使用了一个附加属性(如状态)来指示属性配置处于转换状态,但可以添加更多属性,例如原始值、版本等,它们有助于恢复状态等。

服务器端应该(实际上可以)只更新所需的属性。客户端总是只报告属性。这不能解决我的问题,抱歉。是的,如果服务器启动属性更改,它将更新所需的属性,然后客户端将发送回IoTubDeviceClient_LL_SendReportedState(),该更改声明-是的,我做了该更改。如果客户机启动属性更改,它将使用该属性的全新值调用相同的函数-IoTubDeviceClient_LL_SendReportedState()。问题是这有时有效,有时无效-属性最终处于“同步”状态。我理解,但如何使属性脱离“同步”状态?当客户端从服务器设置的报告属性与所需属性不同时,可能会发生这种情况,但并非总是如此,但这是因为在这种情况下,客户端希望报告属性更改(由于有人走进房间并在设备上更改了某些内容)。我只调用IoTubDeviceClient_LL_SendReportedState()来自设备客户端的函数。也许这还不够,这就是为什么我的属性有时会处于“同步”状态的原因???如果不是,我必须调用哪些函数和/或必须注册哪些回调?我只想让设备能够发起属性更改以及后端更改。在设备端,还应该设置回调以在所需状态(后端)处理通知更改,例如函数IoTubDeviceClient\u LL\u SetDeviceWinCallback。在后端,您应该在Azure IoT Hub for Data source=TwinChangeEvents中设置消息路由,以将通知消息推送到自定义端点,以便根据报告的更改处理所需属性的转换状态。谢谢。我已经在调用IoTubDeviceClient\u LL\u SetDeviceWinCallback()。我将研究此邮件路由。我真的没有那么做。我想这能让我找到正确的方向