

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# デバイスシャドウサービス通信のシミュレーション
<a name="using-device-shadows"></a>

このトピックでは、Device Shadow サービスが仲介として動作する方法を示し、デバイスおよびアプリはシャドウを使用してデバイスの状態を更新、保存、取得できます。

このトピックで説明されているやり取りをデモンストレーションし、さらに詳しく調べるには、 AWS アカウント と、 を実行できるシステムが必要です AWS CLI。これらがない場合は、コード例で相互作用を確認できます。

この例では、 AWS IoT コンソールは デバイスを表します。は、シャドウを介してデバイスにアクセスするアプリまたはサービス AWS CLI を表します。 AWS CLI インターフェイスは、アプリケーションが通信に使用する API と非常によく似ています AWS IoT。この例のデバイスはスマート電球で、アプリは電球の状態を表示し、電球の状態を変更できます。

## シミュレーションの設定
<a name="using-device-shadows-setup"></a>

これらの手順では、デバイスをシミュレートする [AWS IoT コンソール](https://console.aws.amazon.com/iot/home)と、アプリをシミュレートするコマンドラインウィンドウを開いてシミュレーションを初期化します。

**シミュレーション環境を設定するには**

1. このトピックの例を自分で実行する AWS アカウント には、 が必要です。がない場合は AWS アカウント、「」の説明に従って作成します[セットアップ AWS アカウント](setting-up.md)。

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/home)を開き、左側のメニューで [**テスト**] を選択して **MQTT クライアント**を開きます。

1. 別のウィンドウで、 AWS CLI がインストールされているシステムでターミナルウィンドウを開きます。

2 つのウィンドウが開いている必要があります。1 つは**テスト**ページの AWS IoT コンソール、もう 1 つはコマンドラインプロンプトです。

## デバイスの初期化
<a name="using-device-shadows-init-device"></a>

このシミュレーションでは、*mySimulatedThing* という名前の Thing オブジェクトと、*SimShadow1* という名前のシャドウを使って作業します。

**モノのオブジェクトとその IoT ポリシーを作成する**  
**AWS IoT コンソール**でモノのオブジェクトを作成するには

1. [**Manage**] (管理) を選択し、[**Things**] (モノ) を選択します。

1. モノが一覧表示されている場合は**「作成**」ボタンをクリックするか、**「単一のモノを登録する**」をクリックして単一の AWS IoT モノを作成します。

1. 名前 `mySimulatedThing` を入力し、その他の設定はデフォルトのままにして、[**Next**] (次へ) をクリックします。

1. ワンクリックの証明書作成を使用して、 AWS IoTへのデバイスの接続を認証する証明書を生成します。[**Activate**] (有効化) をクリックして証明書を有効化します。

1. MQTT 予約トピックを発行およびサブスクライブするためのアクセス許可をデバイスに付与するポリシー `My_IoT_Policy` をアタッチできます。 AWS IoT モノの作成方法とこのポリシーの作成方法の詳細については、「」を参照してください[モノのオブジェクトを作成する](create-iot-resources.md#create-aws-thing)。

**モノのオブジェクトの名前の付いたシャドウを作成する**  
以下に示すように、トピック `$aws/things/mySimulatedThing/shadow/name/simShadow1/update` に更新リクエストを発行することで、モノの名前付きシャドウを作成できます。

または、名前付きシャドウを作成するには:

1. **AWS IoT コンソール**で、表示されたモノのリストから自分のモノオブジェクトを選択し、**[Shadows]** (シャドウ) を選択します。

1. [**Add a shadow**] (シャドウの追加) を選択し、名前 `simShadow1` を入力してから、[**Create**] (作成) を選択して名前付きシャドウを追加します。

**予約済みの MQTT トピックをサブスクライブして発行する**  
コンソールで、予約された MQTT シャドウのトピックをサブスクライブします。これらのトピックは `get`、`update`、`delete` アクションに対するレスポンスです。これにより、デバイスがアクションを発行した後にレスポンスを受信できます。

****MQTT クライアント**で MQTT トピックをサブスクライブするには**

1. **MQTT クライアント** で、**[Subscribe to topic]** (トピックのサブスクライブ) を選択します。

1. サブスクライブする `get`、`update`、および `delete` トピックを入力します。次のリストから一度に 1 つのトピックをコピーして **[Topic filter]** (トピックフィルター) フィールドに貼り付け、**[Subscribe]** (サブスクライブ) をクリックします。[**Subscriptions**] (サブスクリプション) の下にトピックが表示されます。
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/delete/accepted`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/delete/rejected`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/documents`

   この時点で、シミュレートされたデバイスは、 AWS IoTによって発行されるトピックを受信する準備が整いました。

****MQTT クライアント**で MQTT トピックを発行するには**  
デバイス自体を初期化してレスポンストピックにサブスクライブした後、サポートしているシャドウを照会する必要があります。このシミュレーションは、*simShadow1* という名前の *mySimulatedThing* というモノのオブジェクトをサポートする 1 つのシャドウのみをサポートします。

****MQTT クライアント**から現在のシャドウ状態を取得するには**

1. **MQTT クライアント**で、[**トピックへの発行**] を選択します。

1. **[Publish]** (発行) で、次のトピックを入力し、取得するトピックを入力した下のメッセージ本文ウィンドウからコンテンツを削除します。その後、[**Publish to topic**] (トピックに発行) を選択してリクエストを発行できます。`$aws/things/mySimulatedThing/shadow/name/simShadow1/get`。

   名前付きシャドウ 、`simShadow1` 、を作成していない場合は、`$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected`トピックでメッセージを受信し、`code` が`404` の場合 (この例のように)、シャドウは作成されていないため、次に作成します。

   ```
   {
     "code": 404,
     "message": "No shadow exists with name: 'simShadow1'"
   }
   ```

**デバイスの現在のステータスを持つシャドウを作成するには**

1. **[MQTT client]** (MQTT クライアント) で、**[Publish to a topic]** (トピックへの発行) を選択し、このトピックを入力します。

   ```
   $aws/things/mySimulatedThing/shadow/name/simShadow1/update
   ```

1. トピックを入力した下のメッセージ本文ウィンドウで、このシャドウドキュメントを入力して、デバイスが ID と現在の色を RGB 値で報告していることを示します。**[Publish]** (発行) を選択してリクエストを発行します。

   ```
   {
     "state": {
       "reported": {
         "ID": "SmartLamp21",
         "ColorRGB": [
           128,
           128,
           128
         ]
       }
     },
     "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6"
   }
   ```

トピックでメッセージを受信した場合は、次のようになります。
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted`: これは、シャドウが作成され、メッセージ本文に現在のシャドウドキュメントが含まれていることを意味します。
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected`: メッセージ本文内のエラーを確認します。
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted`: シャドウは既に存在し、この例のようにメッセージ本文には現在のシャドウ状態があります。これにより、デバイスを設定したり、シャドウ状態と一致していることを確認したりできます。

  ```
  {
    "state": {
      "reported": {
        "ID": "SmartLamp21",
        "ColorRGB": [
          128,
          128,
          128
        ]
      }
    },
    "metadata": {
      "reported": {
        "ID": {
          "timestamp": 1591140517
        },
        "ColorRGB": [
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          }
        ]
      }
    },
    "version": 3,
    "timestamp": 1591140517,
    "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6"
  }
  ```

## アプリからアップデートを送信する
<a name="using-device-shadows-app-update"></a>

このセクションでは、 を使用して AWS CLI 、アプリがシャドウとやり取りする方法を示します。

**を使用してシャドウの現在の状態を取得するには AWS CLI**  
コマンドラインで、次のコマンドを入力します。

```
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
```

Windows プラットフォームでは、`/dev/stdout`の代わりに `con` を使用できます。

```
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
```

シャドウが存在し、デバイスによって現在の状態を反映するように初期化されているため、次のシャドウドキュメントが返されます。

```
{
  "state": {
    "reported": {
      "ID": "SmartLamp21",
      "ColorRGB": [
        128,
        128,
        128
      ]
    }
  },
  "metadata": {
    "reported": {
      "ID": {
        "timestamp": 1591140517
      },
      "ColorRGB": [
        {
          "timestamp": 1591140517
        },
        {
          "timestamp": 1591140517
        },
        {
          "timestamp": 1591140517
        }
      ]
    }
  },
  "version": 3,
  "timestamp": 1591141111
}
```

アプリはこのレスポンスを使用して、デバイスの状態の表現を初期化できます。

エンドユーザーがスマート電球の色を黄色に変更した場合など、アプリが状態を更新した場合、アプリは **update-thing-shadow** コマンドを送信します。このコマンドは `UpdateThingShadow` REST API に対応します。

**アプリからシャドウを更新するには**  
コマンドラインで、次のコマンドを入力します。

------
#### [ AWS CLI v2.x ]

```
aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \
    --cli-binary-format raw-in-base64-out \
    --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout
```

------
#### [ AWS CLI v1.x ]

```
aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \
    --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout
```

------

成功した場合、このコマンドは次のシャドウドキュメントを返します。

```
{
  "state": {
    "desired": {
      "ColorRGB": [
        255,
        255,
        0
      ]
    }
  },
  "metadata": {
    "desired": {
      "ColorRGB": [
        {
          "timestamp": 1591141596
        },
        {
          "timestamp": 1591141596
        },
        {
          "timestamp": 1591141596
        }
      ]
    }
  },
  "version": 4,
  "timestamp": 1591141596,
  "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab"
}
```

## デバイスでの更新に応答
<a name="using-device-shadows-device-update"></a>

 AWS コンソールで **MQTT クライアント**に戻ると、前のセクションで AWS IoT 発行された更新コマンドを反映するために が発行したメッセージが表示されます。

****MQTT クライアント**で更新メッセージを表示するには**  
**[MQTT client]** (MQTT クライアント) の、**[Subscriptions]** (サブスクリプション) 列で **\$1aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta** を選択します。トピック名が切り詰められている場合は、トピック名を一時停止してトピック全体を表示できます。このトピックのトピックログには、次のような `/delta` メッセージが表示されます。

```
{
  "version": 4,
  "timestamp": 1591141596,
  "state": {
    "ColorRGB": [
      255,
      255,
      0
    ]
  },
  "metadata": {
    "ColorRGB": [
      {
        "timestamp": 1591141596
      },
      {
        "timestamp": 1591141596
      },
      {
        "timestamp": 1591141596
      }
    ]
  },
  "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab"
}
```

デバイスはこのメッセージの内容を処理して、デバイスの状態がメッセージ内の `desired` 状態と一致するように設定します。

デバイスは、メッセージ内の状態と一致するように`desired`状態を更新した後、更新メッセージを公開 AWS IoT して、新しいレポートされた状態を に送信する必要があります。この手順では、**MQTT クライアント**でこれをシミュレートします。

**デバイスからシャドウを更新するには**

1. **MQTT クライアント**で、[**トピックへの発行**] を選択します。

1. メッセージ本文ウィンドウで、メッセージ本文ウィンドウの上にあるトピックフィールドに、シャドウのトピックを入力し、その後に `/update` アクションを入力します: `$aws/things/mySimulatedThing/shadow/name/simShadow1/update`とメッセージ本文に、デバイスの現在の状態を説明するこの更新されたシャドウドキュメントを入力します。[**Publish**] (発行) をクリックして、更新されたデバイス状態を発行します。

   ```
   {
     "state": {
       "reported": {
         "ColorRGB": [255,255,0]
         }
     },
     "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258"
   }
   ```

   メッセージが によって正常に受信された場合 AWS IoT、この例のようなシャドウの現在の状態を持つ **MQTT クライアントの** **\$1aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted** メッセージログに新しいレスポンスが表示されます。

   ```
   {
     "state": {
       "reported": {
         "ColorRGB": [
           255,
           255,
           0
         ]
       }
     },
     "metadata": {
       "reported": {
         "ColorRGB": [
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           }
         ]
       }
     },
     "version": 5,
     "timestamp": 1591142747,
     "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258"
   }
   ```

デバイスの報告された状態を正常に更新 AWS IoT すると、 は、前述の手順でデバイスによって実行されたシャドウ更新に起因するこのメッセージ本文など、メッセージのシャドウ状態の包括的な説明を `update/documents`トピックに送信します。

```
{
  "previous": {
    "state": {
      "desired": {
        "ColorRGB": [
          255,
          255,
          0
        ]
      },
      "reported": {
        "ID": "SmartLamp21",
        "ColorRGB": [
          128,
          128,
          128
        ]
      }
    },
    "metadata": {
      "desired": {
        "ColorRGB": [
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          }
        ]
      },
      "reported": {
        "ID": {
          "timestamp": 1591140517
        },
        "ColorRGB": [
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          }
        ]
      }
    },
    "version": 4
  },
  "current": {
    "state": {
      "desired": {
        "ColorRGB": [
          255,
          255,
          0
        ]
      },
      "reported": {
        "ID": "SmartLamp21",
        "ColorRGB": [
          255,
          255,
          0
        ]
      }
    },
    "metadata": {
      "desired": {
        "ColorRGB": [
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          }
        ]
      },
      "reported": {
        "ID": {
          "timestamp": 1591140517
        },
        "ColorRGB": [
          {
            "timestamp": 1591142747
          },
          {
            "timestamp": 1591142747
          },
          {
            "timestamp": 1591142747
          }
        ]
      }
    },
    "version": 5
  },
  "timestamp": 1591142747,
  "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258"
}
```

## アプリで更新を確認する
<a name="using-device-shadows-view-result"></a>

アプリは、デバイスによって報告された現在の状態をシャドウに照会できるようになりました。

**を使用してシャドウの現在の状態を取得するには AWS CLI**

1. コマンドラインで、次のコマンドを入力します。

   ```
   aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
   ```

   Windows プラットフォームでは、`/dev/stdout`の代わりに `con`を使用できます。

   ```
   aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
   ```

1. シャドウは現在の状態を反映するようにデバイスによって更新されたばかりなので、次のシャドウドキュメントを返します。

   ```
   {
     "state": {
       "desired": {
         "ColorRGB": [
           255,
           255,
           0
         ]
       },
       "reported": {
         "ID": "SmartLamp21",
         "ColorRGB": [
           255,
           255,
           0
         ]
       }
     },
     "metadata": {
       "desired": {
         "ColorRGB": [
           {
             "timestamp": 1591141596
           },
           {
             "timestamp": 1591141596
           },
           {
             "timestamp": 1591141596
           }
         ]
       },
       "reported": {
         "ID": {
           "timestamp": 1591140517
         },
         "ColorRGB": [
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           }
         ]
       }
     },
     "version": 5,
     "timestamp": 1591143269
   }
   ```

## シミュレーションを超える
<a name="using-device-shadows-next-steps"></a>

 AWS CLI (アプリを表す) とコンソール (デバイスを表す) の間の相互作用を試して、IoT ソリューションをモデル化します。