

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

# アプリとサービスでのシャドウの使用
<a name="device-shadow-comms-app"></a>

このセクションでは、アプリケーションまたはサービスが AWS IoT Device Shadow サービスとやり取りする方法について説明します。この例では、アプリまたはサービスがシャドウと、シャドウを介してデバイスとのみ相互作用していることを前提としています。この例には、シャドウの作成や削除などの管理アクションは含まれていません。

この例では、 AWS IoT Device Shadow サービスの REST API を使用してシャドウを操作します。発行/サブスクライブ通信モデルを使用する [デバイスでのシャドウの使用](device-shadow-comms-device.md) で使用される例とは異なり、この例では REST API のリクエスト/レスポンス通信モデルを使用します。つまり、アプリケーションまたはサービスは、レスポンスを受信する前にリクエストを行う必要があります AWS IoT。ただし、このモデルの欠点は、通知をサポートしていないことです。アプリまたはサービスで、デバイスの状態の変更をタイムリーに通知する必要がある場合は、「[デバイスでのシャドウの使用](device-shadow-comms-device.md)」で説明されているように、パブリッシュ/サブスクライブ通信モデルをサポートする WSS プロトコル経由の MQTT または MQTT を検討してください。

**重要**  
アプリまたはサービスによるシャドウの使用が、デバイス内の対応する実装と一致し、サポートされていることを確認します。たとえば、シャドウの作成、更新、削除方法、デバイスとシャドウにアクセスするアプリまたはサービスで更新がどのように処理されるかを検討します。デザインでは、デバイスの状態の更新と報告方法、アプリやサービスがデバイスとそのシャドウとどのように相互作用するかを明確に指定する必要があります。

名前付きシャドウの REST API の URL は次のとおりです。

```
https://endpoint/things/thingName/shadow?name=shadowName
```

名前のないシャドウの場合：

```
https://endpoint/things/thingName/shadow
```

各パラメータの意味は次のとおりです。

エンドポイント  
CLI コマンドによって返されるエンドポイント。  

```
aws iot describe-endpoint --endpoint-type IOT:Data-ATS
```

thingName  
シャドウが属する Thing オブジェクトの名前

shadowName  
名前付きシャドウの名前。このパラメータは、名前のないシャドウでは使用されません。

## への接続時にアプリまたはサービスを初期化する AWS IoT
<a name="device-shadow-comms-app-first-connect"></a>

アプリが最初に接続するときは AWS IoT、使用しているシャドウの現在の状態を取得するために使用するシャドウの URLs に HTTP GET リクエストを送信する必要があります。これにより、アプリまたはサービスをシャドウと同期させることができます。

## アプリケーションまたはサービスが に接続されている間の処理状態の変更 AWS IoT
<a name="device-shadow-comms-app-while-connected"></a>

アプリケーションまたはサービスが接続されている間は AWS IoT、使用するシャドウの URLs に HTTP GET リクエストを送信することで、定期的に現在の状態をクエリできます。

エンドユーザーがアプリまたはサービスと対話してデバイスの状態を変更すると、アプリまたはサービスは、シャドウの `desired` 状態を更新するために使用するシャドウの URL に HTTP POST リクエストを送信できます。このリクエストは受け入れられた変更を返しますが、デバイスがシャドウを新しい状態で更新するまで HTTP GET リクエストを行い、シャドウをポーリングする必要がある場合があります。

## デバイスが接続されているかどうかの検出
<a name="thing-connection"></a>

デバイスが現在接続されているかどうかを確認するには、シャドウドキュメントに `connected` プロパティを含めて、MQTT Last Wy and Testament (LWT) メッセージを使用して、デバイスがエラーにより切断された場合に、`connected` プロパティを `false` に設定します。

**注記**  
 AWS IoT 予約済みトピック (\$1 で始まるトピック) に送信される MQTT LWT メッセージは、 AWS IoT Device Shadow サービスによって無視されます。ただし、これらはサブスクライブされたクライアントと AWS IoT ルールエンジンによって処理されるため、予約されていないトピックに送信される LWT メッセージと、シャドウの予約された更新トピック にシャドウ更新メッセージとして MQTT LWT メッセージを再発行するルールを作成する必要があります`ShadowTopicPrefix/update`。

**Device Shadow サービスに LWT メッセージを送信するには**

1. 予約されたトピックで MQTT LWT メッセージを再発行するルールを作成します。次の例は、 `my/things/myLightBulb/update` トピックに関するメッセージをリッスンし、`$aws/things/myLightBulb/shadow/update` に再発行するルールです。

   ```
   {
       "rule": {
       "ruleDisabled": false,
       "sql": "SELECT * FROM 'my/things/myLightBulb/update'",
       "description": "Turn my/things/ into $aws/things/",
       "actions": [
           {
           "republish": {
               "topic": "$$aws/things/myLightBulb/shadow/update",
               "roleArn": "arn:aws:iam:123456789012:role/aws_iot_republish"
               }
           }
        ]
      }
   }
   ```

1. デバイスが に接続すると AWS IoT、再発行ルールが認識する予約されていないトピックに LWT メッセージが登録されます。この例では、トピックが `my/things/myLightBulb/update` であり、connected プロパティを `false` に設定します。

   ```
   {
       "state": {        
           "reported": {
               "connected":"false"
           }
       }
   }
   ```

1. 接続後、デバイスはシャドウ更新トピック、`$aws/things/myLightBulb/shadow/update` に関するメッセージを発行し、`connected` プロパティを `true` に設定することを含む現在の状態を報告します。

   ```
   {
        "state": {        
           "reported": {
               "connected":"true"
           }
       }
   }
   ```

1. デバイスは正常に切断する前に、シャドウ更新トピック、`$aws/things/myLightBulb/shadow/update` に関するメッセージを発行し、`connected` プロパティを `false` に設定することを含む最新の状態を報告します。

   ```
   {
       "state": {        
           "reported": {
               "connected":"false"
           }
       }
   }
   ```

1. エラーによりデバイスが切断された場合、 AWS IoT メッセージブローカーはデバイスに代わってデバイスの LWT メッセージを発行します。再発行ルールはこのメッセージを検出し、シャドウ更新メッセージを発行してデバイスシャドウの `connected` プロパティを更新します。

**注記**  
切断処理は非同期であるため、再接続時に LWT メッセージが順番にディスパッチされるとは限りません。接続状態の検出精度を向上させるために、[ライフサイクルイベント](life-cycle-events.md)を使用することをお勧めします。これらのイベントでは、順不同のイベントを管理するための属性が提供されています。