2017-10-04 107 views
1

我在Azure IOT Hub中使用Azure Device Twin,此問題與設備Twin的行爲有關。Azure設備Twin保留以前的數據

我有一個DeviceTwin結構如下,我正在使用純MQTT協議發佈數據到它。

這是我用來發布雙數據的題目是:$ iothub /雙/ PATCH /屬性/報告/ $ RID = c1a12cc8-4168-4e16-a1bb

我發送的有效載荷是:

{ 
    "deviceId": "34aa078e", 
    "properties": { 
    "desired": { 

    }, 
    "reported": { 
     "notifications": { 
     "notification1": { 
      "primaryCode": "crprim1",   
      "statusChangeTimestamp": 1507115005615 
     }, 
     "notification2": { 
      "primaryCode": "crprim2",   
      "statusChangeTimestamp": 1507117507027 
     } 
     }, 
     "location": { 

     }  
    } 
    } 
} 

所有的功能都正常工作,如在DeviceTwin文檔中記錄的,但是我有一個澄清要關於此DeviceTwin的行爲。

當我發送包含一個新的通知(命名爲notificaion3)通過MQTT來更新上述DeviceTwin消息有效載荷,它只是添加notification3notifications對象,而不是隻是notification3更換整個notifications內容。

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": { 

     }  
    } 
    } 
} 

但設備雙牀應該包含給定設備的最新快照,並且它不應該保留以前的數據(例如, h尊重對象級別)。 這是Azure Device Twin的常見行爲嗎?或者它是一種錯誤?

回答

0

基於上述描述的設備孿生行爲不正確。您應該看到所有通知屬性(1,2,3)。

您可以使用第三方工具,如MQTTBox客戶端,iotdevtool.com,Azure IoT Hub Tester等查看設備雙行爲。

下面的屏幕片段顯示此測試在我天青的IoT集線器區域:

步驟1:將所述notification1notification2入裝置2雙報道通知屬性:

mqtt1

步驟2:獲取device2 twin並將notification3添加到re移植通知性質:

mqtt2

第3步:獲取設備2雙看到所有通知性能 enter image description here

+0

是的,你是正確的,我可以看到在這種情況下,所有三個通知 - 這是我在明確提出「所以我將最終在DeviceTwin結構中遵循上面的部分。其實我真正的問題是,這是一個設備雙胞胎的預期和正確的行爲 - 保持歷史數據... – gbids

+0

您的設備雙通知狀態通知應該改變這個「通知」:{ 「ID」:3, 「primaryCode」:「crprim3」, 「statusChangeTimestamp」:1607115005615 } –

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 
    } 
} 
+0

我想我們在這裏有一個困惑。我想要的只是*發送後保留notification3。但是在這種情況下,當我在設備對中有通知1和通知2,然後一旦我發送名爲notification3的新通知時,Device Twin就有三個通知。所以,我想知道這是否是正確的行爲。我試圖將其與AWS - Device Shadow進行比較,在這種情況下,他們只保留最新值,這意味着在這種情況下,最終只會有通知3。 TNX。 – gbids

+0

@gbids當您使用不同的屬性名稱(notification3)設備時,請將其視爲新添加的屬性,並且此操作部分更新「通知」,因此您將在此處具有全部三個通知。 –

+0

你是對的。我基本上試圖看看我們是否可以像AWS Device Shadow /使用Azure那樣獲得相同的行爲。但是,似乎沒有。 – gbids