アライボデバイスツインチェンジディープダイブ


Azure IOTハブメッセージルーティングは、iOTハブサービスで直接ルールに基づいて別のエンドポイントにメッセージを送信できる素晴らしい機能です.これは主にルーティングテレメトリメッセージのために使用されますが、LifeStyleまたはデバイスツイン変更イベントなどの他の種類のイベントを送信することもできます.
デバイスのツイン変更イベントに初めて使用したとき、以下の質問に対する回答は見つかりませんでした.
  • それは、ツインの任意のセクションの変更のためのイベントをトリガします(報告、目的とタグ)?
  • 何がイベントペイロードの内容ですか?
  • ルートの条件は変更前か後に実行されますか?
  • このポストでは、これらの質問に答えるために、デバイスツインチェンジイベントのIOTハブメッセージルーティングへの深いダイビングを行います.
    メッセージルーティングとデバイスツインの概念に慣れていない場合は、まず以下の内容を読んでください.
  • Message routing for telemetry
  • Device twin presentation
  • TLあなたが急いでいるならば、そして、たった今答えを必要としてくださいsummary このポストのセクション、そうでなければ、あなたが全部を読むならば、私は感謝します🤗

    デモ環境の作成


    概要


    このデモでは、次のコンポーネントを使用します
  • Azureでは、単一リソースとしてIOTハブ
  • 私のラップトップでは、いくつかのWSLタブを使用したWindows端末:
  • AZ CLIコマンドを使用してデバイスのツインを更新します
  • Aを実行する.デバイスをシミュレートするNET
  • 他のAZ CLIコマンドを使用してIOTハブからイベントを監視します
  • 私はそれをより快適にしたいのでbashからAZ CLIだけを使うことを選びました、しかし、あなたはIOTハブを構成して、Twin、またはPowerShell Cmdletsの望ましい特性とタグ部分をアップデートするためにAzureポータルを使うこともできます.The Azure IoT Hub VSのコードの拡張子はまた、ツインとモニタのイベントを更新するには最適です.
    セットアップ全体を示します.

    IOTハブの設定


    私たちは自由または標準の層でIOTハブを必要とします.そして、それが装置双子機能をサポートしないので、我々は基本的な層を使用することができません.
    iotハブが作成されると、組み込みのエンドポイントへのルートを追加します.
    $ hub_name="<ENTER-HUB-NAME>"
    $ az iot hub route create --hub-name $hub_name -n route-device-twin-changes --source twinchangeevents --endpoint-name events
    

    サンプルデバイスの作成


    私たちはデバイスを必要とします.したがって、デーモンのためにいつも簡単に使用できるようにSAS認証を使用して作成します.
    $ device_id="<ENTER-DEVICE-ID>"
    $ az iot hub device-identity create --hub-name $hub_name -d $device_id
    $ device_connection_string=$(az iot hub device-identity show-connection-string --hub-name $hub_name -d $device_id -o tsv)
    
    デバイスのツインイベントを送信するには2つのことが必要です.
  • 報告されたプロパティの変更については、デバイスをシミュレートする必要がありますので、簡単に準備している.ネットコンソールアプリ利用可能here . プロジェクトフォルダから、次のコマンドを実行して、デバイス接続文字列を確実に格納し、ツールを実行してレポートのプロパティを初期化します.
  • $ dotnet user-secrets set "DeviceConnectionString" $device_connection_string
    $ dotnet run
    DeviceClient created ! Getting current twin...
    First time with this device, let's initialize it !
    Done ! Exiting now...
    
    ツールの最初の実行は2つの報告されたプロパティを作成します.
  • propertyUsedOnlyOnce 再び使用されません😔
  • color 設定するRed , ツールの次の実行はBlue , その後Red , その後Blue , など
  • 目的のプロパティとタグの変更のために、私たちはaz iot hub device-twin update コマンド.最初にデバイスの初期化を終了しましょう.
  • $ az iot hub device-twin update --hub-name $hub_name -d $device_id --set tags='{"tagProperty":"tagValue"}'
    $ az iot hub device-twin update --hub-name $hub_name -d $device_id --set properties.desired.desiredProperty='desiredValue'
    
    これは、今後のテストによって変更されませんデバイスツインの目的とタグのセクションのプロパティを作成します.これらのプロパティがイベントペイロードに埋め込まれるかどうかを確認します.
    設定が行われ、最初のテストにジャンプしましょう!

    プロパティの変更をテスト


    各々のテストのために、私はWSLで2つのペインを開いているWindows端末を使っています:Longの上で1つは、変化をモニターするために、左右の変化をモニターするためにLEFにありますaz iot hub monitor-events コマンド)

    レポートのプロパティのテスト


    上のイメージで見られるように、左のペインでデバイスツールをruningするとcolor レポートプロパティRed to Blue . 右区画では、次のペイロードを持つイベントが表示されます.
    {
        "version": 10,
        "properties": {
            "reported": {
                "color": "Blue",
                "$metadata": {
                    "$lastUpdated": "2021-02-13T17:56:23.2704925Z",
                    "color": {
                        "$lastUpdated": "2021-02-13T17:56:23.2704925Z"
                    }
                },
                "$version": 7
            }
        }
    }
    
    比較として、Device Twinの全体の報告されたセクションは、ここにあります:
    "reported": {
        "propertyUsedOnlyOnce": "This is set only once",
        "color": "Blue",
        "$metadata": {
            "$lastUpdated": "2021-02-13T17:56:23.2704925Z",
            "propertyUsedOnlyOnce": {
                "$lastUpdated": "2021-02-13T16:07:58.6609507Z"
            },
            "color": {
                "$lastUpdated": "2021-02-13T17:56:23.2704925Z"
            }
        },
        "$version": 7
    }
    
    おもしろいことはpropertyUsedOnlyOnce ペイロードはデバイスによって送られたパッチだけを含んでいます.
    要約すると、イベントペイロードでは次のようになります.
  • The version デバイスツインの全体
  • 変更に含まれるプロパティの新しい値
  • The $metadata 変化の性質の
  • The $version プロパティセクションの
  • そして、我々にはありません:
  • 変更されなかった報告されたプロパティと$metadata )
  • デバイス双の他のセクションからのデータ(希望、タグ)
  • 望ましい特性の試験


    私のWindows端末に戻ると、左区画に次のコマンドを入力して、新しいセクションを指定します.
    az iot hub device-twin update --hub-name $hub_name -d $device_id --set properties.desired.desiredColor='Orange'
    
    右側のウィンドウでは、次のペイロードを使用してイベントを受け取ります.
    {
        "version": 11,
        "tags": {
            "tagProperty": "tagValue"
        },
        "properties": {
            "desired": {
                "desiredProperty": "desiredValue",
                "desiredColor": "Orange",
                "$metadata": {
                    "$lastUpdated": "2021-02-14T18:05:38.5825801Z",
                    "$lastUpdatedVersion": 3,
                    "desiredProperty": {
                        "$lastUpdated": "2021-02-14T18:05:38.5825801Z",
                        "$lastUpdatedVersion": 3
                    },
                    "desiredColor": {
                        "$lastUpdated": "2021-02-14T18:05:38.5825801Z",
                        "$lastUpdatedVersion": 3
                    }
                },
                "$version": 3
            }
        }
    }
    
    このペイロードにはもっと内容があります.
  • The version デバイスツインの全体
  • タグのセクション
  • 全体の所望のプロパティセクション$metadata$versionIOT - HUB ( DeviceId , ConnectionState , ...)によって管理されるツインの報告されたセクションと内容だけがない場合、ペイロードにはクラウド側から変更可能なすべてが含まれます.
  • タグのテスト


    同じテストを行いますが、タグのセクションに新しいプロパティを追加することで、次のコマンドを実行します.
    az iot hub device-twin update --hub-name $hub_name -d $device_id --set tags.newTagProperty='newTagValue'
    
    次のペイロードを使用してイベントを生成します.
    {
        "version": 12,
        "tags": {
            "tagProperty": "tagValue",
            "newTagProperty": "newTagValue"
        },
        "properties": {
            "desired": {
                "desiredProperty": "desiredValue",
                "desiredColor": "Orange",
                "$metadata": {
                    "$lastUpdated": "2021-02-14T19:53:14.4410421Z",
                    "$lastUpdatedVersion": 4,
                    "desiredProperty": {
                        "$lastUpdated": "2021-02-14T19:53:14.4410421Z",
                        "$lastUpdatedVersion": 4
                    },
                    "desiredColor": {
                        "$lastUpdated": "2021-02-14T19:53:14.4410421Z",
                        "$lastUpdatedVersion": 4
                    }
                },
                "$version": 4
            }
        }
    }
    
    基本的には、希望するプロパティを更新するのと同じイベントがあります.$metadata .

    ルート上の条件の追加


    さて、私たちは、イベントが双子の各セクションに対して引き起こされ、ペイロードにあることを知っているので、3番目の質問に移動することができます.
    経路を更新しましょう.
    az iot hub route update --hub-name $hub_name -n route-device-twin-changes --condition '$twin.properties.reported.color = "Red"
    '
    
    この状態では、現在のデバイスからのレポートの色に設定された色Red エンドポイントに送信されます.
    DotNetツールを使用してデバイスをシミュレートするBlue , 入力は、報告された色がRed :
    $ dotnet run
    DeviceClient created ! Getting current twin...
    Changing 'color' reported property from 'Blue' to 'Red'...
    Done ! Exiting now...
    
    監視ペインでは、イベントが流れます.
    {
        "version": 13,
        "properties": {
            "reported": {
                "color": "Red",
                "$metadata": {
                    "$lastUpdated": "2021-02-14T22:50:11.6725239Z",
                    "color": {
                        "$lastUpdated": "2021-02-14T22:50:11.6725239Z"
                    }
                },
                "$version": 8
            }
        }
    }
    
    DotNetツールを再度実行すると、報告された色がBlue :
    $ dotnet run
    DeviceClient created ! Getting current twin...
    Changing 'color' reported property from 'Red' to 'Blue'...
    Done ! Exiting now...
    
    監視ペインではイベントは流れません.
    それで、答えは明確です:最初に、変化はデバイス双子でなされます、そして、ルーティング・条件は評価されます.そして、装置双子の更新されたバージョンで評価されます.

    概要


    このポストを終えるために、イントロからの2つの最初の質問に答えるこのテーブルで学んだことをまとめましょう.
    更新ツインセクション
    イベントトリガ?
    イベントのペイロード
    報告財産
    はい
    報告されたセクションの一部(デバイスによって送られるパッチ)を更新しました
    望ましい特性
    はい
    すべてのタグと望ましいプロパティ
    タグ
    はい
    望ましいプロパティの更新と同じ内容
    最後に、ルート上の条件がある場合は、デバイスのツイン変更の適用後に評価されます.
    私はこのポストが有用だったことを願って、私は質問をしている上に手を差し伸べるか、以下のコメントを残して躊躇しないでください.