2017-10-04 3 views
1

私はAzure IOTハブでAzureデバイスツインを使用していますが、この問題はデバイスツインビヘイビアに関するものです。Azureデバイスツインは以前のデータを保持します

私は以下のようなDeviceTwin構造を持っています。純粋なMQTTプロトコルを使用してデータを公開しています。

私は双子のデータを公開するために使用トピックは次のとおりです。?$ iothub /ツイン/ PATCH /プロパティ/報告/ $ = c1a12cc8-4168-4e16-a1bb

を取り除く私が送信されたペイロードは、次のとおりです。

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

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

     }  
    } 
    } 
} 

DeviceTwinのドキュメントに記載されているように、すべての機能が正常に動作していますが、このDeviceTwinのビヘビアに関してクリアする必要があります。

IはDeviceTwin上に更新するMQTTを介して(notificaion3と命名)一つの新たな通知を含むメッセージペイロードを送信すると、それだけではなく、単にnotification3notificationsと全体のコンテンツを置き換えるのnotificationsnotification3オブジェクトに追加します。

私が送信され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": { 

     }  
    } 
    } 
} 

しかし、デバイスツイン特定のデバイスの最新のスナップショットが含まれている必要があり、以前のデータを保持してはいけません(ウィットオブジェクトレベルとの関係)。 これはAzure Device Twinの通常の動作ですか?それとも何らかのバグですか?

答えて

0

上記の説明に基づくデバイスツインの動作は正しくありません。すべての通知プロパティ(1,2,3)が表示されます。

MQTTBox Client、iotdevtool.com、Azure IoT Hub Testerなどのサードパーティのツールを使用すると、デバイスのツイン動作を確認できます。

次の画面スニペットは、私のAzureのIoTハブ領域で、このテストを示しています。

ステップ1:

mqtt1

:デバイス2ツインに notification2と notification1 を追加することが通知性質を報告しました

手順2:デバイス2のツインを取得し、通知3を追加

mqtt2

ステップ3:それはバグではありませんすべての通知性質 enter image description here

+0

はい、あなたが正しい、私はこのケースでは、3つのすべての通知を見ることができます - 私ははっきりそう」で述べています私は最終的には上記のDeviceTwin構造に従います。実際には私の本当の問題は、これはデバイスのツインの意図された正しい動作ですか?歴史的なデータを維持する... – gbids

+0

通知のデバイスのツイン状態をこの "通知"のために変更する必要があります:{ "id":3, "primaryCode": "crprim3"、 "statusChangeTimestamp":1607115005615 } –

0

を見るためにデバイス2双子を取得通知プロパティを移植しました。 Azure Device Twinのこの動作の詳細については、this documentを参照してください。

説明に基づいて、報告されたプロパティの1つを継続的に更新したいとします。ここでは、それを「notification1」と呼びます。

{ 
    "notifications": { 
     "notification1": { 
      "primaryCode": "crprim3",   
      "statusChangeTimestamp": 1607115005615 
     } 
    } 
} 

ないこの:

変わらないプロパティ名を維持するだけその値を更新され
{ 
    "notifications": { 
     "notification3": { 
      "primaryCode": "crprim3",   
      "statusChangeTimestamp": 1607115005615 
     } 
    } 
} 

だからあなたのMQTTペイロードはこれを好きなはずです。

あなたはこのようにNULLにその値を設定することができ、他の冗長プロパティを削除するには:

{ 
    "notifications": { 
     "notification2": null, 
     "notification3": null 
    } 
} 
+0

私はここに混乱があると思います。私が望んでいたのは、私がそれを送った後、*通知* 3を維持することです。しかし、この場合、デバイス1とデバイス2にnotification1とnotification2があり、その後、通知3と呼ばれる新しい通知を送信すると、Device Twinは3つの通知をすべて持ちます。だから、私はそれが正しい行動かどうかを知りたかったのです。私はこれをAWSと比較しようとしています - このシナリオでは最新の値を保持しているDevice Shadow、最後には通知しかない3。 Tnx。 – gbids

+0

@gbids別のプロパティ名(notification3)を使用すると、デバイスツインは新たに追加されたプロパティとして表示され、この操作では「通知」が部分的に更新されるため、ここで3つの通知をすべて行います。 –

+0

あなたは正しいです。私は基本的に、AzureでAWS Device Shadow/Thingと同じ動作を得ることができるかどうかを確認しようとしています。しかし、そうではないようです。 – gbids

関連する問題