Azure Device Twin保留以前的数据

时间:2017-10-04 12:52:00

标签: azure azure-iot-hub

我在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的常见行为吗?或者它是某种错误?

2 个答案:

答案 0 :(得分:0)

基于以上描述的设备双重行为不正确。您应该看到所有通知属性(1,2,3)。

您可以使用第三方工具(如MQTTBox Client,iotdevtool.com,Azure IoT Hub Tester等)查看设备双重行为。

以下屏幕截图在我的Azure IoT Hub区域中显示此测试:

第1步:将 notification1 notification2 添加到device2 twin报告的通知属性中:

mqtt1

第2步:获取device2 twin并将 notification3 添加到报告的通知属性中:

mqtt2

第3步:获取device2 twin以查看所有通知属性 enter image description here

答案 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
    }
}