我在Azure IOT Hub中使用Azure Device Twin,这个问题与Device Twin行为有关。
我有一个DeviceTwin结构,如下所示,我使用纯MQTT协议将数据发布到其中。
我用来发布双胞胎数据的主题是:$ iothub / twin / PATCH / properties / reported /?$ rid = c1a12cc8-4168-4e16-a1bb
我发送的有效负载是:
{
"deviceId": "34aa078e",
"properties": {
"desired": {
},
"reported": {
"notifications": {
"notification1": {
"primaryCode": "crprim1",
"statusChangeTimestamp": 1507115005615
},
"notification2": {
"primaryCode": "crprim2",
"statusChangeTimestamp": 1507117507027
}
},
"location": {
}
}
}
}
所有功能都正常工作,如DeviceTwin文档中所述,但是,我有一个澄清要清除此DeviceTwin的行为。
当我通过MQTT发送包含一个新通知(名为notificaion3
)的消息有效负载以更新上面的DeviceTwin时,它只需将notification3
添加到notifications
对象中,而不是仅仅替换整个notifications
内容notification3
。
我发送的MQTT有效负载:
{
"notifications": {
"notification3": {
"primaryCode": "crprim3",
"statusChangeTimestamp": 1607115005615
}
}
}
所以我最终会关注DeviceTwin结构,
{
"deviceId": "34aa078e",
"properties": {
"desired": {
},
"reported": {
"notifications": {
"notification1": {
"primaryCode": "crprim1",
"statusChangeTimestamp": 1507115005615
},
"notification2": {
"primaryCode": "crprim2",
"statusChangeTimestamp": 1507117507027
},
"notification3": {
"primaryCode": "crprim3",
"statusChangeTimestamp": 1607115005615
}
},
"location": {
}
}
}
}
而不是关注,
{
"deviceId": "34aa078e",
"properties": {
"desired": {
},
"reported": {
"notifications": {
"notification3": {
"primaryCode": "crprim3",
"statusChangeTimestamp": 1607115005615
}
},
"location": {
}
}
}
}
但Device Twin应包含给定设备的最新快照,并且不应保留以前的数据(相对于对象级别)。 这是Azure Device Twin的常见行为吗?或者它是某种错误?
答案 0 :(得分:0)
基于以上描述的设备双重行为不正确。您应该看到所有通知属性(1,2,3)。
您可以使用第三方工具(如MQTTBox Client,iotdevtool.com,Azure IoT Hub Tester等)查看设备双重行为。
以下屏幕截图在我的Azure IoT Hub区域中显示此测试:
第1步:将 notification1 和 notification2 添加到device2 twin报告的通知属性中:
第2步:获取device2 twin并将 notification3 添加到报告的通知属性中:
答案 1 :(得分:0)
这不是一个错误。有关Azure Device Twin的此行为的详细信息,您可以参考this document。
根据您的描述,您希望连续更新一个报告的属性。在这里我们将其称为“notification1”。所以你的MQTT有效载荷应该是这样的:
{
"notifications": {
"notification1": {
"primaryCode": "crprim3",
"statusChangeTimestamp": 1607115005615
}
}
}
不是这个:
{
"notifications": {
"notification3": {
"primaryCode": "crprim3",
"statusChangeTimestamp": 1607115005615
}
}
}
保持属性名称不变并仅更新其值。
要删除其他冗余属性,可以将其值设置为NULL,如下所示:
{
"notifications": {
"notification2": null,
"notification3": null
}
}