

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

# チュートリアル: Device SDK AWS IoT Core を使用して AWS IoT デバイスを に接続する
<a name="sdk-tutorials"></a>

このチュートリアルでは、デバイスを に接続 AWS IoT Core して、データを送受信する方法を示します AWS IoT。このチュートリアルを完了する AWS IoT Core と、デバイスが に接続するように設定され、デバイスが と通信する方法を理解できます AWS IoT。

**Topics**
+ [前提条件](#sdk-tutorials-prereq)
+ [のデバイスを準備します。 AWS IoT](#sdk-tutorials-prepare)
+ [MQTT プロトコルを確認する](#sdk-tutorials-mqtt-review)
+ [pubsub.py Device SDK サンプルアプリケーションを確認する](#sdk-tutorials-explore-sample)
+ [デバイスを接続して と通信する AWS IoT Core](#sdk-tutorials-experiment)
+ [結果を確認する](#sdk-tutorials-conclusion)
+ [チュートリアル: AWS IoT Device SDK for Embedded C の使用](iot-embedded-c-sdk.md)

## 前提条件
<a name="sdk-tutorials-prereq"></a>

このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
+ 

**[AWS IoT Core チュートリアルの開始方法](iot-gs.md) を完了していること**  
[デバイスを設定する](configure-device.md) する必要があるチュートリアルのセクションで、デバイスの [Raspberry Pi または他のデバイスを接続する](connecting-to-existing-device.md) オプションを選択し、Python 言語オプションを使用してデバイスを設定します。
**注記**  
このチュートリアルでも使用するため、そのチュートリアルで使用するターミナルウィンドウは開いたままにします。
+ 

**Device SDK v2 for Python を実行できる AWS IoT デバイス。**  
このチュートリアルでは、比較的強力なデバイスを必要とする Python コード例 AWS IoT Core を使用して、デバイスを に接続する方法を示します。リソースに制約のあるデバイスを使用している場合は、これらのコード例が機能しない可能性があります。その場合は、「[チュートリアル: AWS IoT Device SDK for Embedded C の使用](iot-embedded-c-sdk.md)」チュートリアルの方が、接続に成功する可能性がより高くなります。
+ 

**デバイスに接続するために必要な情報を取得済みであること**  
デバイスを に接続するには AWS IoT、モノの名前、ホスト名、ポート番号に関する情報が必要です。
**注記**  
カスタム認証を使用してデバイスを AWS IoT Coreに接続することもできます。オーソライザーの Lambda 関数に渡す接続データは、使用するプロトコルによって異なります。
  + **モノの名前**: 接続する AWS IoT モノの名前。デバイスとして を AWS IoT モノとして登録している必要があります。詳細については、「[を使用したデバイスの管理 AWS IoT](iot-thing-management.md)」を参照してください。
  + **ホスト名**: アカウント固有の IoT エンドポイントのホスト名。
  + **ポート番号**: 接続先のポート番号。

  Python SDK の AWS IoT `configureEndpoint`メソッドを使用して、ホスト名とポート番号を設定できます。

  ```
  myAWSIoTMQTTClient.configureEndpoint("random.iot.region.amazonaws.com", 8883)
  ```

## のデバイスを準備します。 AWS IoT
<a name="sdk-tutorials-prepare"></a>

[AWS IoT Core チュートリアルの開始方法](iot-gs.md) では、デバイスと AWS アカウントが通信できるように準備しました。このセクションでは、 とのデバイス接続に適用される準備の側面を確認します AWS IoT Core。

デバイスの AWS IoT Core接続に際して

1. **AWS アカウント** が必要です。

   の手順[セットアップ AWS アカウント](setting-up.md)では、 をまだ作成 AWS アカウント していない場合に を作成する方法について説明します。

1. そのアカウントでは、 AWS アカウント および リージョンのデバイスに次の**AWS IoT リソース**を定義する必要があります。

   [AWS IoT リソースの作成](create-iot-resources.md) の手順では、 AWS アカウント とリージョンのデバイス用にこれらのリソースを作成する方法が示されています。
   +  AWS IoT に登録され、デバイスを認証するために有効化された**デバイス証明書**。

     多くの場合、証明書は **AWS IoT モノのオブジェクト**を使用して作成され、そのオブジェクトにアタッチされます。モノのオブジェクトはデバイスが に接続するためには必要ありませんが AWS IoT、追加の AWS IoT 機能がデバイスで利用可能になります。
   + デバイス証明書にアタッチされた**ポリシー**で、接続 AWS IoT Core して必要なすべてのアクションを実行することを許可します。

1.  AWS アカウントのデバイスエンドポイントにアクセスできる**インターネット接続**。

   デバイスエンドポイントは で説明[AWS IoT デバイスデータとサービスエンドポイント](iot-connect-devices.md#iot-connect-device-endpoints)されており、[AWS IoT コンソールの設定ページ](https://console.aws.amazon.com/iot/home#/settings)に表示されます。

1. **通信ソフトウェア** ( AWS IoT Device SDK が提供するものなど)。このチュートリアルでは、[AWS IoT Device SDK v2 for Python](https://github.com/aws/aws-iot-device-sdk-python-v2#aws-iot-device-sdk-v2-for-python) を使用します。

## MQTT プロトコルを確認する
<a name="sdk-tutorials-mqtt-review"></a>

サンプルアプリケーションについて説明する前に、MQTT プロトコルを理解しておくと役立ちます。MQTT プロトコルには、HTTP などの他のネットワーク通信プロトコルに比べていくつかの利点があり、IoT デバイスで一般的な選択肢となっています。このセクションでは、このチュートリアルに適用される MQTT の主要な側面を確認します。MQTT と HTTP を比較する方法の詳細については、「[デバイス通信用のアプリケーションプロトコルの選択](protocols.md#protocol-selection)」を参照してください。

**MQTT は、発行/サブスクライブ通信モデルを使用します**  
MQTT プロトコルは、ホストとの発行/サブスクライブ通信モデルを使用します。このモデルは、HTTP が使用するリクエスト/応答モデルとは異なります。MQTT では、デバイスは一意のクライアント ID によって識別されるホストとのセッションを確立します。データを送信するために、デバイスはトピックによって識別されたメッセージをホストのメッセージブローカーに発行します。メッセージブローカーからメッセージを受信するために、デバイスは、サブスクリプションリクエストでトピックフィルターをメッセージブローカーに送信することにより、トピックをサブスクライブします。

**MQTT サポート永続セッション**  
メッセージブローカーは、デバイスからメッセージを受信し、サブスクライブしているデバイスにメッセージを発行します。[永続セッション](mqtt.md#mqtt-persistent-sessions) (開始デバイスが切断されている場合でもアクティブなセッション) では、デバイスは、切断中に発行されたメッセージを取得できます。デバイス側では、MQTT は、デバイスによって送信されたメッセージをホストが確実に受信できるようにするサービス品質レベル ([QoS](mqtt.md#mqtt-qos)) をサポートします。

## pubsub.py Device SDK サンプルアプリケーションを確認する
<a name="sdk-tutorials-explore-sample"></a>

このセクションでは、このチュートリアルで使用されている **AWS IoT Device SDK v2 for Python** の `pubsub.py` サンプルアプリケーションを確認します。ここでは、 に接続 AWS IoT Core して MQTT メッセージを発行およびサブスクライブする方法を確認します。次のセクションでは、デバイスが接続および通信する方法を調べるのに役立ついくつかの演習を示します AWS IoT Core。

**`pubsub.py` サンプルアプリケーションは、 との MQTT 接続のこれらの側面を示しています AWS IoT Core。**
+ [通信プロトコル](#sdk-tutorials-explore-protocols)
+ [永続セッション](#sdk-tutorials-explore-persistent)
+ [サービスの品質](#sdk-tutorials-explore-qos)
+ [メッセージの発行](#sdk-tutorials-explore-publish)
+ [メッセージのサブスクリプション](#sdk-tutorials-explore-subscribe)
+ [デバイスの切断と再接続](#sdk-tutorials-explore-connect)

### 通信プロトコル
<a name="sdk-tutorials-explore-protocols"></a>

`pubsub.py` サンプルは、MQTT および MQTT over WSS プロトコルを使用した MQTT 接続を示しています。[AWS 共通ランタイム (AWS CRT)](https://github.com/awslabs/aws-crt-python#aws-crt-python) ライブラリは、低レベルの通信プロトコルサポートを提供し、 AWS IoT Device SDK v2 for Python に含まれています。

#### MQTT
<a name="sdk-tutorials-explore-mqtt"></a>

この`pubsub.py`サンプルでは`mtls_from_path`、MQTT プロトコル AWS IoT Core を使用して との接続を確立[https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py)するために、 で (ここに示す) を呼び出します。 `mtls_from_path`は X.509 証明書と TLS v1.2 を使用してデバイスを認証します。CRT AWS ライブラリは、その接続の下位レベルの詳細を処理します。

```
mqtt_connection = mqtt_connection_builder.mtls_from_path(
    endpoint=args.endpoint,
    cert_filepath=args.cert,
    pri_key_filepath=args.key,
    ca_filepath=args.ca_file,
    client_bootstrap=client_bootstrap,
    on_connection_interrupted=on_connection_interrupted,
    on_connection_resumed=on_connection_resumed,
    client_id=args.client_id,
    clean_session=False,
    keep_alive_secs=6
)
```

`endpoint`  
 AWS アカウントの IoT デバイスエンドポイント  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`cert_filepath`  
デバイスの証明書ファイルへのパス  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`pri_key_filepath`  
証明書ファイルで作成されたデバイスのプライベートキーファイルへのパス  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`ca_filepath`  
Root CA ファイルへのパス。MQTT サーバーがまだトラストストアにない証明書を使用する場合にのみ必要です。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`client_bootstrap`  
ソケット通信アクティビティを処理する共通ランタイムオブジェクト  
サンプルアプリケーションでは、このオブジェクトは `mqtt_connection_builder.mtls_from_path` の呼び出しの前にインスタンス化されます。

`on_connection_interrupted``on_connection_resumed`  
デバイスの接続が中断され、再開されたときに呼び出すコールバック関数

`client_id`  
 AWS リージョンでこのデバイスを一意に識別する ID  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`clean_session`  
新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合)

`keep_alive_secs`  
`CONNECT` リクエストで送信するキープアライブ値 (秒単位)。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

#### MQTT over WSS
<a name="sdk-tutorials-explore-mqtt-wss"></a>

`pubsub.py` サンプルでは、[https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py) の `websockets_with_default_aws_signing` (以下に示されています) を呼び出して、WSS 経由で MQTT プロトコルを使用して AWS IoT Core との接続を確立します。`websockets_with_default_aws_signing` は、[署名 V4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) を使用して WSS 経由で MQTT 接続を作成し、デバイスを認証します。

```
mqtt_connection = mqtt_connection_builder.websockets_with_default_aws_signing(
    endpoint=args.endpoint,
    client_bootstrap=client_bootstrap,
    region=args.signing_region,
    credentials_provider=credentials_provider,
    websocket_proxy_options=proxy_options,
    ca_filepath=args.ca_file,
    on_connection_interrupted=on_connection_interrupted,
    on_connection_resumed=on_connection_resumed,
    client_id=args.client_id,
    clean_session=False,
    keep_alive_secs=6
)
```

`endpoint`  
 AWS アカウントの IoT デバイスエンドポイント  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`client_bootstrap`  
ソケット通信アクティビティを処理する共通ランタイムオブジェクト  
サンプルアプリケーションでは、このオブジェクトは `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの前にインスタンス化されます。

`region`  
 AWS 署名 V4 認証で使用される署名リージョン。`pubsub.py` では、コマンドラインに入力されたパラメータを渡します。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`credentials_provider`  
認証に使用するために提供される AWS 認証情報  
サンプルアプリケーションでは、このオブジェクトは `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの前にインスタンス化されます。

`websocket_proxy_options`  
HTTP プロキシオプション (プロキシホストを使用している場合)  
サンプルアプリケーションでは、この値は `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの前に初期化されます。

`ca_filepath`  
Root CA ファイルへのパス。MQTT サーバーがまだトラストストアにない証明書を使用する場合にのみ必要です。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`on_connection_interrupted``on_connection_resumed`  
デバイスの接続が中断され、再開されたときに呼び出すコールバック関数

`client_id`  
 AWS リージョンでこのデバイスを一意に識別する ID。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`clean_session`  
新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合)

`keep_alive_secs`  
`CONNECT` リクエストで送信するキープアライブ値 (秒単位)。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

#### HTTPS
<a name="sdk-tutorials-explore-https"></a>

HTTPS とは? では、HTTPS リクエストを発行するデバイス AWS IoT Core をサポートしています。プログラミングの観点からは、デバイスは他のアプリケーションと同様に HTTPS リクエストを AWS IoT Core に送信します。デバイスから HTTP メッセージを送信する Python プログラムの例については、Python の `requests` ライブラリを使用した [HTTPS コード例](http.md#codeexample)を参照してください。この例では、 が AWS IoT Core MQTT メッセージとして解釈するように、HTTPS AWS IoT Core を使用して にメッセージを送信します。

はデバイスからの HTTPS リクエスト AWS IoT Core をサポートしますが、デバイスの通信に使用するプロトコルについて情報に基づいた決定[デバイス通信用のアプリケーションプロトコルの選択](protocols.md#protocol-selection)ができるように、 に関する情報を必ず確認してください。

### 永続セッション
<a name="sdk-tutorials-explore-persistent"></a>

サンプルアプリケーションでは、`clean_session` パラメータを `False` に設定して、接続を永続化する必要があることを示します。実際には、これは、この呼び出しによって開かれた接続が、既存の永続セッション (存在する場合) に再接続することを意味します。そうでなければ、新しい永続セッションを作成して接続します。

永続セッションでは、デバイスに送信されたメッセージは、デバイスが接続されていない間、メッセージブローカーによって保存されます。デバイスが永続セッションに再接続すると、メッセージブローカーは、サブスクライブしている保存済みメッセージをデバイスに送信します。

永続セッションがない場合、デバイスは、デバイスが接続されていないときに送信されたメッセージを受信しません。どのオプションを使用するかは、アプリケーションと、デバイスが接続されていないときに発生するメッセージを通信する必要があるかどうかによって異なります。詳細については、「」を参照してください[MQTT 永続的セッション](mqtt.md#mqtt-persistent-sessions)

### サービスの品質
<a name="sdk-tutorials-explore-qos"></a>

デバイスがメッセージを発行およびサブスクライブするときに、優先するサービス品質 (QoS) を設定できます。 は、発行およびサブスクライブオペレーションの QoS レベル 0 と 1 AWS IoT をサポートします。の QoS レベルの詳細については AWS IoT、「」を参照してください[MQTT Quality of Service (QoS) オプション](mqtt.md#mqtt-qos)。

Python の AWS CRT ランタイムは、サポートされる QoS レベルにこれらの定数を定義します。


**Python サービス品質レベル**  

| MQTT QoS レベル | SDK で使用される Python シンボリック値 | 説明 | 
| --- | --- | --- | 
| QoS レベル 0 | mqtt.QoS.AT\$1MOST\$1ONCE | メッセージの送信は、受信されたかどうかにかかわらず、1 回だけ行われます。例えば、デバイスが接続されていない場合やネットワークエラーがある場合など、メッセージがまったく送信されない場合があります。 | 
| QoS レベル 1 | mqtt.QoS.AT\$1LEAST\$1ONCE | メッセージは、PUBACK 確認応答を受信するまで繰り返し送信されます。 | 

サンプルアプリケーションでは、発行およびサブスクライブのリクエストは QoS レベル 1 (`mqtt.QoS.AT_LEAST_ONCE`) で行われます。
+ 

**発行での QoS**  
デバイスが QoS レベル 1 のメッセージを発行すると、メッセージブローカーからの `PUBACK` 応答を受信するまでメッセージが繰り返し送信されます。デバイスが接続されていない場合、メッセージは再接続後に送信されるようにキューに入れられます。
+ 

**サブスクライブでの QoS**  
デバイスが QoS レベル 1 のメッセージをサブスクライブすると、メッセージブローカーは、デバイスに送信できるようになるまで、デバイスがサブスクライブしているメッセージを保存します。メッセージブローカーは、デバイスから `PUBACK` 応答を受信するまでメッセージを再送信します。

### メッセージの発行
<a name="sdk-tutorials-explore-publish"></a>

への接続が正常に確立されると AWS IoT Core、デバイスはメッセージを発行できます。`pubsub.py` サンプルでは、`mqtt_connection` オブジェクトの `publish` オペレーションを呼び出してこれを行います。

```
mqtt_connection.publish(
    topic=args.topic,
    payload=message,
    qos=mqtt.QoS.AT_LEAST_ONCE
)
```

`topic`  
メッセージを識別するメッセージのトピック名  
サンプルアプリケーションでは、これはコマンドラインから渡されます。

`payload`  
文字列としてフォーマットされたメッセージペイロード (例: JSON ドキュメント)  
サンプルアプリケーションでは、これはコマンドラインから渡されます。  
JSON ドキュメントは一般的なペイロード形式であり、他の AWS IoT のサービスによって認識されます。ただし、メッセージペイロードのデータ形式は、パブリッシャーとサブスクライバーが同意する任意の形式にすることができます。ただし、他の AWS IoT サービスでは、いくつかのケースにおいて、ほとんどのオペレーションで JSON と CBOR のみが認識されます。

`qos`  
このメッセージの QoS レベル

### メッセージのサブスクリプション
<a name="sdk-tutorials-explore-subscribe"></a>

 AWS IoT およびその他の のサービスやデバイスからメッセージを受信するには、デバイスはそれらのメッセージをトピック名でサブスクライブします。デバイスは、[トピック名](topics.md#topicnames)を指定して個々のメッセージをサブスクライブし、ワイルドカード文字を含めることができる[トピックフィルター](topics.md#topicfilters)を指定してメッセージのグループをサブスクライブできます。この `pubsub.py` サンプルでは、ここに示すコードを使用してメッセージをサブスクライブし、受信後にメッセージを処理するためのコールバック関数を登録します。

```
subscribe_future, packet_id = mqtt_connection.subscribe(
    topic=args.topic,
    qos=mqtt.QoS.AT_LEAST_ONCE,
    callback=on_message_received
)
subscribe_result = subscribe_future.result()
```

`topic`  
サブスクライブするトピック。これは、トピック名またはトピックフィルターにすることができます。  
サンプルアプリケーションでは、これはコマンドラインから渡されます。

`qos`  
デバイスが切断されている間、メッセージブローカーがこれらのメッセージを保存する必要があるかどうか。  
`mqtt.QoS.AT_LEAST_ONCE` (QoS レベル 1) の値では、接続の作成時に永続セッションを指定する必要があります (`clean_session=False`)。

`callback`  
サブスクライブされたメッセージを処理するために呼び出す関数。

`mqtt_connection.subscribe` 関数は、future とパケット ID を返します。サブスクリプションリクエストが正常に開始された場合、返されるパケット ID は 0 より大きくなります。サブスクリプションがメッセージブローカーによって受信され、登録されたことを確認するには、コード例に示すように、非同期オペレーションの結果が返されるまで待機する必要があります。

**コールバック関数**  
`pubsub.py` サンプルのコールバックは、デバイスがサブスクライブされたメッセージを受信したときに処理します。

```
def on_message_received(topic, payload, **kwargs):
    print("Received message from topic '{}': {}".format(topic, payload))
    global received_count
    received_count += 1
    if received_count == args.count:
        received_all_event.set()
```

`topic`  
メッセージのトピック  
これは、トピックフィルターにサブスクライブしている場合でも、受信したメッセージの特定のトピック名です。

`payload`  
メッセージペイロード  
このフォーマットはアプリケーション固有です。

`kwargs`  
[https://awslabs.github.io/aws-crt-python/api/mqtt.html#awscrt.mqtt.Connection.subscribe](https://awslabs.github.io/aws-crt-python/api/mqtt.html#awscrt.mqtt.Connection.subscribe) で説明されている可能な追加の引数。

`pubsub.py` サンプルでは、`on_message_received` はトピックとそのペイロードのみを表示します。また、制限に達した後、プログラムを終了するために受信したメッセージもカウントします。

アプリケーションはトピックとペイロードを評価して、実行するアクションを決定します。

### デバイスの切断と再接続
<a name="sdk-tutorials-explore-connect"></a>

`pubsub.py` サンプルには、デバイスが切断されたときと接続が再確立されたときに呼び出されるコールバック関数が含まれています。これらのイベントに対してデバイスが実行するアクションは、アプリケーション固有です。

デバイスが初めて接続するとき、受信するトピックをサブスクライブする必要があります。再接続時にデバイスのセッションが存在する場合、そのサブスクリプションが復元され、それらのサブスクリプションから保存されたメッセージは再接続後にデバイスに送信されます。

再接続時にデバイスのセッションが存在しない場合は、サブスクリプションを再サブスクライブする必要があります。永続セッションには有効期限があり、デバイスが切断されている時間が長すぎると期限切れになる可能性があります。

## デバイスを接続して と通信する AWS IoT Core
<a name="sdk-tutorials-experiment"></a>

このセクションでは、デバイスの AWS IoT Coreへの接続のさまざまな側面を詳しく知るのに役立ついくつかの演習を紹介します。これらの演習では、 AWS IoT コンソールで [MQTT テストクライアント](https://console.aws.amazon.com/iot/home#/test)を使用して、デバイスが発行する内容を確認し、デバイスにメッセージを発行します。これらの演習では、「[AWS IoT Device SDK v2 for Python](https://github.com/aws/aws-iot-device-sdk-python-v2/tree/master/samples#sample-apps-for-the-aws-iot-device-sdk-v2-for-python)」の [https://github.com/aws/aws-iot-device-sdk-python-v2/blob/master/samples/pubsub.py](https://github.com/aws/aws-iot-device-sdk-python-v2/blob/master/samples/pubsub.py) サンプルを使用し、「[AWS IoT Core チュートリアルの開始方法](iot-gs.md)」のチュートリアルで得た経験を基に構築します。

**Topics**
+ [ワイルドカードトピックフィルターをサブスクライブする](#sdk-tutorials-experiment-wild)
+ [トピックフィルターのサブスクリプションを処理する](#sdk-tutorials-experiment-process)
+ [デバイスからメッセージを発行する](#sdk-tutorials-experiment-publish)

これらの演習では、`pubsub.py` サンプルプログラムから始めます。

**注記**  
これらの演習では、[AWS IoT Core チュートリアルの開始方法](iot-gs.md) のチュートリアルを完了しており、そのチュートリアルのデバイスのターミナルウィンドウを使用していることを前提としています。

### ワイルドカードトピックフィルターをサブスクライブする
<a name="sdk-tutorials-experiment-wild"></a>

この演習では、`pubsub.py` を呼び出してワイルドカードトピックフィルターをサブスクライブするために使用するコマンドラインを変更し、メッセージのトピックに基づいて受信したメッセージを処理します。

#### 演習手順
<a name="sdk-tutorials-experiment-wild-steps"></a>

この演習では、デバイスに温度制御と照明制御が含まれていると想像してください。これらのトピック名を使用して、トピックに関するメッセージを識別します。

1. 演習を開始する前に、[AWS IoT Core チュートリアルの開始方法](iot-gs.md) のチュートリアルのこのコマンドをデバイスで実行して、演習の準備がすべて整っていることを確認してください。

   ```
   cd ~/aws-iot-device-sdk-python-v2/samples
   python3 pubsub.py --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

   [開始方法のチュートリアル](connecting-to-existing-device.md#gs-device-node-app-run)で見たのと同じ出力が表示されるはずです。

1. この演習では、これらのコマンドラインパラメータを変更します。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/sdk-tutorials.html)

   これらの変更を最初のコマンドラインに加えると、このコマンドラインになります。デバイスのターミナルウィンドウにこのコマンドを入力します。

   ```
   python3 pubsub.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

   プログラムは次のように表示されます。

   ```
   Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-24d7cdcc-cc01-458c-8488-2d05849691e1'...
   Connected!
   Subscribing to topic 'device/+/details'...
   Subscribed with QoS.AT_LEAST_ONCE
   Waiting for all messages to be received...
   ```

   ターミナルにこのように表示された場合、デバイスは準備ができており、トピック名が `device`で始まり `/detail`で終わるメッセージをリッスンしています。それでは、それをテストしてみましょう。

1. デバイスが受信する可能性のあるメッセージをいくつか示します。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/sdk-tutorials.html)

1.  AWS IoT コンソールで MQTT テストクライアントを使用して、前のステップで説明したメッセージをデバイスに送信します。

   1.  AWS IoT コンソールで [MQTT テストクライアント](https://console.aws.amazon.com/iot/home#/test)を開きます。

   1. [**Subscribe to topic**] (トピックへのサブスクライブ) の [**Subscription topic**] (トピックのサブスクリプション) フィールドで、トピックフィルター **device/\$1/details** を入力して、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

   1. MQTT テストクライアントの [**Subscriptions**] (サブスクリプション) 列で、[**device/\$1/details**] を選択します。

   1. 上記の表の各トピックについて、MQTT テストクライアントで次の操作を行います。

      1. [**Publish**] (発行) で、テーブルの [**Topic name**] (トピック名) 列の値を入力します。

      1. トピック名の下のメッセージペイロードフィールドに、表の [**Message payload**] (メッセージペイロード) 列の値を入力します。

      1. `pubsub.py` が実行されているターミナルウィンドウを確認し、MQTT テストクライアントで [**Publish to topic**] (トピックに発行) を選択します。

      ターミナルウィンドウで `pubsub.py` によってメッセージが受信されたことがわかります。

#### 演習結果
<a name="sdk-tutorials-experiment-wild-result"></a>

これにより、`pubsub.py` は、ワイルドカードトピックフィルターを使用してメッセージをサブスクライブし、それらを受信し、ターミナルウィンドウに表示しました。単一のトピックフィルターをサブスクライブし、2 つの異なるトピックを持つメッセージを処理するためにコールバック関数が呼び出されたことに注意してください。

### トピックフィルターのサブスクリプションを処理する
<a name="sdk-tutorials-experiment-process"></a>

前の演習に基づいて、`pubsub.py` サンプルアプリケーションを変更してメッセージトピックを評価し、トピックに基づいてサブスクライブされたメッセージを処理します。

#### 演習手順
<a name="sdk-tutorials-experiment-process-steps"></a>

**メッセージトピックを評価するには**

1. `pubsub.py` を `pubsub2.py` にコピーします。

1. お好きなテキストエディタまたは IDE で `pubsub2.py` を開きます。

1. `pubsub2.py` で、`on_message_received` 関数を見つけます。

1. `on_message_received` で、次のコードを `print("Received message` で始まる行の後、および `global received_count` で始まる行の前に挿入します。

   ```
       topic_parsed = False
       if "/" in topic:
           parsed_topic = topic.split("/")
           if len(parsed_topic) == 3:
               # this topic has the correct format
               if (parsed_topic[0] == 'device') and (parsed_topic[2] == 'details'):
                   # this is a topic we care about, so check the 2nd element
                   if (parsed_topic[1] == 'temp'):
                       print("Received temperature request: {}".format(payload))
                       topic_parsed = True
                   if (parsed_topic[1] == 'light'):
                       print("Received light request: {}".format(payload))
                       topic_parsed = True
       if not topic_parsed:
           print("Unrecognized message topic.")
   ```

1. このコマンドラインを使用して、変更を保存し、変更したプログラムを実行します。

   ```
   python3 pubsub2.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

1.  AWS IoT コンソールで、[MQTT テストクライアント](https://console.aws.amazon.com/iot/home#/test)を開きます。

1. [**Subscribe to topic**] (トピックへのサブスクライブ) の [**Subscription topic**] (トピックのサブスクリプション) フィールドで、トピックフィルター **device/\$1/details** を入力して、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

1. MQTT テストクライアントの [**Subscriptions**] (サブスクリプション) 列で、[**device/\$1/details**] を選択します。

1. この表の各トピックについて、MQTT テストクライアントで次の操作を行います。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/sdk-tutorials.html)

   1. [**Publish**] (発行) で、テーブルの [**Topic name**] (トピック名) 列の値を入力します。

   1. トピック名の下のメッセージペイロードフィールドに、表の [**Message payload**] (メッセージペイロード) 列の値を入力します。

   1. `pubsub.py` が実行されているターミナルウィンドウを確認し、MQTT テストクライアントで [**Publish to topic**] (トピックに発行) を選択します。

   ターミナルウィンドウで `pubsub.py` によってメッセージが受信されたことがわかります。

ターミナルウィンドウに、このような内容が表示されます。

```
Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-af794be0-7542-45a0-b0af-0b0ea7474517'...
Connected!
Subscribing to topic 'device/+/details'...
Subscribed with QoS.AT_LEAST_ONCE
Waiting for all messages to be received...
Received message from topic 'device/light/details': b'{ "desiredLight": 100, "currentLight": 50 }'
Received light request: b'{ "desiredLight": 100, "currentLight": 50 }'
Received message from topic 'device/temp/details': b'{ "desiredTemp": 20, "currentTemp": 15 }'
Received temperature request: b'{ "desiredTemp": 20, "currentTemp": 15 }'
2 message(s) received.
Disconnecting...
Disconnected!
```

#### 演習結果
<a name="sdk-tutorials-experiment-process-result"></a>

この演習では、サンプルアプリケーションがコールバック関数で複数のメッセージを認識して処理するようにコードを追加しました。これにより、デバイスはメッセージを受信し、それに基づいてアクションを実行できます。

デバイスが複数のメッセージを受信して処理する別の方法は、異なるメッセージを個別にサブスクライブし、各サブスクリプションを独自のコールバック関数に割り当てることです。

### デバイスからメッセージを発行する
<a name="sdk-tutorials-experiment-publish"></a>

pubsub.py サンプルアプリケーションを使用して、デバイスからメッセージを発行できます。メッセージをそのまま発行しますが、メッセージを JSON ドキュメントとして読み取ることはできません。この演習では、読み取り可能なメッセージペイロードに JSON ドキュメントを発行できるようにサンプルアプリを変更します AWS IoT Core。

#### 演習手順
<a name="sdk-tutorials-experiment-publish-steps"></a>

この演習では、次のメッセージが `device/data`トピックとともに送信されます。

```
{
    "timestamp": 1601048303,
    "sensorId": 28,
    "sensorData": [
        {
        "sensorName": "Wind speed",
        "sensorValue": 34.2211224
        }
    ]
}
```

**この演習のメッセージを監視するように MQTT テストクライアントを準備するには**

1. [**Subscribe to topic**] (トピックへのサブスクライブ)の[**Subscription topic field**] (トピックのサブスクリプションフィールド)で、topic filter(トピックフィルター) **device/data** を入力して、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

1. MQTT テストクライアントの [**Subscriptions**] (サブスクリプション) 列で、[**device/data**] (デバイス/データ) を選択します。

1. MQTT テストクライアントウィンドウを開いたままにして、デバイスからのメッセージを待ちます。

**pubsub.py サンプルアプリケーションで JSON ドキュメントを送信するには**

1. デバイスで、`pubsub.py` を `pubsub3.py` にコピーします。

1. `pubsub3.py` を編集して、発行するメッセージのフォーマット方法を変更します。

   1. テキストエディタで `pubsub3.py` を開きます。

   1. 次のコード行を見つけます。

      `message = "{} [{}]".format(message_string, publish_count)`

   1. 次のように変更します。

      `message = "{}".format(message_string)`

   1. 次のコード行を見つけます。

      `message_json = json.dumps(message)`

   1. 次のように変更します。

      `message = "{}".json.dumps(json.loads(message))`

   1. 変更を保存します。

1. デバイス上でこのコマンドを実行して、メッセージを 2 回送信します。

   ```
   python3 pubsub3.py  --ca_file ~/certs/Amazon-root-CA-1.pem  --cert ~/certs/device.pem.crt  --key ~/certs/private.pem.key  --topic device/data  --count 2 --message '{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}'  --endpoint your-iot-endpoint
   ```

1. MQTT テストクライアントで、次のようにメッセージペイロード内の JSON ドキュメントを解釈してフォーマットしたことを確認します。  
![\[AWS IoT コンソールの MQTT クライアントに JSON メッセージペイロードがどのように表示されるかを示す画像。\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/images/mqtt-test-client-output.png)

デフォルトでは、`pubsub3.py` は送信するメッセージもサブスクライブします。アプリの出力でメッセージを受信したことがわかります。ターミナルウィンドウは次のようになります。

```
Connecting to a3qEXAMPLEsffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-5cff18ae-1e92-4c38-a9d4-7b9771afc52f'...
Connected!
Subscribing to topic 'device/data'...
Subscribed with QoS.AT_LEAST_ONCE
Sending 2 message(s)
Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}
Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}'
Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}
Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}'
2 message(s) received.
Disconnecting...
Disconnected!
```

#### 演習結果
<a name="sdk-tutorials-experiment-publish-result"></a>

これにより、デバイスは に送信するメッセージを生成 AWS IoT Core して基本的な接続をテストし、 が処理 AWS IoT Core するデバイスメッセージを提供できます。たとえば、このアプリを使用して、デバイスからテスト AWS IoT ルールアクションにテストデータを送信できます。

## 結果を確認する
<a name="sdk-tutorials-conclusion"></a>

このチュートリアルの例では、デバイスが と通信する方法の基本 AWS IoT Core、つまり AWS IoT ソリューションの基本的な部分について実践的な経験をしました。デバイスが と通信できる場合 AWS IoT Core、対応できるサービスやその他のデバイスにメッセージを AWS 渡すことができます。同様に、 AWS サービスやその他のデバイスは、デバイスに返送されるメッセージにつながる情報を処理できます。

さらに詳しく調べる準備ができたら AWS IoT Core 、以下のチュートリアルを試してください。
+ [チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)
+ [チュートリアル: デバイスデータの DynamoDB テーブルへの保存](iot-ddb-rule.md)
+ [チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする](iot-lambda-rule.md)

# チュートリアル: AWS IoT Device SDK for Embedded C の使用
<a name="iot-embedded-c-sdk"></a>

このセクションでは、AWS IoT Device SDK for Embedded C を実行する方法について説明します。

**Topics**
+ [ステップ 1: AWS IoT Device SDK for Embedded C をインストールする](#install-embedded-c-sdk)
+ [ステップ 2: サンプルアプリケーションを設定する](#iot-c-sdk-app-config)
+ [ステップ 3: サンプルアプリケーションをビルドして実行する](#iot-c-sdk-app-run)

## ステップ 1: AWS IoT Device SDK for Embedded C をインストールする
<a name="install-embedded-c-sdk"></a>

AWS IoT Device SDK for Embedded C は通常、最適化された C 言語ランタイムを必要とするリソース制約のあるデバイスを対象としています。この SDK は、任意のオペレーティングシステムで使用でき、任意のプロセッサタイプ (MCU や MPU など) でホストできます。使用可能なメモリと処理リソースが多い場合は、上位の AWS IoT Device および Mobile SDK (C\$1\$1、Java、JavaScript、Python など) のいずれかを使用することをお勧めします。

一般的に、AWS IoT Device SDK for Embedded C は、組み込みオペレーティングシステムを実行する MCU またはローエンド MPU を使用するシステムを対象としています。このセクションのプログラミング例では、ご利用のデバイスが Linux を使用していると仮定しています。

**Example**  

1. [GitHub](https://github.com/aws/aws-iot-device-sdk-embedded-C) から AWS IoT Device SDK for Embedded C をデバイスにダウンロードします。

   ```
   git clone https://github.com/aws/aws-iot-device-sdk-embedded-c.git --recurse-submodules
   ```

   これにより、現在のディレクトリに `aws-iot-device-sdk-embedded-c` という名前のディレクトリが作成されます。

1. そのディレクトリに移動し、最新のリリースを確認します。最新のリリースタグについては、[github.com/aws/aws-iot-device-sdk-embedded-C/tags](https://github.com/aws/aws-iot-device-sdk-embedded-C/tags) を参照してください。

   ```
   cd aws-iot-device-sdk-embedded-c
   git checkout latest-release-tag
   ```

1. OpenSSL バージョン 1.1.0 以降をインストールします。OpenSSL 開発ライブラリは、通常、パッケージマネージャーを介してインストールされた場合、「libssl-dev」または「openssl-devel」と呼ばれます。

   ```
   sudo apt-get install libssl-dev
   ```

## ステップ 2: サンプルアプリケーションを設定する
<a name="iot-c-sdk-app-config"></a>

AWS IoT Device SDK for Embedded C には、サンプルアプリケーションが含まれています。分かりやすいように、このチュートリアルでは `mqtt_demo_mutual_auth` アプリケーションを使用して、AWS IoT Core メッセージブローカーに接続し MQTT トピックにサブスクライブして発行する方法を示します。

1. [AWS IoT Core チュートリアルの開始方法](iot-gs.md) で作成した証明書およびプライベートキーを `build/bin/certificates` ディレクトリにコピーします。
**注記**  
デバイスおよびルート CA 証明書の有効期限切れや失効の対象となります。これらの証明書の有効期限が切れたり、失効した場合は、新しい CA 証明書またはプライベートキーおよびデバイス証明書をデバイスにコピーする必要があります。

1. サンプルは、パーソナル AWS IoT Core エンドポイント、プライベートキー、証明書、およびルート CA 証明書で設定する必要があります。`aws-iot-device-sdk-embedded-c/demos/mqtt/mqtt_demo_mutual_auth` ディレクトリに移動します。

   AWS CLIがインストールされている場合は、コマンドを使用してアカウントのエンドポイント URL を見つける事ができます。

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

   AWS CLI がインストールされていない場合は、[[AWS IoTconsole](https://console.aws.amazon.com/iot/home)](コンソール)を開きます。ナビゲーションペインで、[**Manage (管理)**]、[**Things (モノ)**] の順に選択します。デバイスの IoT のモノを選択し、[**Interact**] (操作) を選択します。モノ の詳細ページの [**HTTPS**] セクションにエンドポイントが表示されます。

1. `demo_config.h` ファイルを開いて、以下の値を更新します。  
AWS\$1IOT\$1ENDPOINT  
パーソナルエンドポイント。  
CLIENT\$1CERT\$1PATH  
証明書ファイルのパス (例　`certificates/device.pem.crt"`)。  
CLIENT\$1PRIVATE\$1KEY\$1PATH  
プライベートキーのファイル名 (例　`certificates/private.pem.key` )。

   以下に例を示します。

   ```
   // Get from demo_config.h
   // =================================================
   #define AWS_IOT_ENDPOINT               "my-endpoint-ats.iot.us-east-1.amazonaws.com"
   #define AWS_MQTT_PORT                  8883
   #define CLIENT_IDENTIFIER              "testclient"
   #define ROOT_CA_CERT_PATH              "certificates/AmazonRootCA1.crt"
   #define CLIENT_CERT_PATH               "certificates/my-device-cert.pem.crt"
   #define CLIENT_PRIVATE_KEY_PATH        "certificates/my-device-private-key.pem.key"
   // =================================================
   ```

1. 次のコマンドを使用して、デバイスに CMake がインストールされているかどうかを確認します。

   ```
   cmake --version
   ```

   コンパイラのバージョン情報が表示された場合は、次のセクションに進みます。

   エラーが発生する、または情報が表示されない場合は、次のコマンドを使用して cmake パッケージをインストールする必要があります。

   ```
   sudo apt-get install cmake
   ```

   **cmake --version** コマンドを再度実行し、CMake がインストールされ、続行する準備ができていることを確認します。

1. 次のコマンドを使用して、デバイスに開発ツールがインストールされているかどうかを確認します。

   ```
   gcc --version
   ```

   コンパイラのバージョン情報が表示された場合は、次のセクションに進みます。

   エラーが発生したり、コンパイラ情報が表示されない場合は、次のコマンドを使用して `build-essential` パッケージをインストールする必要があります。

   ```
   sudo apt-get install build-essential
   ```

   **gcc --version** コマンドを再度実行し、ビルドツールがインストールされ、続行する準備ができていることを確認します。

## ステップ 3: サンプルアプリケーションをビルドして実行する
<a name="iot-c-sdk-app-run"></a>

この手順では、デバイスで `mqtt_demo_mutual_auth` アプリケーションを生成し、AWS IoT Device SDK for Embedded C を使用して [AWS IoT コンソール](https://console.aws.amazon.com/iot/home)に接続する方法について説明します。

**AWS IoT Device SDK for Embedded C サンプルアプリケーションを実行するには**

1. `aws-iot-device-sdk-embedded-c` に移動し、ディレクトリを作成します。

   ```
   mkdir build && cd build
   ```

1. 次の CMake コマンドを入力して、ビルドに必要な Makefiles を生成します。

   ```
   cmake ..  
   ```

1. 次のコマンドを入力して、実行可能アプリケーションファイルをビルドします。

   ```
   make
   ```

1. 次のコマンドで `mqtt_demo_mutual_auth` アプリを実行します。

   ```
   cd bin
   ./mqtt_demo_mutual_auth
   ```

   次のような出力が表示されます:   
![\[AWS IoT Device SDK for Embedded C サンプルアプリケーションを実行するためのコマンドライン出力。\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/images/successful-run2.png)

これで、デバイスは AWS IoT Device SDK for Embedded C を使用して AWS IoT に接続されました。

AWS IoT コンソールを使用して、サンプルアプリケーションが発行している MQTT メッセージを表示することもできます。[AWS IoT コンソール](https://console.aws.amazon.com/iot/home)で MQTT クライアントを使用する方法については、「[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md)」を参照してください。