

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

# FreeRTOS デモ
<a name="freertos-next-steps"></a>

FreeRTOS では、メイン FreeRTOS ディレクトリの `demos` フォルダにデモアプリケーションがいくつか含まれています。FreeRTOS で実行できるすべてのサンプルは、`demos` の下の `common` フォルダに表示されます。`demos` フォルダの下に、各 FreeRTOS 認定プラットフォーム用のフォルダもあります。

デモアプリケーションを試す前に、[FreeRTOS の開始方法](freertos-getting-started.md) のチュートリアルを完了することをお勧めします。coreMQTT エージェントデモを設定して実行する方法について説明しています。

## FreeRTOS デモを実行する
<a name="running-demos"></a>

以下のトピックでは、FreeRTOS デモを設定して実行する方法について説明します。
+ [Bluetooth Low Energy デモアプリケーション](ble-demo.md)
+ [Microchip Curiosity PIC32MZEF 用のデモブートローダー](microchip-bootloader.md)
+ [AWS IoT Device Defender デモ](dd-demo.md)
+ [AWS IoT Greengrass V1 Discovery デモアプリケーション](gg-demov1.md)
+ [AWS IoT Greengrass V2](gg-demov2.md)
+ [coreHTTP のデモ](core-http-demo.md)
+ [AWS IoT ジョブライブラリのデモ](freertos-jobs-demo.md)
+ [coreMQTT デモ](mqtt-demo.md)
+ [無線通信経由更新デモアプリケーション](ota-demo.md)
+ [セキュアソケットエコークライアントのデモ](secure-sockets-demo.md)
+ [AWS IoT Device Shadow デモアプリケーション](shadow-demo.md)

`DEMO_RUNNER_RunDemos` 関数は `freertos/demos/demo_runner/iot_demo_runner.c` ファイルにあり、1 つのデモアプリケーションが動作する、デタッチされたスレッドを初期化します。デフォルトでは、`DEMO_RUNNER_RunDemos` が実行するのは coreMQTT エージェントデモの呼び出しと開始のみです。FreeRTOS をダウンロードしたときに選択した設定に応じて、また FreeRTOS をダウンロードした場所に応じて、ランナー関数の他の例がデフォルトで開始します。デモアプリケーションを有効にするには、`freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` ファイルを開き、実行するデモを定義します。

**注記**  
サンプルのすべての組み合わせが使用できるわけではありません。組み合わせによっては、メモリの制約のために、選択したターゲット上でソフトウェアを実行できないことがあります。一度に 1 つのデモを実行することをお勧めします。

## デモを設定する
<a name="configuring-demos"></a>

このデモを迅速に開始できるように設定されています。お使いのプラットフォームで動作するバージョンを作成するために、プロジェクトの設定の一部を変更する必要があるかもしれません。設定ファイルは `vendors/vendor/boards/board/aws_demos/config_files` にあります。

# Bluetooth Low Energy デモアプリケーション
<a name="ble-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 概要:
<a name="ble-demo-overview"></a>

FreeRTOS Bluetooth Low Energy には 3 つのデモアプリケーションがあります。
+ [MQTT over Bluetooth Low Energy](#ble-demo-mqtt) デモ 

  このアプリケーションは、MQTT over Bluetooth Low Energy サービスの使用方法を示します。
+ [Wi-Fi プロビジョニング](#ble-demo-wifi) デモ

  このアプリケーションは、Bluetooth Low Energy Wi-Fi プロビジョニングサービスの使用方法を示します。
+ [汎用属性サーバー](#ble-demo-server) デモ

  このアプリケーションは、FreeRTOS Bluetooth Low Energy ミドルウェア API を使用して単純な GATT サーバーを作成する方法を示します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## 前提条件
<a name="ble-demo-prereqs"></a>

これらのデモを観るには、Bluetooth Low Energy 機能を備えたマイクロコントローラーが必要です。また、[FreeRTOS Bluetooth デバイス用の iOS SDK](freertos-ble-mobile.md#freertos-ble-ios) または [FreeRTOS Bluetooth デバイス用の Android SDK](freertos-ble-mobile.md#freertos-ble-android) も必要です。

### FreeRTOS Bluetooth Low Energy 用の AWS IoT と Amazon Cognito のセットアップ
<a name="set-up-ble-demo-aws"></a>

MQTT AWS IoT 間でデバイスを に接続するには、 AWS IoT と Amazon Cognito を設定する必要があります。

**をセットアップするには AWS IoT**

1. [https://aws.amazon.com/](https://aws.amazon.com/) で AWS アカウントを設定します。

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/)を開き、ナビゲーションペインから [**管理**]、[**モノ**] の順に選択します。

1. [**作成**]、[**単一のモノを作成する**] の順に選択します。

1. デバイスの名前を入力し、[**次へ**] を選択します。

1. モバイルデバイスを使用して、マイクロコントローラーをクラウドに接続する場合は、[**証明書なしでモノを作成**] を選択します。Mobile SDK は Amazon Cognito を使用してデバイス認証を行っているため、Bluetooth Low Energy を使用するデモのためにデバイス証明書を作成する必要はありません。

   Wi-Fi を使用してマイクロコントローラーをクラウドディレクトリに接続する場合は、[**証明書の作成**]、[**有効化**] の順に選択し、モノの証明書、パブリックキー、プライベートキーをダウンロードします。

1. 登録したモノのリストから、先ほど作成したモノを選択し、モノのページから [**操作**] を選択します。REST API AWS IoT エンドポイントを書き留めます。

設定の詳細については、[「 の開始方法 AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-gs.html)」を参照してください。

**Amazon Cognito ユーザープールを作成するには**

1. Amazon Cognito コンソールを開き、**[Manage User Pools]** (ユーザープールの管理) を選択します。

1. **[ユーザープールを作成]** を選択します。

1. ユーザープールに名前を付け、[**デフォルトを確認する**] を選択します。

1. ナビゲーションペインから、[**アプリクライアント**]、[**アプリクライアントの追加**] の順に選択します。

1. アプリクライアントの名前を入力し、[**アプリクライアントの作成**] を選択します。

1. ナビゲーションバーから、[**Review**]、[**プールの作成**] の順に選択します。

   ユーザープールの [**全般設定**] に表示されるプール ID を書き留めます。

1. ナビゲーションペインから、[**アプリクライアント**]、[**詳細を表示**] の順に選択します。アプリクライアント ID およびアプリクライアントシークレットを書き留めます。

**Amazon Cognito アイデンティティプールを作成するには**

1. Amazon Cognito コンソールを開き、**[Manage Identity Pools]** (ID プールの管理) を選択します。

1. ID プールの名前を入力します。

1. [**認証プロバイダー**] を展開して [**Cognito**] を選択し、ユーザープール ID およびアプリクライアント ID を入力します。

1. **[プールの作成]** を選択します。

1. [**詳細を表示**] を展開し、2 種類の IAM ロール名を書き留めます。**[Allow]** (許可) を選択し、認証済み ID および未認証 ID の Amazon Cognito へのアクセスを認可する IAM ロールを作成します。

1. [**Edit identity pool**] (ID プールの編集) をクリックします。ID プールの ID を書き留めます。形式は `us-west-2:12345678-1234-1234-1234-123456789012` です。

Amazon Cognito のセットアップの詳細については、[Amazon Cognito の使用開始方法](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-getting-started.html)を参照してください。

**IAM ポリシーを作成して、認証済み ID にアタッチするには**

1. IAM コンソールを開き、ナビゲーションペインで **[Roles]** (ロール) を選択します。

1. 認証された ID のロールを検索して選択し、[**Attach policies (ポリシーのアタッチ)**]、[**Add inline policy (インラインポリシーの追加)**] の順に選択します。

1. [**JSON**] タブを選択し、次の JSON を貼り付けます。

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Action":[
               "iot:AttachPolicy",
               "iot:AttachPrincipalPolicy",
               "iot:Connect",
               "iot:Publish",
               "iot:Subscribe",
               "iot:Receive",
               "iot:GetThingShadow",
               "iot:UpdateThingShadow",
               "iot:DeleteThingShadow"
            ],
            "Resource":[
               "*"
            ]
         }
      ]
   }
   ```

------

1. [**ポリシーの確認**] を選択してポリシーの名前を入力し、[**ポリシーの作成**] を選択します。

 AWS IoT と Amazon Cognito の情報を手元に用意しておきます。クラウドでモバイルアプリケーションを認証するには、エンドポイントと IDs が必要です AWS 。

### Bluetooth Low Energy 用の FreeRTOS 環境をセットアップする
<a name="ble-demo-set-up"></a>

ご利用の環境をセットアップするには、[Bluetooth Low Energy ライブラリ](freertos-ble-library.md) を使用してマイクロコントローラーに FreeRTOS をダウンロードし、FreeRTOS Bluetooth デバイス用 Mobile SDK をご利用のモバイルデバイスにダウンロードして設定する必要があります。

**FreeRTOS Bluetooth Low Energy でマイクロコントローラーの環境をセットアップするには**

1. FreeRTOS を [GitHub](https://github.com/aws/amazon-freertos) からダウンロードするか、クローンします。手順については、[README.md](https://github.com/aws/amazon-freertos/blob/main/README.md) ファイルを参照してください。

1. マイクロコントローラーに FreeRTOS をセットアップします。

   FreeRTOS の資格を満たしたマイクロコントローラーで FreeRTOS の使用を開始する方法については、ご利用のボードの [FreeRTOS の使用開始](https://docs.aws.amazon.com/freertos/latest/userguide/freertos-getting-started.html)ガイドを参照してください。
**注記**  
デモは、FreeRTOS と移植された FreeRTOS Bluetooth Low Energy ライブラリを搭載した Bluetooth Low Energy 対応マイクロコントローラーで実行できます。現在、FreeRTOS [MQTT over Bluetooth Low Energy](#ble-demo-mqtt) デモプロジェクトは、以下の Bluetooth Low Energy 対応デバイスに完全に移植されます。  
[Espressif ESP32-DevKitC and the ESP-WROVER-KIT](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html)
[Nordic nRF52840-DK](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_nordic.html)

## 共通コンポーネント
<a name="ble-demo-common"></a>

FreeRTOS デモアプリケーションには、2 つの共通のコンポーネントが含まれています。
+ Network Manager
+ Bluetooth Low Energy Mobile SDK デモアプリケーション

### Network Manager
<a name="ble-demo-network-manager"></a>

Network Manager は、マイクロコントローラーのネットワーク接続を管理します。`demos/network_manager/aws_iot_network_manager.c` の FreeRTOS ディレクトリにあります。Network Manager が Wi-Fi と Bluetooth Low Energy の両方に対応している場合、デフォルトでは Bluetooth Low Energy を使ってデモが開始されます。Bluetooth Low Energy 接続が中断され、ボードが Wi-Fi に対応している場合、Network Manager は使用可能な Wi-Fi 接続に切り替えてネットワークからの切断を回避します。

Network Manager でネットワーク接続タイプを有効にするには、`vendors/vendor/boards/board/aws_demos/config_files/aws_iot_network_config.h` で `configENABLED_NETWORKS` パラメータにネットワーク接続タイプを追加します (*vendor* はベンダーの名前で、*board* はデモを実行するために使用中のボードの名前です)。

たとえば、Bluetooth Low Energy と Wi-Fi の両方が有効な場合、`aws_iot_network_config.h` にある `#define configENABLED_NETWORKS` で始まる行は次のようになります。

```
#define  configENABLED_NETWORKS  ( AWSIOT_NETWORK_TYPE_BLE | AWSIOT_NETWORK_TYPE_WIFI )
```

現在サポートされているネットワーク接続タイプのリストを取得するには、`aws_iot_network.h` の `#define AWSIOT_NETWORK_TYPE` から始まる行を参照してください。

### FreeRTOS Bluetooth Low Energy Mobile SDK デモアプリケーション
<a name="ble-sdk-app"></a>

FreeRTOS Bluetooth Low Energy Mobile SDK デモアプリケーションは、GitHub から取得でき、[FreeRTOS Bluetooth デバイス用 Android SDK](https://github.com/aws/amazon-freertos-ble-android-sdk) は `amazon-freertos-ble-android-sdk/app` に、[FreeRTOS Bluetooth デバイス用 iOS SDK](https://github.com/aws/amazon-freertos-ble-ios-sdk) は `amazon-freertos-ble-ios-sdk/Example/AmazonFreeRTOSDemo` にあります。この例では、iOS バージョンのデモモバイルアプリケーションのスクリーンショットを使用します。

**注記**  
iOS デバイスを使用している場合は、デモ用モバイルアプリケーションを構築するために Xcode が必要です。Android デバイスを使用している場合、Android Studio を使用してデモ用モバイルアプリケーションを構築できます。

**iOS SDK デモアプリケーションを設定するには**

設定変数を定義する場合は、設定ファイルで指定されているプレースホルダー値の形式を使用します。

1. [FreeRTOS Bluetooth デバイス用の iOS SDK](freertos-ble-mobile.md#freertos-ble-ios) がインストールされていることを確認します。

1. `amazon-freertos-ble-ios-sdk/Example/AmazonFreeRTOSDemo/` から次のコマンドを発行します。

   ```
   $ pod install
   ```

1. Xcode で `amazon-freertos-ble-ios-sdk/Example/AmazonFreeRTOSDemo/AmazonFreeRTOSDemo.xcworkspace` プロジェクトを開き、署名している開発者アカウントを自分のアカウントに変更します。

1. リージョンに AWS IoT ポリシーを作成します (まだ作成していない場合）。
**注記**  
このポリシーは、Amazon Cognito 認証済み ID 用に作成された IAM ポリシーとは異なります。

   1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/) を開きます。

   1. ナビゲーションペインで、[**Secure**] (保護) を選択し、[**Policies**] (ポリシー) を選択してから [**Create**] (作成) を選択します。ポリシーを識別するための名前を入力します。**[Add statements]** (ステートメントを追加) セクションで、**[Advanced mode]** (アドバンストモード) を選択します。次の JSON をポリシーエディタウィンドウにコピーして貼り付けます。*aws-region* と *aws-account* を自分の AWS リージョンとアカウント ID に置き換えます。

   1. [**Create**] (作成) を選択します。

1. `amazon-freertos-ble-ios-sdk/Example/AmazonFreeRTOSDemo/AmazonFreeRTOSDemo/Amazon/AmazonConstants.swift` を開き、次の変数を再定義します。
   + `region`: AWS リージョン。
   + `iotPolicyName`: AWS IoT ポリシー名。
   + `mqttCustomTopic`: 発行する MQTT トピック。

1. `amazon-freertos-ble-ios-sdk/Example/AmazonFreeRTOSDemo/AmazonFreeRTOSDemo/Support/awsconfiguration.json` を開きます。

   `CognitoIdentity` で、次の変数を再定義します。
   + `PoolId`: Amazon Cognito ID プール ID。
   + `Region`: AWS リージョン。

   `CognitoUserPool` で、次の変数を再定義します。
   + `PoolId`: Amazon Cognito ユーザープール ID。
   + `AppClientId`: アプリクライアント ID。
   + `AppClientSecret`: アプリクライアントシークレット。
   + `Region`: AWS リージョン。

**Android SDK デモアプリケーションを設定するには**

設定変数を定義する場合は、設定ファイルで指定されているプレースホルダー値の形式を使用します。

1. [FreeRTOS Bluetooth デバイス用の Android SDK](freertos-ble-mobile.md#freertos-ble-android) がインストールされていることを確認します。

1. リージョンに AWS IoT ポリシーを作成します (まだ作成していない場合）。
**注記**  
このポリシーは、Amazon Cognito 認証済み ID 用に作成された IAM ポリシーとは異なります。

   1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/) を開きます。

   1. ナビゲーションペインで、[**Secure**] (保護) を選択し、[**Policies**] (ポリシー) を選択してから [**Create**] (作成) を選択します。ポリシーを識別するための名前を入力します。**[Add statements]** (ステートメントを追加) セクションで、**[Advanced mode]** (アドバンストモード) を選択します。次の JSON をポリシーエディタウィンドウにコピーして貼り付けます。*aws-region* と *aws-account* を自分の AWS リージョンとアカウント ID に置き換えます。

   1. **[作成]** を選択します。

1. [https://github.com/aws/amazon-freertos-ble-android-sdk/blob/master/app/src/main/java/software/amazon/freertos/demo/DemoConstants.java](https://github.com/aws/amazon-freertos-ble-android-sdk/blob/master/app/src/main/java/software/amazon/freertos/demo/DemoConstants.java) を開き、以下の変数を再定義します。
   + `AWS_IOT_POLICY_NAME`: AWS IoT ポリシー名。
   + `AWS_IOT_REGION`: AWS リージョン。

1. [https://github.com/aws/amazon-freertos-ble-android-sdk/blob/master/app/src/main/res/raw/awsconfiguration.json](https://github.com/aws/amazon-freertos-ble-android-sdk/blob/master/app/src/main/res/raw/awsconfiguration.json) を開きます。

   `CognitoIdentity` で、次の変数を再定義します。
   + `PoolId`: Amazon Cognito ID プール ID。
   + `Region`: AWS リージョン。

   `CognitoUserPool` で、次の変数を再定義します。
   + `PoolId`: Amazon Cognito ユーザープール ID。
   + `AppClientId`: アプリクライアント ID。
   + `AppClientSecret`: アプリクライアントシークレット。
   + `Region`: AWS リージョン。

**Bluetooth Low Energy 経由でマイクロコントローラーとの安全な接続を検出して確立するには**

1. マイクロコントローラとモバイルデバイスを安全にペアリングするには (ステップ 6)、入力と出力の両方の機能 (TeraTerm など) を備えたシリアルターミナルエミュレータが必要です。[ターミナルエミュレーターをインストールする](gsg-troubleshooting.md#uart-term) の手順に従って、ターミナルをシリアル接続でボードに接続するよう設定します。

1. マイクロコントローラーで Bluetooth Low Energy デモプロジェクトを実行します。

1. モバイルデバイスで Bluetooth Low Energy Mobile SDK デモアプリケーションを実行します。

   コマンドラインから Android SDK のデモアプリケーションを開始するには、次のコマンドを実行します。

   ```
   $ ./gradlew installDebug
   ```

1. Bluetooth Low Energy Mobile SDK デモアプリの [**デバイス**] にマイクロコントローラーが表示されていることを確認します。  
![\[一意の識別子を持つ ESP32 デバイスを示すデバイス管理ページ。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-device-list1.png)
**注記**  
このリストには、 FreeRTOS を搭載したすべてのデバイスと、範囲内にあるデバイス情報サービス (`freertos/.../device_information`) が表示されます。

1. デバイスのリストからマイクロコントローラーを選択します。アプリケーションがボードとの接続を確立し、接続されたデバイスの横に緑色の線が表示されます。  
![\[ESP32 デバイス ID が表示されます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-device-list2.png)

   マイクロコントローラーとの接続を切断するには、その線を左へドラッグします。  
![\[ESP32 デバイス ID と別のデバイス ID を示すデバイスページ。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-device-list3.png)

1. プロンプトが表示されたら、マイクロコントローラとモバイルデバイスをペアリングします。  
![\[BLE デバイスの切断、MQTT サービスの切断、アドバタイズ開始、リモートデバイスへの BLE 接続、数値比較のプロンプトを示すコンソール出力。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/pairing-board.png)  
![\[Bluetooth ペアリングリクエストダイアログで、デバイス「ESP32」でコード「465520」が表示され、「ESP32」を確認します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/pairing-mobile.png)

   数値比較用のコードが両方のデバイスで同じである場合は、デバイスをペアリングします。

**注記**  
Bluetooth Low Energy Mobile SDK デモアプリケーションは、ユーザー認証に Amazon Cognito を使用します。Amazon Cognito ユーザーおよび ID プールが設定されていることと、認証済み ID に IAM ポリシーがアタッチされていることを確認します。

## MQTT over Bluetooth Low Energy
<a name="ble-demo-mqtt"></a>

MQTT over Bluetooth Low Energy デモでは、マイクロコントローラーは MQTT プロキシを介してメッセージを AWS クラウドに発行します。

**デモ MQTT トピックをサブスクライブするには**

1.  AWS IoT コンソールにサインインします。

1. ナビゲーションペインで、**[テスト]** を選択し、**[MQTT テストクライアント]** を選択して MQTT クライアントを開きます。

1. **[Subscription topic]** (トピックのサブスクリプション) で ***thing-name*/example/topic1** と入力し、**[Subscribe to topic]** (トピックへのサブスクライブ) を選択します。

Bluetooth Low Energy を使用してマイクロコントローラーとモバイルデバイスのペアリングを行う場合、MQTT メッセージは、モバイルデバイスの Bluetooth Low Energy Mobile SDK デモアプリケーションを通じてルーティングされます。

**Bluetooth Low Energy 経由でデモを有効にするには**

1. `vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`CONFIG_MQTT_BLE_TRANSPORT_DEMO_ENABLED` を定義します。

1. を開き`demos/include/aws_clientcredential.h`、 AWS IoT ブローカーエンドポイント`clientcredentialMQTT_BROKER_ENDPOINT`で を設定します。BLE マイクロコントローラーデバイスのモノの名前で `clientcredentialIOT_THING_NAME` を設定します。 AWS IoT ブローカーエンドポイントは、左側のナビゲーションペインで**設定**を選択して AWS IoT コンソールから取得するか、コマンド を実行して CLI から取得できます`aws iot describe-endpoint --endpoint-type=iot:Data-ATS`。
**注記**  
 AWS IoT ブローカーエンドポイントとモノの名前はどちらも、シークレット ID とユーザープールが設定されているのと同じリージョンにある必要があります。

**デモを実行するには**

1. マイクロコントローラーでデモプロジェクトを構築し、実行します。

1. ボードとモバイルデバイスが、[FreeRTOS Bluetooth Low Energy Mobile SDK デモアプリケーション](#ble-sdk-app) を使ってペアリングされていることを確認します。

1. デモモバイルアプリの [**デバイス**] リストからマイクロコントローラーを選択し、[**MQTT プロキシ**] を選択して MQTT プロキシ設定を開きます。  
![\[3 つの ESP32 デバイス ID のリストで MQTT Proxy、Network Config、および Custom GATT MQTT オプションが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-device-list4.png)

1. MQTT プロキシを有効にすると、`thing-name/example/topic1` トピックに MQTT メッセージが表示され、データが UART ターミナルに出力されます。

## Wi-Fi プロビジョニング
<a name="ble-demo-wifi"></a>

Wi-Fi プロビジョニングは、Bluetooth Low Energy 経由でモバイルデバイスからマイクロコントローラーに Wi-Fi ネットワーク認証情報を安全に送信できる FreeRTOS Bluetooth Low Energy サービスです。Wi-Fi プロビジョニングサービスのソースコードは、`freertos/.../wifi_provisioning` にあります。

**注記**  
Wi-Fi プロビジョニングデモは、現在、Espressif ESP32-DevKitC でサポートされています。

**デモを有効化するには**

1. Wi-Fi プロビジョニングサービスを有効にします。`vendors/vendor/boards/board/aws_demos/config_files/iot_ble_config.h` を開き、`#define IOT_BLE_ENABLE_WIFI_PROVISIONING` を `1` に設定します (*vendor* にはベンダーの名前、*board* にはデモの実行に使用しているボードの名前が入ります)。
**注記**  
Wi-Fi プロビジョニングサービスはデフォルトでは無効になっています。

1. Bluetooth Low Energy と Wi-Fi の両方を有効にするよう [Network Manager](#ble-demo-network-manager) を設定します。

**デモを実行するには**

1. マイクロコントローラーでデモプロジェクトを構築し、実行します。

1. マイクロコントローラーとモバイルデバイスが、[FreeRTOS Bluetooth Low Energy Mobile SDK デモアプリケーション](#ble-sdk-app) を使ってペアリングされていることを確認します。

1. デモモバイルアプリの [**Devices (デバイス)**] リストからマイクロコントローラーを選択し、次に [**Network Config (ネットワーク構成)**] を選択してネットワーク構成設定を開きます。  
![\[3 つの ESP32 デバイス ID のリストで MQTT Proxy、Network Config、および Custom GATT MQTT オプションが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-device-list4.png)

1. ボードの [**Network Config (ネットワーク構成)**] を選択した後、マイクロコントローラーが近隣にあるネットワークのリストをモバイルデバイスに送信します。[**Scanned Networks (スキャンされたネットワーク)**] のリストに利用可能な Wi-Fi ネットワークが表示されます。  
![\[ESP32 デバイス管理インターフェイスには、保存済みのネットワークがなく、2 種類のスキャンされたオープン Wi-Fi ネットワークが表示されます。1 つは WPA2 セキュリティで RSSI が -29、もう 1 つはオープンセキュリティで RSSI が -50 です。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-network-config1.png)

   [**Scanned Networks (スキャンされたネットワーク)**] のリストからネットワークを選択し、必要に応じて SSID とパスワードを入力します。  
![\[Wi-Fi ネットワークパスワード入力ダイアログボックスで空のパスワードフィールド、キャンセルボタン、保存ボタンが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-wifi-password.png)

   マイクロコントローラーがネットワークに接続し、ネットワークを保存します。ネットワークが [**Saved Networks (保存されたネットワーク)**] に表示されます。  
![\[保存およびスキャンされた WiFi ネットワークを示すネットワークインターフェイスで、一方は WPA2 で保護され、もう一方はオープンで、信号強度インジケータが付いています。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-network-config2.png)

デモモバイルアプリには複数のネットワークを保存できます。アプリケーションとデモを再起動すると、[**Saved Networks (保存されたネットワーク)**] の上から順に、最初に利用可能なネットワークに接続します。

ネットワークの優先順位を変更したり、ネットワークを削除したりするには、[**Network Configuration (ネットワーク構成)**] ページで [**Editing Mode (編集モード)**] を選択します。ネットワークの優先順位を変更するには、該当するネットワークの右側を選択し、上下にドラッグします。ネットワークを削除するには、該当するネットワークの左側にある赤色のボタンを選択します。

![\[Wi-Fi ネットワーク設定画面には、保存されたネットワーク、削除や優先度変更のための編集オプション、スキャンされたネットワークが表示されます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-network-editing.png)


## 汎用属性サーバー
<a name="ble-demo-server"></a>

この例では、マイクロコントローラーにあるデモの Generic Attributes (GATT) サーバーアプリケーションが単純なカウンター値を[FreeRTOS Bluetooth Low Energy Mobile SDK デモアプリケーション](#ble-sdk-app) に送信します。

Bluetooth Low Energy Mobile SDK を使用すると、モバイルデバイス用に独自の GATT クライアントを作成することができます。このクライアントは、マイクロコントローラー上の GATT サーバーに接続し、デモモバイルアプリケーションと並行して実行されます。

**デモを有効化するには**

1. Bluetooth Low Energy GATT デモを有効にします。`vendors/vendor/boards/board/aws_demos/config_files/iot_ble_config.h` (*vendor* はベンダーの名前で、*board* はデモの実行に使用中のボードの名前です) で、define ステートメントのリストに `#define IOT_BLE_ADD_CUSTOM_SERVICES ( 1 )` を追加します。
**注記**  
デフォルトでは、Bluetooth Low Energy GATT デモは無効になっています。

1. `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして `CONFIG_BLE_GATT_SERVER_DEMO_ENABLED` を定義します。

**デモを実行するには**

1. マイクロコントローラーでデモプロジェクトを構築し、実行します。

1. ボードとモバイルデバイスが、[FreeRTOS Bluetooth Low Energy Mobile SDK デモアプリケーション](#ble-sdk-app) を使ってペアリングされていることを確認します。

1. アプリの [**デバイス**] リストからボードを選択し、[**MQTT プロキシ**] を選択して MQTT プロキシオプションを開きます。  
![\[3 つの ESP32 デバイス ID のリストで MQTT Proxy、Network Config、および Custom GATT MQTT オプションが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-device-list4.png)

1. **[デバイス]** リストに戻ってボードを選択し、次に **[カスタム GATT MQTT]** を選択してカスタムの GATT サービスオプションを開きます。

1. [**Start Counter (カウンターの開始)**] を選択して ***your-thing-name*/example/topic** MQTT トピックへのデータの発行を開始します。

   MQTT プロキシを有効にした後、`your-thing-name/example/topic` トピックに Hello World と増分カウンターメッセージが表示されます。

# Microchip Curiosity PIC32MZEF 用のデモブートローダー
<a name="microchip-bootloader"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

**注記**  
Microchip との合意に基づき、Curiosity PIC32MZEF (DM320104) は FreeRTOS Reference Integration リポジトリのメインブランチから削除されるため、新しいリリースには搭載されません。Microchip は PIC32MZEF (DM320104) が新しい設計に推奨されなくなったことを[公式に発表](https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM320104)しました。PIC32MZEF プロジェクトとソースコードには、以前のリリースタグから引き続きアクセスできます。Microchip では、新しい設計に Curiosity [ PIC32MZ-EF-2.0 Development board (DM320209)](https://devices.amazonaws.com/detail/a3G0h0000077I69EAE/Curiosity-PIC32MZ-EF-2-0-Development-Board) を使用するよう推奨しています。Pic32mzv1 プラットフォームは、FreeRTOS リファレンス統合リポジトリの [v202012.00](https://github.com/aws/amazon-freertos/tree/202012.00) に引き続き用意されています。ただし、プラットフォームは FreeRTOS リファレンスの [v202107.00](https://github.com/aws/amazon-freertos/tree/202107.00) によってサポートされなくなりました。

 このデモブートローダーは、ファームウェアバージョンチェック、暗号署名の検証、およびアプリケーションの自己テストを実装します。これらの機能は、FreeRTOS の無線通信経由 (OTA) によるファームウェアの更新をサポートします。

ファームウェア検証は、無線で受信した新しいファームウェアの信頼性と誠実性を検証することが含まれます。ブートローダーは、起動する前にアプリケーションの暗号署名を検証します。このデモでは、SHA-256 と楕円曲線デジタル署名アルゴリズム (ECDSA) を使用しています。提供されているユーティリティを使用して、デバイス上でフラッシュできる署名付きアプリケーションを生成することができます。

ブートローダーは、OTA に必要な次の機能をサポートしています。
+ デバイス上でアプリケーションイメージを維持し、それらを切り替えます。
+ 受信した OTA イメージの自己テスト実行を許可し、失敗時にロールバックします。
+ OTA 更新イメージの署名とバージョンをチェックします。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## ブートローダーのステート
<a name="bootloader-states"></a>

ブートローダーのプロセスは以下のステートマシンで示されます。

![\[ブートローダーステートマシンを起動し、初期化、検証、実行、およびエラーステートの通知エラーオプションを表示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/bootloader-states.png)


次の表はブートローダーのステートを説明しています。


| ブートローダーのステート | 説明 | 
| --- | --- | 
|  初期化  |  ブートローダーが初期化状態になっています。  | 
|  検証  |  ブートローダーはデバイスに存在するイメージを検証しています。  | 
|  イメージ実行  |  ブートローダーが選択したイメージを起動しています。  | 
|  デフォルト実行  |  ブートローダーがデフォルトイメージを起動しています。  | 
|  エラー  |  ブートローダーがエラー状態になっています。  | 

上の図では、`Execute Image` および `Execute Default` の両方が `Execution` ステートとして表示されています。

**ブートローダーの実行ステート**  
ブートローダーは、`Execution` 状態にあり、選択した検証済みイメージを起動する準備ができました。起動されるイメージが上位バンクにある場合、アプリケーションは常に下位バンク用に構築されているため、イメージを実行する前にバンクがスワップされます。

**ブートローダーのデフォルト実行ステート**  
デフォルトイメージを起動する設定オプションが有効になっている場合、ブートローダーはデフォルトの実行アドレスからアプリケーションを起動します。デバッグ中を除いて、このオプションを無効にする必要があります。

**ブートローダーのエラー状態**  
ブートローダーがエラー状態で、デバイスに有効なイメージがありません。ブートローダーはユーザーに通知する必要があります。デフォルトの実装では、ログメッセージがコンソールに送信され、ボード上の LED が永続的にすばやく点滅します。

## フラッシュデバイス
<a name="flash-device"></a>

Microchip Curiosity PIC32MZEF プラットフォームでは、2 メガバイト (MB) の内部プログラムフラッシュが 2 つのバンクに分割されています。これらの 2 つのバンクとライブアップデート間のメモリマップスワッピングをサポートしています。デモブートローダーは、別個の下部ブートフラッシュ領域にプログラムされています。

![\[メモリレイアウト図で、ブートローダー、アプリケーションバンク 0、アプリケーションバンク 1 にそれぞれマッピングされた下部ブートフラッシュ、1 MB の下部プログラムフラッシュ、2 MB の上部プログラムフラッシュを示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/flash-device.png)


## アプリケーションイメージ構造
<a name="application-image-structure"></a>

![\[OTA イメージ構造で、ヘッダー、記述子、アプリケーションバイナリ (署名者サービスによって署名済み)、トレーラーセクションと、マジックコード、シーケンス番号、開始アドレスと終了アドレス、実行アドレス、ハードウェア ID などのフィールドを示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/application-image-structure.png)


この図は、デバイスの各バンクに保存されているアプリケーションイメージのプライマリコンポーネントを示しています。


| コンポーネント | サイズ (バイト単位) | 
| --- | --- | 
|  イメージヘッダー  |  8 バイト  | 
|  イメージ記述子  |  24 バイト  | 
|  アプリケーションバイナリ  |   < 1 MB - (324)  | 
|  Trailer  |  292 バイト  | 

## イメージヘッダー
<a name="image-header"></a>

デバイス上のアプリケーションイメージは、マジックコードとイメージフラグで構成されるヘッダーで始まる必要があります。


| ヘッダーフィールド | サイズ (バイト単位) | 
| --- | --- | 
|  マジックコード  |  7 バイト  | 
|  イメージフラグ  |  1 バイト  | 

### マジックコード
<a name="magic-code"></a>

フラッシュデバイスのイメージはマジックコードで始まる必要があります。デフォルトのマジックコードは `@AFRTOS` です。ブートローダーは、イメージを起動する前に有効なマジックコードが存在するかどうかを確認します。これが検証の最初のステップです。

### イメージフラグ
<a name="image-flags"></a>

イメージフラグは、アプリケーションイメージのステータスを保存するために使用されます。フラグは OTA プロセスで使用されます。両方のバンクのイメージフラグがデバイスの状態を決定します。実行イメージがコミット保留中としてマークされている場合、デバイスが OTA 自己テストフェーズにあることを意味します。デバイス上のイメージが有効とマークされていても、起動ごとに同じ検証ステップが実行されます。イメージが新しいものとしてマークされている場合、ブートローダーはそれをコミット保留としてマークし、検証後にセルフテストのために起動します。ブートローダーはまた、ウォッチドッグタイマーを初期化して開始するため、新しい OTA イメージがセルフテストに失敗した場合、デバイスはリブートし、ブートローダーはイメージを消去して拒否し、以前の有効なイメージを実行します。

デバイスは有効なイメージを 1 つのみ持つことができます。もう 1 つのイメージは、新しい OTA イメージか、コミット保留中 (セルフテスト) です。OTA 更新が正常に完了すると、古いイメージがデバイスから消去されます。


| ステータス | 値 | 説明 | 
| --- | --- | --- | 
|  新しいイメージ  |  0xFF  |  アプリケーションイメージは新しく、決して実行されません。  | 
|  コミット保留中  |  0xFE  |  アプリケーションイメージにテスト実行のためのマークが付けられます。  | 
|  有効です  |  0xFC  |  アプリケーションイメージが有効とマークされ、コミットされます。  | 
|  無効  |  0xF8  |  アプリケーションイメージは無効とマークされています。  | 

## イメージ記述子
<a name="image-descriptor"></a>

フラッシュデバイス上のアプリケーションイメージには、イメージヘッダーの後にイメージ記述子が含まれている必要があります。イメージ記述子は、ポストビルドユーティリティによって生成されます。ポストビルドユーティリティは、設定ファイル (`ota-descriptor.config`) を使用して適切な記述子を生成し、それをアプリケーションバイナリに付加します。このビルド後のステップの出力は、OTA に使用できるバイナリイメージです。


| 記述子フィールド | サイズ (バイト単位) | 
| --- | --- | 
|  シーケンス番号  |  4 バイト  | 
|  開始アドレス  |  4 バイト  | 
|  終了アドレス  |  4 バイト  | 
|  実行アドレス  |  4 バイト  | 
|  ハードウェア ID  |  4 バイト  | 
|  リザーブド  |  4 バイト  | 

**シーケンス番号**  
シーケンス番号は、新しい OTA イメージを構築する前に増加させる必要があります。`ota-descriptor.config` ファイルを参照してください。ブートローダーは、この番号を使用してブートするイメージを決定します。有効な値の範囲は 1～4294967295‬ です。

**開始アドレス**  
デバイス上のアプリケーションイメージの開始アドレスです。イメージ記述子がアプリケーションバイナリの先頭に付いているため、このアドレスはイメージ記述子の先頭です。

**終了アドレス**  
イメージトレーラーを除く、デバイス上のアプリケーションイメージの終了アドレスです。

**実行アドレス**  
イメージの実行アドレスです。

**ハードウェア ID**  
OTA イメージが正しいプラットフォーム用に構築されているかどうかを検証するためにブートローダーによって使用される一意のハードウェア ID です。

**リザーブド**  
これは、将来の利用のために予約されています。

## イメージトレーラー
<a name="image-trailer"></a>

イメージトレーラーはアプリケーションバイナリに付加されます。これには、署名タイプ文字列、署名サイズ、およびイメージの署名が含まれます。


| トレーラーフィールド | サイズ (バイト単位) | 
| --- | --- | 
|  署名タイプ  |  32 バイト  | 
|  署名サイズ  |  4 バイト  | 
|  署名  |  256 バイト  | 

**署名タイプ**  
署名タイプは、使用されている暗号アルゴリズムを表す文字列で、トレーラーのマーカーとして機能します。ブートローダーは、楕円曲線デジタル署名アルゴリズム (ECDSA) をサポートしています。デフォルトは sig-sha256-ecdsa です。

**署名サイズ**  
暗号署名のサイズで、バイト単位です。

**署名**  
イメージ記述子が付加されたアプリケーションバイナリの暗号化署名です。

## ブートローダーの設定
<a name="bootloader-configuration"></a>

基本的なブートローダー設定オプションは、`freertos/vendors/microchip/boards/curiosity_pic32mzef/bootloader/config_files/aws_boot_config.h` で提供されています。一部のオプションは、デバッグの目的でのみ提供されています。

**デフォルトスタートを有効にする**  
デフォルトアドレスからアプリケーションを実行できるようにします。デバッグのためにのみ有効にする必要があります。イメージは、検証なしでデフォルトのアドレスから実行されます。

**暗号署名検証を有効にする**  
起動時に暗号化署名検証を有効にします。失敗したイメージはデバイスから消去されます。このオプションはデバッグ目的でのみ提供されており、本番環境では有効にする必要があります。

**無効なイメージを消去する**  
そのバンクのイメージ検証が失敗した場合に、完全なバンク消去を有効にします。このオプションはデバッグ用に提供されており、本番環境では有効にする必要があります。

**ハードウェア ID 検証を有効にする**  
OTA イメージの記述子内のハードウェア ID と、ブートローダーにプログラムされたハードウェア ID の検証を有効にします。これはオプションで、ハードウェア ID の検証が不要な場合は無効にすることができます。

**アドレス検証を有効にする**  
OTA イメージ記述子の開始アドレス、終了アドレス、実行アドレスの検証を有効にします。このオプションを有効にしておくことをお勧めします。

## ブートローダーのビルド
<a name="building-bootloader"></a>

デモブートローダーは、FreeRTOS ソースコードリポジトリの `aws_demos` にある `freertos/vendors/microchip/boards/curiosity_pic32mzef/aws_demos/mplab/` プロジェクトに、ロード可能なプロジェクトとして含まれています。`aws_demos` プロジェクトがビルドされる場合、ブートローダーが最初にビルドされ、続いてアプリケーションがビルドされます。最終的な出力は、ブートローダーとアプリケーションを含む統合された 16 進数イメージです。`factory_image_generator.py` ユーティリティは、暗号化署名付きの統合された 16 進数イメージを生成するために提供されています。ブートローダーユーティリティのスクリプトは、`freertos/demos/ota/bootloader/utility/` にあります。

### ブートローダーのビルド前のステップ
<a name="bootloader-pre-build"></a>

このビルド前のステップでは、`codesigner_cert_utility.py` というユーティリティスクリプトが実行され、コード署名証明書からパブリックキーが抽出され、Abstract Syntax Notation One (ASN.1) エンコード形式のパブリックキーを含む C ヘッダーファイルが生成されます。このヘッダーは、ブートローダープロジェクトにコンパイルされます。生成されたヘッダーには、パブリックキーの配列とキーの長さという 2 つの定数が含まれています。ブートローダープロジェクトを `aws_demos` なしでビルドし、通常のアプリケーションとしてデバッグすることもできます。

# AWS IoT Device Defender デモ
<a name="dd-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="dd-demo-introduction"></a>

このデモでは、[AWS IoT Device Defender](https://docs.aws.amazon.com/iot/latest/developerguide/device-defender.html) に接続している AWS IoT Device Defender ライブラリの使用方法を示します。デモでは、coreMQTT ライブラリを使用して、AWS IoT MQTT ブローカーおよび coreJSON ライブラリとの TLS 経由の MQTT 接続 (相互認証) を確立し、AWS IoT Device Defender サービスから受信した応答を検証して解析します。デモでは、デバイスから収集されたメトリクスを使用して JSON 形式のレポートを作成する方法と、作成したレポートを AWS IoT Device Defender サービスに送信する方法を示します。デモでは、コールバック関数を coreMQTT ライブラリに登録して、AWS IoT Device Defender サービスからの応答を処理し、送信されたレポートが受け入れられたか拒否されたかを確認します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## 機能
<a name="dd-demo-functionality"></a>

このデモでは、1 つのアプリケーションタスクを作成して、メトリクスを収集し、Device Defender レポートを JSON 形式で作成し、AWS IoT MQTT ブローカーへのセキュアな MQTT 接続を介して AWS IoT Device Defender サービスにレポートを送信する方法を説明します。デモには、標準のネットワークメトリクスとカスタムメトリクスが含まれています。カスタムメトリクスの場合、デモには以下が含まれます。
+ FreeRTOS タスク ID のリストを示す「`task_numbers`」というメトリクス。このメトリクスのタイプは「数値のリスト」です。
+ デモアプリケーションタスクのスタックハイウォーターマークを示す「`stack_high_water_mark`」というメトリクス。このメトリクスのタイプは「数値」です。

ネットワークメトリクスの収集方法は、使用している TCP/IP スタックによって異なります。FreeRTOS\$1TCP およびサポートされている lwIP 設定には、デバイスから実際のメトリクスを収集して AWS IoT Device Defender レポートでメトリクスを送信する、メトリクス収集の実装を提供しています。GitHub から、[FreeRTOS\$1TCP](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/metrics_collector/freertos_plus_tcp/metrics_collector.c) と [lwIP](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c) の実装を入手できます。

他の TCP/IP スタックを使用するボード向けに、すべてのネットワークメトリクスに対してゼロを返すメトリック収集関数のスタブ定義を提供しています。`freertos/demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c` で機能を実装し、ネットワークスタックが実際のメトリクスを送信するようにしてください。このファイルも [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c) ウェブサイトから入手できます。

ESP32 の場合、デフォルトの lwIP 設定はコアロックを使用しないため、デモではスタブメトリクスが使用されます。参照 lwIP メトリクス収集の実装を使用する場合は、`lwiopts.h` に次のマクロを定義します。

```
#define LINK_SPEED_OF_YOUR_NETIF_IN_BPS 0
#define LWIP_TCPIP_CORE_LOCKING         1
#define LWIP_STATS                      1
#define MIB2_STATS                      1
```

以下に、デモを実行したときの出力例を示します。

![\[コンソールログ出力で DemoThing アプリケーションの MQTT 接続、発行、メモリ使用量イベントを示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/Defender_p4_supported.png)


ボードが FreeRTOS\$1TCP またはサポートされている lwIP 設定を使用していない場合、出力は次のようになります。

![\[ログメッセージで、デモアプリケーションの MQTT 接続確立、トピックサブスクリプション試行、ペイロードの発行、パケット処理を示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/Defender_p4_unsupported.png)


デモのソースコードは、`freertos/demos/device_defender_for_aws/` ディレクトリのダウンロード内、または [GitHub](https://github.com/aws/amazon-freertos/tree/main/demos/device_defender_for_aws) ウェブサイトにあります。

### AWS IoT Device Defender トピックをサブスクライブする
<a name="dd-demo-subscribing"></a>

[subscribeToDefenderTopics](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/defender_demo.c#L514-L530) 関数は、MQTT トピックをサブスクライブして、発行された Device Defender レポートに対する応答を受信します。ここでは、マクロ `DEFENDER_API_JSON_ACCEPTED` を使用して、受け入れた Device Defender レポートの応答を受信するトピック文字列を作成します。ここでは、マクロ `DEFENDER_API_JSON_REJECTED` を使用して、拒否した Device Defender レポートの応答を受信するトピック文字列を作成します。

### デバイスメトリクスを収集する
<a name="dd-demo-collecting-metrics"></a>

[collectDeviceMetrics](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/defender_demo.c#L376-L511) 関数は、`metrics_collector.h` で定義されている関数を使用してネットワークメトリクスを収集します。送受信されたバイト数とパケット数、開いている TCP ポート、開いている UDP ポート、確立された TCP 接続に関するメトリクスが収集されます。

### AWS IoT Device Defender レポートを生成する
<a name="dd-demo-generating-report"></a>

[generateDeviceMetricsReport](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/defender_demo.c#L552-L581) 関数は、`report_builder.h` で定義されている関数を使用して Device Defender レポートを生成します。この関数は、ネットワークメトリックとバッファを取得し、AWS IoT Device Defender が要求する形式の JSON ドキュメントを作成し、指定されたバッファに書き込みます。AWS IoT Device Defender が想定している JSON ドキュメントの形式は、AWS IoT 開発者ガイドの[デバイス側のメトリクス](https://docs.aws.amazon.com/iot/latest/developerguide/detect-device-side-metrics.html)に記載されています。**

### AWS IoT Device Defender レポートを発行する
<a name="dd-demo-publishing-report"></a>

AWS IoT Device Defender レポートは、JSON AWS IoT Device Defender レポート発行用の MQTT トピック上に発行されます。レポートは、GitHub ウェブサイトのこの[コードスニペット](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/defender_demo.c#L691-L695)に示したように、マクロ `DEFENDER_API_JSON_PUBLISH` を使用して作成されます。

### 応答を処理するコールバック
<a name="dd-demo-callback-handling"></a>

[publishCallback](https://github.com/aws/amazon-freertos/blob/main/demos/device_defender_for_aws/defender_demo.c#L302-L373) 関数は、受信する MQTT 発行メッセージを処理します。`Defender_MatchTopic` ライブラリの AWS IoT Device Defender API を使用して、受信した MQTT メッセージが AWS IoT Device Defender サービスからのものかどうかを確認します。メッセージが AWS IoT Device Defender サービスのものである場合は、受信した JSON レスポンスを解析し、レスポンス内のレポート ID を抽出します。その後、レポート ID は、レポート内に送信されたものと同じかどうか検証されます。

# AWS IoT Greengrass V1 Discovery デモアプリケーション
<a name="gg-demov1"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

FreeRTOS 向けの AWS IoT Greengrass Discovery デモを実行する前に、AWS、AWS IoT Greengrass、および AWS IoT を設定する必要があります。AWS を設定するには、[AWSアカウントとアクセス許可の設定](freertos-prereqs.md#freertos-account-and-permissions) の指示に従います。AWS IoT Greengrass をセットアップするには、Greengrass グループを作成して Greengrass コアを追加する必要があります。AWS IoT Greengrass のセットアップの詳細については、「[AWS IoT Greengrass の使用開始](https://docs.aws.amazon.com/greengrass/latest/developerguide/gg-gs.html)」を参照してください。

AWS と AWS IoT Greengrass を設定した後、AWS IoT Greengrass のいくつかの追加のアクセス許可を設定する必要があります。

**AWS IoT Greengrass アクセス許可を設定するには**

1. [IAM コンソール](https://console.aws.amazon.com/iam/home)を参照します。

1. ナビゲーションペインで [**ロール**] を選択した後、[**Greengrass\$1ServiceRole**] を見つけて選択します。

1. [**Attach policies (ポリシーをアタッチする)**]、[**AmazonS3FullAccess**]、[**AWSIoTFullAccess**]、[**ポリシーのアタッチ**] の順に選択します。

1. [AWS IoT コンソール](https://console.aws.amazon.com/iotv2/)を参照します。

1. ナビゲーションペインで [**Greengrass**]、[**グループ**] の順に選択し、以前に作成した Greengrass グループを選びます。

1. [**設定**]、[**ロールの追加**] の順に選択します。

1. [**Greengrass\$1ServiceRole**]、[**保存**] の順に選択します。

ボードを AWS IoT に接続して、FreeRTOS デモを設定します。

1. [への MCU ボードの登録AWS IoT](freertos-prereqs.md#get-started-freertos-thing)

   ボードを登録した後、新しい Greengrass ポリシーを作成し、デバイスの証明書にアタッチする必要があります。

**新規 AWS IoT Greengrass ポリシーを作成する方法**

   1. [AWS IoT コンソール](https://console.aws.amazon.com/iotv2/)を参照します。

   1. ナビゲーションペインで、**[Secure]** (保護) を選択し、**[Policies]** (ポリシー) を選択してから **[Create]** (作成) を選択します。

   1. ポリシーを識別するための名前を入力します。

   1. **[Add statements]** (ステートメントを追加) セクションで、**[Advanced mode]** (アドバンストモード) を選択します。次の JSON をポリシーエディタウィンドウにコピーアンドペーストします。

      ```
      {
            "Effect": "Allow",
            "Action": [
              "greengrass:*"
            ],
            "Resource": "*"
      }
      ```

      このポリシーによって、すべてのリソースに AWS IoT Greengrass アクセス許可が付与されます。

   1. **[作成]** を選択します。

**デバイスの証明書に AWS IoT Greengrass ポリシーをアタッチするには**

   1. [AWS IoT コンソール](https://console.aws.amazon.com/iotv2/)を参照します。

   1. ナビゲーションペインで、[**管理**]、[**モノ**] の順に選択して、以前に作成したモノを選択します。

   1. [**セキュリティ**] を選択し、デバイスにアタッチされている証明書を選択します。

   1. [**ポリシー**]、[**アクション**]、[**ポリシーのアタッチ**] の順に選択します。

   1. 前に作成した Greengrass ポリシーを検索して選択し、[**アタッチ**] を選択します。

1. [FreeRTOS をダウンロードする](freertos-prereqs.md#freertos-download)
**注記**  
FreeRTOS コンソールから FreeRTOS をダウンロードする場合は、**[Connect to AWS IoT Greengrass- *Platform*]** (AWS IoT に接続 - プラットフォーム) の代わりに、**[Connect to - *Platform*]** ( に接続 - プラットフォーム) を選択します。

1. [FreeRTOS デモを設定する](freertos-prereqs.md#freertos-configure).

   `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして `CONFIG_GREENGRASS_DISCOVERY_DEMO_ENABLED` を定義します。

AWS IoT と AWS IoT Greengrass を設定し、FreeRTOS をダウンロードして設定した後、デバイスで Greengrass デモを構築、フラッシュ、実行できます。ボードのハードウェアとソフトウェアの開発環境を設定するには、[ボード固有の入門ガイド](getting-started-guides.md) の手順に従います。

Greengrass デモは、一連のメッセージを Greengrass コア、および AWS IoT MQTT クライアントに発行します。AWS IoT MQTT クライアントでメッセージを表示するには、[AWS IoT コンソール](https://console.aws.amazon.com/iotv2/)を開き、**[テスト]** を選択し、**[MQTT テストクライアント]** を選択して、`freertos/demos/ggd` にサブスクリプションを追加します。

MQTT クライアントには以下の文字列が表示されます。

```
Message from Thing to Greengrass Core: Hello world msg #1!
Message from Thing to Greengrass Core: Hello world msg #0!
Message from Thing to Greengrass Core: Address of Greengrass Core found! 123456789012.us-west-2.compute.amazonaws.com
```

## Amazon EC2 インスタンスを使用する
<a name="gg-demo-ec2"></a>

**Amazon EC2 インスタンスを操作している場合**

1. Amazon EC2 インスタンスに関連付けられているパブリック DNS (IPv4) を見つけます。Amazon EC2 コンソールに移動し、左側のナビゲーションパネルで **[Instances] **(インスタンス) を選択します。Amazon EC2 インスタンスを選択し、**[Description]** (説明) パネルを選択します。[**パブリック DNS (IPv4)**] のエントリを探し、メモします。

1. **[Security groups]** (セキュリティグループ) のエントリを見つけて、Amazon EC2 インスタンスにアタッチされているセキュリティグループを選択します。

1. [**インバウンドルール**] タブを選択し、[**インバウンドルールの編集**] を選択して、次のルールを追加します。  
**インバウンドルール**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/gg-demov1.html)

1. AWS IoT コンソールで [**Greengrass**]、[**グループ**] の順に選択し、以前に作成した Greengrass グループを選択します。**[設定]** を選択します。[**ローカル接続の検出**] を [**接続情報の手動管理**] に変更します。

1. ナビゲーションペインで、[**コア**] を選択し、グループコアを選択します。

1. [**接続**] を選択し、コアエンドポイントが 1 つだけあり (残りのエンドポイントはすべて削除)、IP アドレスではないことを確認します (変化する可能性があるため)。最初のステップでメモしたパブリック DNS (IPv4) を使用することをお勧めします。

1. 作成した FreeRTOS IoT モノを GG グループに追加します。

   1. 戻る矢印を選択して、AWS IoT Greengrass グループページに戻ります。ナビゲーションペインで、[**デバイス**] を選択し、[**デバイスの追加**] を選択します。

   1. [**IoT モノの選択**] を選択します。デバイスを選択し、[**完了**] を選択します。

1. 必要なサブスクリプションを追加します。** [Greengrass Group] **(Greengrass グループ) ページで** [Subscription] **(サブスクリプション) を選択し、**[Add Subscription]** (サブスクリプションの追加) を選択して、ここに示す情報を入力します。  
**サブスクリプション**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/gg-demov1.html)

   「ソース」は、ボードを登録したときに AWS IoT コンソールで作成された AWS IoT モノに付けられた名前です。「TIGG1」は、ここに示した例です。

1. AWS IoT Greengrass グループのデプロイを開始し、デプロイが成功したことを確認します。これで、AWS IoT Greengrass 検出デモを正常に実行できるようになります。

# AWS IoT Greengrass V2
<a name="gg-demov2"></a>

## AWS IoT Greengrass V2 デバイスとの互換性
<a name="ggv2-compatibility"></a>

 AWS IoT Greengrass V2 でのクライアントデバイスのサポートには、AWS IoT Greengrass V1 との下位互換性があります。アプリケーションコードを変更することなく FreeRTOS クライアントデバイスを V2 コアデバイスに接続できます。クライアントデバイスを V2 コアデバイスに接続できるようにするには、以下を行います。
+  Greengrass ソフトウェアを Greengrass コアデバイスにデプロイします。「[クライアントデバイスをコアデバイスに接続する](https://docs.aws.amazon.com//greengrass/v2/developerguide/connect-client-devices.html)」を参照して、デバイスを AWS IoT Greengrass V2 に接続します。
+  クライアントデバイス、AWS IoT Core クラウドサービス、Greengrass コンポーネントの間でメッセージ (Lambda 関数を含む) をリレーするには、[MQTT ブリッジコンポーネント](https://docs.aws.amazon.com//greengrass/v2/developerguide/mqtt-bridge-component.html)をデプロイおよび設定します。
+ [IP ディテクタコンポーネント](https://docs.aws.amazon.com//greengrass/v2/developerguide/ip-detector-component.html)をデプロイして接続情報を自動検出するか、エンドポイントを手動で管理します。
+ 詳細については、「[ローカル AWS IoT デバイスとやり取りする](https://docs.aws.amazon.com//greengrass/v2/developerguide/interact-with-local-iot-devices.html)」を参照してください。

詳細については、AWS のドキュメントで [AWS IoT Greengrass V2 での AWS IoT Greengrass V1 アプリケーション](https://docs.aws.amazon.com//greengrass/v2/developerguide/migrate-from-v1.html#connect-v1-greengrass-devices)の実行に関する説明を参照してください。

# coreHTTP のデモ
<a name="core-http-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

これらのデモは、coreHTTP ライブラリの使い方を学習するのに役立ちます。

**Topics**
+ [coreHTTP 相互認証のデモ](core-http-ma-demo.md)
+ [coreHTTP 基本 Amazon S3 アップロードのデモ](core-http-s3-upload-demo.md)
+ [coreHTTP 基本 S3 ダウンロードのデモ](core-http-s3-download-demo.md)
+ [coreHTTP 基本マルチスレッドのデモ](core-http-bmt-demo.md)

# coreHTTP 相互認証のデモ
<a name="core-http-ma-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-ma-demo-intro"></a>

coreHTTP (相互認証) デモプロジェクトでは、クライアントとサーバー間で TLS と相互認証を使用して HTTP サーバーへの接続を確立する方法を示します。このデモでは、mbedTLS ベースのトランスポートインターフェイス実装を使用して、サーバーおよびクライアントに認証された TLS 接続を確立します。また、HTTP でのリクエストレスポンスワークフローを示します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## 機能
<a name="core-http-ma-demo-functionality"></a>

このデモでは、以下のステップを実行する方法を示す単一のアプリケーションタスクと例を作成します。
+  AWS IoT エンドポイントの HTTP サーバーに接続します。
+ POST リクエストを送信する。
+ レスポンスを受信する。
+ サーバーから切断する。

これらのステップを完了すると、このデモによって以下のスクリーンショットのような出力が生成されます。

![\[AWS IoT デモの初期化、TLS セッション確立、HTTP POST リクエスト、デモが正常に完了したことを示すメモリメトリクスを示すログ出力。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coreHTTP.output.png)


 AWS IoT コンソールは、次のスクリーンショットのような出力を生成します。

![\[AWS IoT 2020 年 11 月 20 日 19:09:09 UTC にトピックに発行された AWS IoT 「コンソールからこんにちは」メッセージを示す コンソール。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coreHTTP.console.png)


## ソースコードの編成
<a name="core-http-s3-ma-demo-source-code-organization"></a>

デモソースファイルの名前は `http_demo_mutual_auth.c` です。このファイルは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_mutual_auth.c) ウェブサイトにあります。

## HTTP AWS IoT サーバーへの接続
<a name="core-http-ma-demo-connecting"></a>

[ connectToServerWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) 関数は、HTTP サーバーへの相互認証された TLS AWS IoT 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。`RetryUtils_BackoffAndSleep` 関数は、指数関数的に増加するタイムアウト値を提供し、最大試行回数に達したときに `RetryUtilsRetriesExhausted` を返します。`connectToServerWithBackoffRetries` 関数は、設定された試行回数に達してもブローカーへの TLS 接続を確立できない場合に、失敗ステータスを返します。

## HTTP リクエストの送信とレスポンスの受信
<a name="core-http-ma-demo-send-receive"></a>

[ prvSendHttpRequest](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_mutual_auth.c#L402-L507) 関数は、POST リクエストを HTTP AWS IoT サーバーに送信する方法を示します。で REST API にリクエストを行う方法の詳細については AWS IoT、[「デバイス通信プロトコル - HTTPS](https://docs.aws.amazon.com/iot/latest/developerguide/http.html)」を参照してください。レスポンスは、同じ coreHTTP API 呼び出しである `HTTPClient_Send` で受信されます。

# coreHTTP 基本 Amazon S3 アップロードのデモ
<a name="core-http-s3-upload-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-s3-upload-demo-intro"></a>

この例では、Amazon Simple Storage Service (Amazon S3) HTTP サーバーに PUT リクエストを送信し、小さなファイルをアップロードする方法を示します。また、アップロード後に GET リクエストを実行して、ファイルのサイズを確認します。この例で使用する[ネットワークトランスポートインターフェイス](https://freertos.org/network-interface.html)は、mbedTLS を使用して、coreHTTP を実行する IoT デバイスクライアントと Amazon S3 HTTP サーバー間に相互認証された接続を確立します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

### シングルスレッドとマルチスレッド
<a name="core-http-s3-upload-demo-threads"></a>

coreHTTP には、シングルスレッドとマルチスレッド (マルチタスク) の 2 つの使用モデルがあります。****このデモは、このセクションでは 1 つのスレッドで HTTP ライブラリを実行しますが、実際にはシングルスレッド環境で coreHTTP を使用する方法を示しています。このデモでは、1 つのタスクのみが HTTP API を使用します。シングルスレッドアプリケーションは HTTP ライブラリを繰り返し呼び出す必要がありますが、マルチスレッドアプリケーションは、代わりにエージェント (またはデーモン) タスク内でバックグラウンドで HTTP リクエストを送信できます。

## ソースコードの編成
<a name="core-http-s3-upload-demo-source-code-organization"></a>

デモソースファイルの名前は `http_demo_s3_upload.c` です。このファイルは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c) ウェブサイトにあります。

## Amazon S3 HTTP サーバー接続の設定
<a name="core-http-s3-upload-demo-configure-server"></a>

このデモでは、署名付き URL を使用して Amazon S3 HTTP サーバーに接続し、ダウンロードするオブジェクトへのアクセスを許可します。Amazon S3 HTTP サーバーの TLS 接続では、サーバー認証のみが使用されます。アプリケーションレベルでは、オブジェクトへのアクセスは、署名付き URL クエリのパラメータを使用して認証されます。以下のステップに従って、 AWSへの接続を設定します。

1.  AWS アカウントをセットアップします。

   1. まだ作成していない場合は、 [AWS アカウントを作成します](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)。

   1. アカウントとアクセス許可は AWS Identity and Access Management (IAM) を使用して設定されます。IAM は、アカウント内の各ユーザーのアクセス権限の管理に使用します。デフォルトでは、ルート所有者によって付与されるまで、ユーザーにはアクセス権限がありません。

      1.  AWS アカウントにユーザーを追加するには、[IAM ユーザーガイド](https://docs.aws.amazon.com/IAM/latest/UserGuide/)を参照してください。

      1. このポリシー AWS IoT を追加して、FreeRTOS および にアクセスするアクセス許可を AWS アカウントに付与します。
         + AmazonS3FullAccess

1. *Amazon Simple Storage Service ユーザーガイド*の [S3 バケットを作成する方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)に従って、Amazon S3 にバケットを作成します。

1. [S3 バケットにファイルとフォルダをアップロードする方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)のステップに従って、Amazon S3 にファイルをアップロードします。

1. `FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py` ファイルにあるスクリプトを使用して、署名付き URL を生成します。

   使用手順については、`FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md` ファイルを参照してください。

## 機能
<a name="core-http-s3-upload-demo-functionality"></a>

このデモでは、まず TLS サーバー認証を使用して Amazon S3 HTTP サーバーに接続します。次に、HTTP リクエストを作成して、`democonfigDEMO_HTTP_UPLOAD_DATA` に指定されているデータをアップロードします。ファイルをアップロードした後、ファイルのサイズをリクエストして、ファイルが正常にアップロードされたことを確認します。デモのソースコードは [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c) ウェブサイトに記載されています。

### Amazon S3 HTTP サーバーに接続する
<a name="core-http-s3-upload-demo-connecting"></a>

[connectToServerWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) 関数は HTTP サーバーへの TCP 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。`connectToServerWithBackoffRetries` 関数は、設定された試行回数に達してもサーバーへの TCP 接続を確立できない場合に、失敗ステータスを返します。

`prvConnectToServer` 関数は、サーバー認証のみを使用して Amazon S3 HTTP サーバーへの接続を確立する方法を示します。この関数は、`FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c` ファイルで実装されている mbedTLS ベースのインターフェイスを使用します。`prvConnectToServer` の定義は、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c#L306-L366) ウェブサイトに記載されています。

### データをアップロードする
<a name="core-http-s3-upload-demo-upload-data"></a>

`prvUploadS3ObjectFile` 関数は、PUT リクエストの作成方法とアップロードするファイルの指定方法を示します。ファイルのアップロード先の Amazon S3 バケットと、アップロードするファイルの名前は、署名付き URL に指定されます。メモリを節約するために、リクエストヘッダーとレスポンスの受信の両方に同じバッファが使用されます。レスポンスは、`HTTPClient_Send` API 関数を使用して同期的に受信されます。`200 OK` レスポンスステータスコードが Amazon S3 HTTP サーバーから返されることが想定されます。その他のステータスコードはエラーです。

`prvUploadS3ObjectFile()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c#L539-L632) ウェブサイトに記載されています。

### アップロードを検証する
<a name="core-http-s3-upload-demo-verifying-data"></a>

`prvVerifyS3ObjectFileSize` 関数は、`prvGetS3ObjectFileSize` を呼び出して S3 バケットのオブジェクトのサイズを取得します。Amazon S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの `Content-Range` ヘッダーフィールドに含まれています。`206 Partial Content` レスポンスがサーバーから返されることが想定されます。その他のレスポンスステータスコードはエラーです。

`prvGetS3ObjectFileSize()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c#L370-L535) ウェブサイトに記載されています。

# coreHTTP 基本 S3 ダウンロードのデモ
<a name="core-http-s3-download-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-s3-download-demo-intro"></a>

このデモでは、[範囲リクエスト](https://tools.ietf.org/html/rfc7233)を使用して Amazon S3 HTTP サーバーからファイルをダウンロードする方法を示します。範囲リクエストは、`HTTPClient_AddRangeHeader` を使用して HTTP リクエストを作成するときに coreHTTP API でネイティブにサポートされます。マイクロコントローラ環境では、範囲リクエストを使用することを強くお勧めします。単一のリクエストはなく、個別の複数の範囲リクエストで大きなファイルをダウンロードすることで、ネットワークソケットをブロックすることなくファイルの各セクションを処理できます。範囲リクエストを使用すると、パケットがドロップされて TCP 接続での再送が必要になるリスクが低くなるため、デバイスの消費電力が改善されます。

この例で使用する[ネットワークトランスポートインターフェイス](https://freertos.org/network-interface.html)は、mbedTLS を使用して、coreHTTP を実行する IoT デバイスクライアントと Amazon S3 HTTP サーバー間に相互認証された接続を確立します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

### シングルスレッドとマルチスレッド
<a name="core-http-s3-download-demo-threads"></a>

coreHTTP には、シングルスレッドとマルチスレッド (マルチタスク) の 2 つの使用モデルがあります。****このデモは、このセクションでは 1 つのスレッドで HTTP ライブラリを実行しますが、実際にはシングルスレッド環境で coreHTTP を使用する方法を示しています (このデモでは、1 つのタスクのみが HTTP API を使用します)。シングルスレッドアプリケーションは HTTP ライブラリを繰り返し呼び出す必要がありますが、マルチスレッドアプリケーションは、代わりにエージェント (またはデーモン) タスク内でバックグラウンドで HTTP リクエストを送信できます。

## ソースコードの編成
<a name="core-http-s3-download-demo-source-code"></a>

デモプロジェクトの名前は `http_demo_s3_download.c` です。このプロジェクトは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c) ウェブサイトにあります。

## Amazon S3 HTTP サーバー接続の設定
<a name="core-http-s3-download-demo-configure-server"></a>

このデモでは、署名付き URL を使用して Amazon S3 HTTP サーバーに接続し、ダウンロードするオブジェクトへのアクセスを許可します。Amazon S3 HTTP サーバーの TLS 接続では、サーバー認証のみが使用されます。アプリケーションレベルでは、オブジェクトへのアクセスは、署名付き URL クエリのパラメータを使用して認証されます。以下のステップに従って、 AWSへの接続を設定します。

1.  AWS アカウントをセットアップします。

   1. まだ作成していない場合は、[AWS アカウントを作成してアクティブ化します](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)。

   1. アカウントとアクセス許可は AWS Identity and Access Management (IAM) を使用して設定されます。IAM では、アカウント内の各ユーザーのアクセス権限を管理できます。デフォルトでは、ルート所有者によって付与されるまで、ユーザーにはアクセス権限がありません。

      1.  AWS アカウントにユーザーを追加するには、[IAM ユーザーガイド](https://docs.aws.amazon.com/IAM/latest/UserGuide/)を参照してください。

      1. これらのポリシー AWS IoT を追加して、FreeRTOS および にアクセスするためのアクセス許可を AWS アカウントに付与します。
         + AmazonS3FullAccess

1. Amazon Simple Storage Service Console ユーザーガイドの [S3 バケットを作成する方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)に従って、S3 にバケットを作成します。**

1. [S3 バケットにファイルとフォルダをアップロードする方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)のステップに従って、S3 にファイルをアップロードします。

1. `FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py` ファイルにあるスクリプトを使用して、署名付き URL を生成します。使用手順については、「`FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md`」を参照してください。

## 機能
<a name="core-http-s3-download-demo-functionality"></a>

このデモは、まずファイルのサイズを取得します。次に、各バイト範囲をループ内で順番にリクエストします。範囲サイズは `democonfigRANGE_REQUEST_LENGTH` で指定します。

デモのソースコードは [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c) ウェブサイトに記載されています。

### Amazon S3 HTTP サーバーに接続する
<a name="core-http-s3-download-demo-connecting"></a>

[connectToServerWithBackoffRetries()](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) 関数は HTTP サーバへの TCP 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。`connectToServerWithBackoffRetries()` は、設定された試行回数に達してもサーバーへの TCP 接続を確立できない場合に、失敗ステータスを返します。

`prvConnectToServer()` 関数は、サーバー認証のみを使用して Amazon S3 HTTP サーバーへの接続を確立する方法を示します。この関数は、[FreeRTOS-Plus/Source/Application-Protocols/network\$1transport/freertos\$1plus\$1tcp/using\$1mbedtls/using\$1mbedtls.c](https://github.com/FreeRTOS/FreeRTOS/blob/202012.00/FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c) ファイルに実装されている mbedTLS ベースのトランスポートインターフェイスを使用します。

`prvConnectToServer()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L273-L333) に記載されています。

### 範囲リクエストを作成する
<a name="core-http-s3-download-demo-creating-range-request"></a>

`HTTPClient_AddRangeHeader()` API 関数は、バイト範囲を HTTP リクエストヘッダーにシリアル化して、範囲リクエストを形成することをサポートします。このデモでは、範囲リクエストを使用して、ファイルサイズを取得し、ファイルの各セクションをリクエストします。

`prvGetS3ObjectFileSize()` 関数は、S3 バケットのファイルのサイズを取得します。Amazon S3 へのこの最初のリクエストには、レスポンスの送信後も接続を開いたままにするために `Connection: keep-alive` ヘッダーが追加されます。S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの `Content-Range` ヘッダーフィールドに含まれています。`206 Partial Content` レスポンスがサーバーから返されることが想定されます。受信するその他のレスポンスステータスコードはエラーです。

`prvGetS3ObjectFileSize()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L337-L502) に記載されています。

このデモは、ファイルサイズを取得した後、ダウンロードするファイルのバイト範囲ごとに新しい範囲リクエストを作成します。ファイルの各セクションについて `HTTPClient_AddRangeHeader()` を使用します。

### 範囲リクエストの送信とレスポンスの受信
<a name="core-http-s3-download-demo-send-request"></a>

`prvDownloadS3ObjectFile()` 関数は、ファイル全体がダウンロードされるまで、範囲リクエストをループ内で送信します。`HTTPClient_Send()` API 関数は、リクエストの送信とレスポンスの受信を同期的に行います。関数からのレスポンスは `xResponse` で受信されます。その後、ステータスコードが `206 Partial Content` であることが検証され、これまでにダウンロードされたバイト数の増加が `Content-Length` ヘッダー値で表されます。

`prvDownloadS3ObjectFile()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L506-L651) に記載されています。

# coreHTTP 基本マルチスレッドのデモ
<a name="core-http-bmt-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-bmt-demo-intro"></a>

このデモでは、[FreeRTOS のスレッドセーフキュー](https://freertos.org/a00018.html)を使用して、処理を待機しているリクエストとレスポンスを保持します。このデモでは、3 つのタスクに注目してください。
+ メインタスクは、リクエストがリクエストキューに表示されるのを待ちます。表示されたリクエストをネットワーク経由で送信し、レスポンスをレスポンスキューに配置します。
+ リクエストタスクは、サーバーに送信する HTTP ライブラリリクエストオブジェクトを作成し、リクエストキューに配置します。各リクエストオブジェクトには、アプリケーションにダウンロードするように設定されている S3 ファイルのバイト範囲を指定します。
+ レスポンスタスクは、レスポンスがレスポンスキューに表示されるのを待ちます。受信したすべてのレスポンスをログに記録します。

この基本マルチスレッドのデモは、サーバー認証のみを使用する TLS 接続を使用するように設定されています。これは Amazon S3 HTTP サーバーの要件です。アプリケーションレイヤー認証は、[署名付き URL クエリ](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html)の[署名バージョン 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) パラメータを使用して実行されます。

## ソースコードの編成
<a name="core-http-bmt-demo-source"></a>

デモプロジェクトの名前は `http_demo_s3_download_multithreaded.c` です。このプロジェクトは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download_multithreaded.c) ウェブサイトにあります。

## デモプロジェクトを構築する
<a name="core-http-bmt-demo-building"></a>

このデモプロジェクトでは、[Visual Studio の無料のコミュニティエディション](https://visualstudio.microsoft.com/vs/community/)を使用します。次の手順でデモを構築します。

1. Visual Studio IDE 内から `mqtt_multitask_demo.sln` Visual Studio ソリューションファイルを開きます。

1. IDE の **[Build]** (構築) メニューから **[Build Solution]** (ソリューションの構築) を選択します。

**注記**  
Microsoft Visual Studio 2017 以前を使用している場合は、お使いのバージョンと互換性がある**プラットフォームツールセット**を選択する必要があります (**[Project] (プロジェクト) -> [RTOSDemos Properties] (RTOSDemos プロパティ) -> [Platform Toolset] (プラットフォームツールセット)** )。

## デモプロジェクトを設定する
<a name="core-http-bmt-demo-configuring"></a>

このデモでは、[FreeRTOS\$1TCP TCP/IP スタック](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html)を使用します。[TCP/IP スタータープロジェクト](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html)の指示に従って、次の手順を実行します。

1. [前提条件コンポーネント](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#prerequisites) (WinPCap など) をインストールします。

1. オプションで[静的または動的 IP アドレス、ゲートウェイアドレス、ネットマスクを設定します](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#static-dynamic)。

1. オプションで [MAC アドレスを設定します](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#mac-addr)。

1. ホストマシンの[イーサネットネットワークインターフェイスを選択します](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#network-interface)。

1. **重要**: HTTP デモを実行する前に[ネットワーク接続をテストします](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#connectivity-test)。

## Amazon S3 HTTP サーバー接続の設定
<a name="core-http-bmt-demo-configuring-connection"></a>

coreHTTP 基本ダウンロードのデモの [Amazon S3 HTTP サーバー接続の設定](core-http-s3-download-demo.md#core-http-s3-download-demo-configure-server) の指示に従います。**

## 機能
<a name="core-http-bmt-demo-functionality"></a>

このデモでは、合計 3 つのタスクを作成します。
+ リクエストを送信し、ネットワーク経由でレスポンスを受信するタスク。
+ 送信するリクエストを作成するタスク。
+ 受信したレスポンスを処理するタスク。

このデモのメインタスクの動作: 

1. リクエストキューとレスポンスキューを作成します。

1. サーバーへの接続を作成します。

1. リクエストタスクとレスポンスタスクを作成します。

1. リクエストキューがネットワーク経由でリクエストを送信するのを待ちます。

1. ネットワーク経由で受信したレスポンスをレスポンスキューに配置します。

リクエストタスクの動作:

1. 各範囲リクエストを作成します。

レスポンスタスクの動作:

1. 受信した各レスポンスを処理します。

## Typedefs
<a name="core-http-bmt-demo-typedefs"></a>

このデモでは、マルチスレッドをサポートするために次の構造を定義しています。

**リクエスト項目**

次の構造で、リクエストキューに配置するリクエスト項目を定義します。リクエスト項目は、リクエストタスクが HTTP リクエストを作成した後、キューにコピーされます。

```
/**
 * @brief Data type for the request queue.
 *
 * Contains the request header struct and its corresponding buffer, to be
 * populated and enqueued by the request task, and read by the main task. The
 * buffer is included to avoid pointer inaccuracy during queue copy operations.
 */
typedef struct RequestItem
{
    HTTPRequestHeaders_t xRequestHeaders;
    uint8_t ucHeaderBuffer[ democonfigUSER_BUFFER_LENGTH ];
} RequestItem_t;
```

**レスポンス項目**

次の構造で、レスポンスキューに配置するレスポンス項目を定義します。レスポンス項目は、メインの HTTP タスクがネットワーク経由でレスポンスを受信した後、キューにコピーされます。

```
/**
 * @brief Data type for the response queue.
 *
 * Contains the response data type and its corresponding buffer, to be enqueued
 * by the main task, and interpreted by the response task. The buffer is
 * included to avoid pointer inaccuracy during queue copy operations.
 */
typedef struct ResponseItem
{
    HTTPResponse_t xResponse;
    uint8_t ucResponseBuffer[ democonfigUSER_BUFFER_LENGTH ];
} ResponseItem_t;
```

## メインの HTTP 送信タスク
<a name="core-http-bmt-demo-main-task"></a>

メインのアプリケーションタスクの動作:

1. ホストアドレスの署名付き URL を解析して、Amazon S3 HTTP サーバーとの接続を確立します。

1. S3 バケット内のオブジェクトへのパスの署名付き URL を解析します。

1. サーバー認証と TLS を使用して Amazon S3 HTTP サーバーに接続します。

1. リクエストキューとレスポンスキューを作成します。

1. リクエストタスクとレスポンスタスクを作成します。

`prvHTTPDemoTask()` 関数でこのセットアップを行い、デモのステータスを返します。この関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L451-L650) に記載されています。

`prvDownloadLoop()` 関数では、メインタスクがリクエストキューからのリクエストをブロックして待機します。リクエストを受信すると、API 関数 `HTTPClient_Send()` を使用してリクエストを送信します。この API 関数が成功すると、レスポンスをレスポンスキューに配置します。

`prvDownloadLoop()` のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L1071-L1174) に記載されています。

## HTTP リクエストタスク
<a name="core-http-bmt-demo-request-task"></a>

リクエストタスクは `prvRequestTask` 関数で指定されます。この関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L778-L876) に記載されています。

リクエストタスクは、Amazon S3 バケット内のファイルのサイズを取得します。これは `prvGetS3ObjectFileSize` 関数で実行されます。Amazon S3 へのこのリクエストには、レスポンスの送信後も接続を開いたままにするために「Connection: keep-alive」ヘッダーが追加されます。Amazon S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの `Content-Range` ヘッダーフィールドに含まれています。`206 Partial Content` レスポンスがサーバーから返されることが想定されます。受信するその他のレスポンスステータスコードはエラーです。

`prvGetS3ObjectFileSize` のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L757-L774) に記載されています。

ファイルサイズを取得した後も、リクエストタスクはファイルの各範囲のリクエストを続けます。各範囲リクエストはリクエストキューに配置され、メインタスクによって送信されます。ファイル範囲は、デモユーザーがマクロ `democonfigRANGE_REQUEST_LENGTH` で設定します。範囲リクエストは、`HTTPClient_AddRangeHeader` 関数を使用するときに HTTP クライアントライブラリ API でネイティブにサポートされます。`prvRequestS3ObjectRange` 関数は、`HTTPClient_AddRangeHeader()` の使用方法を示します。

`prvRequestS3ObjectRange` 関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L694-L753) に記載されています。

## HTTP レスポンスタスク
<a name="core-http-bmt-demo-response-task"></a>

レスポンスタスクは、ネットワーク経由で受信されたレスポンスのレスポンスキューで待ちます。メインタスクは、HTTP レスポンスを正常に受信するとレスポンスキューに配置します。このタスクは、ステータスコード、ヘッダー、および本文をログに記録してレスポンスを処理します。実世界のアプリケーションは、例えばレスポンス本体をフラッシュメモリに書き込んでレスポンスを処理できます。レスポンスステータスコードが `206 partial content` でない場合、このタスクはデモが失敗することをメインタスクに通知します。レスポンスタスクは `prvResponseTask` 関数で指定されます。この関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L961-L1047) に記載されています。

# AWS IoT ジョブライブラリのデモ
<a name="freertos-jobs-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="freertos-jobs-demo-introduction"></a>

AWS IoT ジョブライブラリのデモは、MQTT 接続を介して [AWS IoT ジョブサービス](https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html)に接続し、AWS IoT からジョブを取得し、デバイス上でジョブを処理する方法を示します。AWS IoT ジョブデモプロジェクトは [FreeRTOS Windows ポート](https://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html)を使用するので、Windows で [Visual Studio コミュニティ](https://visualstudio.microsoft.com/vs/community/)バージョンを使用して構築して評価できます。マイクロコントローラハードウェアは必要ありません。デモでは、[coreMQTT Mutual Authentication デモ](mqtt-demo-ma.md) と同じ方法で TLS を使用する AWS IoT MQTT ブローカーへのセキュアな接続を確立します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## ソースコードの編成
<a name="freertos-jobs-demo-source-code-org"></a>

デモのコードは `jobs_demo.c` ファイルにあり、[GitHub ](https://github.com/aws/amazon-freertos/blob/main/demos/jobs_for_aws/jobs_demo.c)ウェブサイトまたは `freertos/demos/jobs_for_aws/` ディレクトリで見つけることができます。

## AWS IoT MQTT ブローカー接続を設定する
<a name="freertos-jobs-demo-configure-mqtt-broker"></a>

このデモでは、AWS IoT MQTT ブローカーへの MQTT 接続を使用します。この接続は、[coreMQTT Mutual Authentication デモ](mqtt-demo-ma.md) と同じ方法で設定されています。

## 機能
<a name="freertos-jobs-demo-functionality"></a>

デモでは、AWS IoT からジョブを受信し、デバイス上でジョブを処理するために使用するワークフローを示します。このデモは対話式で、AWS IoT コンソールまたは AWS Command Line Interface (AWS CLI) を使用してジョブを作成する必要があります。ジョブの作成の詳細については、「*AWS CLI コマンドリファレンス*」の「[create-job](https://docs.aws.amazon.com/cli/latest/reference/iot/create-job.html)」を参照してください。デモでは、メッセージをコンソールに出力するために、`action` キーが `print` に設定されたジョブドキュメントが必要です。

このジョブドキュメントについては、次の形式を参照してください。

```
{
    "action": "print",
    "message": "ADD_MESSAGE_HERE"
}
```

AWS CLI を使用して、次の例のコマンドようにジョブを作成できます。

```
aws iot create-job \
    --job-id t12 \
    --targets arn:aws:iot:region:123456789012:thing/device1 \
    --document '{"action":"print","message":"hello world!"}'
```

デモでは、メッセージをトピックに再発行するために、`action` キーが `publish` に設定されたジョブドキュメントも必要です。このジョブドキュメントについては、次の形式を参照してください。

```
{
    "action": "publish",
    "message": "ADD_MESSAGE_HERE",
    "topic": "topic/name/here"
}
```

デモは、デモを終了するために `action` キーが `exit` に設定されたジョブドキュメントを受信するまでループします。ジョブドキュメントの形式は次のとおりです。

```
{
    "action: "exit"
}
```

### ジョブデモのエントリポイント
<a name="freertos-jobs-demo-functionality-entry-point"></a>

ジョブデモのエントリポイント関数のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/jobs_for_aws/jobs_demo.c#L773-L967) にあります。この関数は次の操作を実行します。

1. `mqtt_demo_helpers.c` のヘルパー関数を使用して MQTT 接続を確立します。

1. `NextJobExecutionChanged` のヘルパー関数を使用して `mqtt_demo_helpers.c` API 向けの MQTT トピックをサブスクライブします。トピック文字列は、AWS IoT ジョブライブラリで定義されたマクロを使用して、先に収集されます。

1. `StartNextPendingJobExecution` のヘルパー関数を使用して `mqtt_demo_helpers.c` API 向けの MQTT トピックを発行します。トピック文字列は、AWS IoT ジョブライブラリで定義されたマクロを使用して、先に収集されます。

1. `MQTT_ProcessLoop` を繰り返し呼び出して着信メッセージを受信し、処理のために `prvEventCallback` に渡します。

1. デモが終了アクションを受け取ったら、`mqtt_demo_helpers.c` ファイルのヘルパー関数を使用して、MQTT トピックのサブスクライブを解除し、接続を切断します。

### 受信した MQTT メッセージのコールバック
<a name="freertos-jobs-demo-functionality-callback"></a>

[prvEventCallback](https://github.com/aws/amazon-freertos/blob/main/demos/jobs_for_aws/jobs_demo.c#L674-L769) 関数は、AWS IoT ジョブライブラリから `Jobs_MatchTopic` を呼び出し、着信 MQTT メッセージを分類します。メッセージタイプが新しいジョブに対応している場合、`prvNextJobHandler()` が呼び出されます。

[prvNextJobHandler](https://github.com/aws/amazon-freertos/blob/main/demos/jobs_for_aws/jobs_demo.c#L601-L670) 関数とこの関数に呼び出される関数は、JSON 形式のメッセージからジョブドキュメントを解析し、ジョブで指定されたアクションを実行します。特に興味深いのは `prvSendUpdateForJob` 関数です。

### 実行中のジョブの更新を送信する
<a name="freertos-jobs-demo-functionality-send-update"></a>

[prvSendUpdateForJob()](https://github.com/aws/amazon-freertos/blob/main/demos/jobs_for_aws/jobs_demo.c#L413-L457) 関数は、ジョブライブラリから `Jobs_Update()` を呼び出し、直後の MQTT 公開操作で使用されるトピック文字列を入力します。

# coreMQTT デモ
<a name="mqtt-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

以下のデモでは、coreMQTT ライブラリの使い方について説明します。

**Topics**
+ [coreMQTT Mutual Authentication デモ](mqtt-demo-ma.md)
+ [coreMQTT エージェント接続共有デモ](mqtt-demo-cs.md)

# coreMQTT Mutual Authentication デモ
<a name="mqtt-demo-ma"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="mqtt-demo-ma-introduction"></a>

coreMQTT Mutual Authentication デモプロジェクトでは、クライアントとサーバー間の相互認証で TLS を使用して MQTT ブローカーへの接続を確立する方法を説明します。このデモでは mbedTLS ベースのトランスポートインターフェイスの実装を使用して、サーバーとクライアント間の認証 TLS 接続を確立し、[QoS 1](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Toc442180914) レベルでの MQTT のサブスクライブおよび公開ワークフローについて説明します。トピックフィルターをサブスクライブし、フィルターに一致するトピックに公開し、QoS 1 レベルでサーバからそれらのメッセージを受信するまで待機します。ブローカーに公開し、ブローカーから同じメッセージを受信するこのサイクルは、無限に繰り返されます。このデモのメッセージは QoS 1 で送信され、MQTT 仕様に従って少なくとも 1 つの配信が保証されます。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## ソースコード
<a name="mqtt-demo-ma-source-code"></a>

デモのソースファイルの名前は `mqtt_demo_mutual_auth.c` で、`freertos/demos/coreMQTT/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c) ウェブサイトで手に入ります。

## 機能
<a name="mqtt-demo-ma-functionality"></a>

デモでは、ブローカーに接続し、ブローカーのトピックをサブスクライブし、ブローカーのトピックに公開し、最後にブローカーから切断する方法を示す一連の例をループ処理する 1 つのアプリケーションタスクを作成します。デモアプリケーションは、同じトピックをサブスクライブし、公開します。デモが MQTT ブローカーにメッセージを公開するたびに、ブローカーは同じメッセージをデモアプリケーションに送り返します。

デモが正常に完了すると、次の図のような出力が生成されます。

![\[正常に完了した場合の MQTT デモ端末の出力\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coremqtt-mad-output.png)


 AWS IoT コンソールは、次のイメージのような出力を生成します。

![\[正常に完了した場合の MQTT デモコンソールの出力\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coremqtt-mad-console.png)


## エクスポネンシャルバックオフとジッターを使用してロジックを再試行する
<a name="mqtt-demo-ma-retry-logic"></a>

[prvBackoffForRetry](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L671-L717) 関数は、TLS 接続や MQTT サブスクライブ要求など、サーバーでの失敗したネットワークオペレーションを、エクスポネンシャルバックオフとジッターでどのように再試行できるかを示します。この関数は次の再試行のバックオフ時間を計算し、再試行回数がまだ残っている場合にバックオフ遅延を実行します。バックオフ時間の計算には乱数の生成が必要なため、この関数は PKCS11 モジュールを使用して乱数を生成します。PKCS11 モジュールを使用すると、ベンダーのプラットフォームで真性乱数生成器 (TRNG) がサポートされている場合、真性乱数生成器にアクセスできます。接続再試行中のデバイスからの衝突の可能性を軽減するため、乱数生成器にデバイス固有のエントロピーソースをシードすることをお勧めします。

## MQTT ブローカーへの接続
<a name="mqtt-demo-ma-connecting"></a>

[prvConnectToServerWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L721-L782) 関数は、MQTT ブローカーへの相互認証された TLS 接続の確立を試みます。接続が失敗すると、バックオフ時間の後に再試行されます。バックオフ時間は最大試行回数に達するか、最大バックオフ時間に達するまで、指数関数的に増加します。`BackoffAlgorithm_GetNextBackoff` 関数は指数関数的に増加するバックオフ値を提供し、最大試行回数に達した場合に `RetryUtilsRetriesExhausted` を返します。`prvConnectToServerWithBackoffRetries` 関数は、設定された試行回数に達してもブローカーへの TLS 接続を確立できない場合に、失敗ステータスを返します。

[prvCreateMQTTConnectionWithBroker](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L785-L848) 関数は、クリーンセッションで MQTT ブローカーへの MQTT 接続を確立する方法を示します。これは TLS トランスポートインターフェイスを使用し、TLS トランスポートインターフェイスは `FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c` ファイルで実装されます。ブローカーのキープアライブ (秒) は `xConnectInfo` で設定することに注意してください。

次の関数は、TLS トランスポートインターフェイスと time 関数が `MQTT_Init` 関数を使って MQTT コンテキストでどのように設定されるかを示します。また、イベントコールバック関数ポインタ (`prvEventCallback`) の設定方法も表しています。このコールバックは、受信メッセージのレポートに使用されます。

## MQTT トピックのサブスクライブ
<a name="mqtt-demo-ma-subscribing"></a>

[prvMQTTSubscribeWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L871-L969) 関数は、MQTT ブローカーのトピックフィルターをサブスクライブする方法を示しています。この例では、1 つのトピックフィルターをサブスクライブする方法について説明しますが、同じサブスクライブ API コールでトピックフィルターのリストを渡して、複数のトピックフィルターをサブスクラブすることも可能です。また、MQTT ブローカーがサブスクリプション要求を拒否した場合、`RETRY_MAX_ATTEMPTS` に関してサブスクリプションはエクスポネンシャルバックオフで再試行します。

## トピックへの公開
<a name="mqtt-demo-ma-publishing"></a>

[prvMQTTPublishToTopic](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L972-L1004) 関数は、MQTT ブローカーのトピックに公開する方法を示しています。

## 受信メッセージの受信
<a name="mqtt-demo-ma-receiving"></a>

アプリケーションは前述のように、ブローカーに接続する前にイベントコールバック関数を登録します。`prvMQTTDemoTask` 関数は `MQTT_ProcessLoop` 関数を呼び出して受信メッセージを受信します。受信 MQTT メッセージを受信すると、受信 MQTT メッセージはアプリケーションが登録したイベントコールバック関数を呼び出します。[prvEventCallback](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1139-L1154) 関数は、このようなイベントコールバック関数の一例です。`prvEventCallback` は受信パケットタイプを調べ、適切なハンドラを呼び出します。以下の例では、関数は受信した発行メッセージを処理する `prvMQTTProcessIncomingPublish()`、確認 (ACK) を処理する `prvMQTTProcessResponse()` のいずれかを呼び出します。

## 受信 MQTT 公開パケットの処理
<a name="mqtt-demo-ma-processing"></a>

[prvMQTTProcessIncomingPublish](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1108-L1135) 関数は、MQTT ブローカーから公開パケットを処理する方法を示しています。

## トピックからのサブスクリプションの解除
<a name="mqtt-demo-ma-unsubscribing"></a>

ワークフローの最後のステップは、ブローカーが `mqttexampleTOPIC` から発行されたメッセージを送信しないように、トピックのサブスクライブを解除することです。[prvMQTTUnsubscribeFromTopic](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1007-L1043) 関数の定義は次のとおりです。

## デモで使用するルート CA の変更
<a name="mqtt-demo-ma-root-ca"></a>

デフォルトでは、FreeRTOS デモは Amazon ルート CA 1 証明書 (RSA 2048 ビットキー) を使用して AWS IoT Core サーバーで認証します。Amazon Root CA 3 証明書 (ECC 256 ビットキー) など、他の[サーバー認証用の CA 証明書](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html#server-authentication-certs)も使用できます。coreMQTT Mutual Authentication デモのルート CA を変更するには、次の手順を実行します。

1. テキストエディタで、`freertos/vendors/vendor/boards/board/aws_demos/config_files/mqtt_demo_mutual_auth_config.h` ファイルを開きます。

1. ファイルで、次の行を見つけます。

   ```
    * #define democonfigROOT_CA_PEM    "...insert here..." 
   ```

   この行のコメントを解除し、必要に応じてコメントブロックの末尾 ` */` まで移動させます。

1. 使用する CA 証明書をコピーし、`"...insert here..."` テキストに貼り付けます。結果は次の例のようになります。

   ```
   #define democonfigROOT_CA_PEM   "-----BEGIN CERTIFICATE-----\n"\
   "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"\
   "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"\
   "Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"\
   "A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"\
   "Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"\
   "ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"\
   "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"\
   "ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"\
   "BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"\
   "YyRIHN8wfdVoOw==\n"\
   "-----END CERTIFICATE-----\n"
   ```

1. (オプション) 他のデモのルート CA を変更できます。`freertos/vendors/vendor/boards/board/aws_demos/config_files/demo-name_config.h` ファイルごとに、ステップ 1〜3 を繰り返します。

# coreMQTT エージェント接続共有デモ
<a name="mqtt-demo-cs"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="mqtt-demo-cs-introduction"></a>

coreMQTT 接続共有デモプロジェクトでは、マルチスレッドアプリケーションを使用して、クライアントとサーバー間の相互認証で TLS を使用して AWS MQTT ブローカーへの接続を確立する方法を示します。このデモでは、mbedTLS ベースのトランスポートインターフェイスの実装を使用して、サーバーとクライアントの認証 TLS 接続を確立し、[QoS 1](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Toc442180914) レベルでの MQTT のサブスクライブおよび公開ワークフローについて説明します。デモでは、トピックフィルターをサブスクライブし、フィルターに一致するトピックに公開し、QoS 1 レベルでサーバからそれらのメッセージを受信するまで待機します。ブローカーに発行し、ブローカーから同じメッセージを受信するというこのサイクルは、作成されたタスクごとに何度も繰り返されます。このデモのメッセージは QoS 1 で送信され、MQTT 仕様に従って少なくとも 1 つの配信が保証されます。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

このデモでは、スレッドセーフなキューを使用して MQTT API を操作するためのコマンドを保持します。このデモでは、注意すべきタスクが 2 つあります。
+ MQTT エージェント (メイン) タスクは、コマンドキューからのコマンドを処理し、他のタスクがそれらをキューに追加します。このタスクはループに入り、その間にコマンドキューからのコマンドを処理します。終了コマンドを受信すると、このタスクはループから抜け出します。
+ demo subpub タスクは MQTT トピックへのサブスクリプションを作成後に、発行オペレーションを作成してコマンドキューにプッシュします。その後、これらの発行オペレーションが MQTT エージェントタスクによって実行されます。demo subpub タスクは、コマンド完了コールバックの実行に伴い通知される発行の完了まで待機してから、次の発行を開始する前に短い遅延に入ります。このタスクでは、アプリケーションタスクが coreMQTT エージェント API を使用する方法の例を示します。

発行メッセージを着信した場合、coreMQTT エージェントは単一のコールバック関数を呼び出します。このデモには、サブスクライブしているトピックで着信した発行メッセージを呼び出すコールバックをタスクで指定できるサブスクリプションマネージャも含まれています。このデモでエージェントが着信した発行コールバックは、サブスクリプションマネージャを呼び出し、サブスクリプションを登録したタスクに発行をファンアウトします。

このデモでは、相互認証を使用した TLS 接続を使用して AWSに接続します。デモ中にネットワークが予期せず切断された場合、クライアントはエクスポネンシャルバックオフロジックを使用して再接続を試みます。クライアントが正常に再接続してもブローカーが前回のセッションを再開できない場合、クライアントは前回のセッションと同じトピックに再度サブスクライブします。

### シングルスレッドとマルチスレッド
<a name="mqtt-demo-cs-single-vs-multi"></a>

coreMQTT の使用モデルは、シングルスレッドとマルチスレッド (マルチタスク) の 2 つがあります。シングルスレッドモデルでは、coreMQTT ライブラリを 1 つのスレッドからだけ使用するため、MQTT ライブラリで明示的に繰り返し呼び出す必要があります。マルチスレッドユースケースでは、ここで説明しているデモに示すように、エージェント (またはデーモン) タスク内で MQTT プロトコルをバックグラウンドで実行できます。エージェントタスクで MQTT プロトコルを実行する場合、MQTT 状態を明示的に管理したり、`MQTT_ProcessLoop` API 関数を呼び出したりする必要はありません。また、エージェントタスクを使用すると、ミューテックスなどの同期プリミティブを必要とせずに、複数のアプリケーションタスクで単一の MQTT 接続を共有できます。

## ソースコード
<a name="mqtt-demo-cs-source-code"></a>

デモソースファイルは、`mqtt_agent_task.c` と `simple_sub_pub_demo.c` という名前で、[GitHub](https://github.com/aws/amazon-freertos/tree/main/demos/coreMQTT_Agent/) ウェブサイトの `freertos/demos/coreMQTT_Agent/` ディレクトリに用意されています。

## 機能
<a name="mqtt-demo-cs-functionality"></a>

このデモでは、少なくとも 2 つのタスクを作成します。それは MQTT API コールのリクエストを処理するプライマリタスクと、それらのリクエストを作成する設定可能な数のサブタスクです。このデモでは、プライマリタスクがサブタスクを作成し、処理ループを呼び出し、後でクリーンアップします。プライマリタスクは、サブタスク間で共有されるブローカーへの MQTT 接続を 1 つ作成します。サブタスクはブローカーに対する MQTT サブスクリプションを作成し、それに宛ててメッセージを発行します。各サブタスクでは、発行に固有のトピックが使用されます。

## メインタスク
<a name="mqtt-demo-cs-main-task"></a>

主なアプリケーションタスクである [RuncoreMqtTagentDemo](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT_Agent/mqtt_agent_task.c#L435-L480) は、MQTT セッションを確立し、サブタスクを作成し、終了コマンドを受信するまで処理ループ [mqtTagent\$1commandLoop](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT_Agent/mqtt_agent_task.c#L856) を実行します。ネットワークが予期せず切断された場合、デモはバックグラウンドでブローカーに再接続し、ブローカーに対するサブスクリプションを再確立します。処理ループが終了すると、デモはブローカーから切断されます。

### コマンド
<a name="mqtt-demo-cs-main-task-commands"></a>

coreMQTT エージェント API を呼び出すと、エージェントタスクのキューに送信されるコマンドが作成され、`MQTTAgent_CommandLoop()` で処理されます。コマンドの作成時に、オプションの完了コールバックおよびコンテキストパラメータを渡すこともできます。対応するコマンドが完了すると、渡されたコンテキストと、コマンドの結果として作成された戻り値を使用して、完了コールバックが呼び出されます。完了コールバックの署名は次のとおりです。

```
typedef void (* MQTTAgentCommandCallback_t )( void * pCmdCallbackContext,
                                              MQTTAgentReturnInfo_t * pReturnInfo );
```

コマンド完了コンテキストはユーザー定義であり、このデモでは、[struct MQTTAgentCommandContext](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT_Agent/simple_sub_pub_demo.c#L105-L115) となります。

コマンドは次の時点で完了したと見なされます。
+ QoS > 0 でのサブスクライブ、サブスクライブ解除、発行: 対応する確認応答パケットを受信した時点。
+ その他すべてのオペレーション: 対応する coreMQTT API が呼び出された時点。

発行情報、サブスクリプション情報、完了コンテキストなど、コマンドで使用されるすべての構成要素は、コマンドが完了するまでスコープ内に留めておく必要があります。呼び出し元のタスクは、完了コールバックを呼び出す前に、コマンドの構成要素を再利用してはいけません。完了コールバックは MQTT エージェントによって呼び出されるため、コマンドを作成したタスクではなく、エージェントタスクのスレッドコンテキストを使用して実行されます。タスク通知やキューなどのプロセス間通信メカニズムを使用すると、呼び出し元のタスクにコマンドの完了を通知できます。

### コマンドループの実行
<a name="mqtt-demo-cs-command-loop"></a>

コマンドは `MQTTAgent_CommandLoop()` で継続的に処理されます。処理するコマンドがない場合、ループはコマンドがキューに追加されるまで最大で `MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME` 待機します。コマンドが追加されない場合は、`MQTT_ProcessLoop()` の反復が 1 回実行されます。これにより、MQTT キープアライブが管理され、キューにコマンドがない場合でも着信する発行を受け入れられます。

コマンドループ関数は、次の理由で値を返します。
+ コマンドは `MQTTSuccess` 以外のすべてのステータスコードを返します。エラーステータスはコマンドループによって返されるため、エラーステータスについては処理方法を決定できます。このデモでは、TCP 接続が再確立され、再接続が試行されます。エラーが発生した場合、MQTT を使用している他のタスクの介入なしに、バックグラウンドで再接続することができます。
+ 切断コマンド (`MQTTAgent_Disconnect` から) が処理されます。TCP を切断できるように、コマンドループが終了します。
+ 終了コマンド (`MQTTAgent_Terminate` から) が処理されます。このコマンドは、キュー内に残っているコマンドや、確認応答パケットを待っているコマンドをエラーとしてマークし、コード `MQTTRecvFailed` を返します。

### サブスクリプションマネージャ
<a name="mqtt-demo-cs-subscription-manager"></a>

デモでは複数のトピックを使用するため、サブスクリプションマネージャは、サブスクライブされたトピックを一意のコールバックまたはタスクに関連付けるのに役立ちます。このデモのサブスクリプションマネージャはシングルスレッドであるため、複数のタスクで同時に使用しないでください。このデモのサブスクリプションマネージャ関数は MQTT エージェントに渡されるコールバック関数からのみ呼び出され、エージェントタスクのスレッドコンテキストでのみ実行されます。

## シンプルなサブスクライブ発行タスク
<a name="mqtt-demo-cs-sub-pub"></a>

[prvSimpleSubscribePublishTask](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT_Agent/simple_sub_pub_demo.c#L447-L569) の各インスタンスは、MQTT トピックへのサブスクリプションを作成し、そのトピックに対する発行オペレーションを作成します。複数の発行タイプを示すために、偶数番のタスクでは QoS 0 (発行パケットの送信時に完了) が使用され、奇数番のタスクでは QoS 1 (PUBACK パケットの受信時に完了) が使用されます。

# 無線通信経由更新デモアプリケーション
<a name="ota-demo"></a>

FreeRTOS には、無線通信経由 (over-the-air、OTA) ライブラリの機能を示すデモアプリケーションが含まれています。OTA デモアプリケーションは、`freertos/demos/ota/ota_demo_core_mqtt/ota_demo_core_mqtt.c` または `freertos/demos/ota/ota_demo_core_http/ota_demo_core_http.c` のファイルにあります。

OTA デモアプリケーションは、次の操作を実行します。

1. FreeRTOS ネットワークスタックおよび MQTT バッファプールを初期化します。

1. `vRunOTAUpdateDemo()` を使用して OTA ライブラリを実行するタスクを作成します。

1. `_establishMqttConnection()` を使用して MQTT クライアントを作成します。

1. を使用して AWS IoT MQTT ブローカーに接続`IotMqtt_Connect()`し、MQTT 切断コールバック を登録します`prvNetworkDisconnectCallback`。

1. OTA タスクを作成するために `OTA_AgentInit()` を呼び出し、OTA タスクが完了したときに使用されるコールバックを登録します。

1. `xOTAConnectionCtx.pvControlClient = _mqttConnection;` との MQTT 接続を再利用します。

1. MQTT が切断されると、アプリケーションは OTA エージェントを一時停止し、ジッターを伴う指数関数的な遅延を使用して再接続を試行し、OTA エージェントを再開します。

OTA 更新を使用する前に、[FreeRTOS 無線通信経由更新](freertos-ota-dev.md) のすべての前提条件を満たしてください。

OTA 更新の設定を完了したら、OTA 機能をサポートするプラットフォームで FreeRTOS OTA デモをダウンロード、構築、フラッシュ、実行します。次の FreeRTOS 対応デバイスでは、デバイス固有のデモの手順が利用できます。
+ [Texas Instruments CC3220SF-LAUNCHXL](download-ota-ti.md)
+ [Microchip Curiosity PIC32MZEF](download-ota-mchip.md)
+ [Espressif ESP32](download-ota-esp.md)
+ [Renesas RX65N での FreeRTOS OTA デモのダウンロード、構築、フラッシュ、および実行](download-rx65n-ota.md)

デバイスで OTA デモアプリケーションを構築、フラッシュ、実行したら、 AWS IoT コンソールまたは AWS CLI を使用して OTA 更新ジョブを作成できます。OTA 更新ジョブを作成した後、ターミナルエミュレーターを接続して OTA 更新の進行状況を表示します。プロセス中に生成されたエラーを書きとめておきます。

OTA 更新ジョブが正常に行われると、次のような出力が表示されます。この例では、簡潔にするために一部の行がリストから削除されています。

```
    249 21207 [iot_thread] [ota_demo_core_mqtt.c:1850] [INFO] [MQTT]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    250 21247 [MQTT Agent Task] [core_mqtt.c:886] [INFO] [MQTT] Packet received. ReceivedBytes=601.
    251 21247 [MQTT Agent Task] [core_mqtt.c:1045] [INFO] [MQTT] De-serialized incoming PUBLISH packet: DeserializerResult=MQTTSuccess.
    252 21248 [MQTT Agent Task] [core_mqtt.c:1058] [INFO] [MQTT] State record updated. New state=MQTTPubAckSend.
    253 21249 [MQTT Agent Task] [ota_demo_core_mqtt.c:976] [INFO] [MQTT] Received job message callback, size 548.
    254 21252 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[execution.jobId: AFR_OTA-9702f1a3-b747-4c3e-a0eb-a3b0cf83ddbb]
    255 21253 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[execution.jobDocument.afr_ota.streamname: AFR_OTA-945d320b-a18b-441b-b435-4a18d4e7671f]
    256 21255 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[execution.jobDocument.afr_ota.protocols: ["MQTT"]]
    257 21256 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[filepath: aws_demos.bin]
    258 21257 [OTA Agent Task] [ota.c:1684] [INFO] [OTA] Extracted parameter: [key: value]=[filesize: 1164016]
    259 21258 [OTA Agent Task] [ota.c:1684] [INFO] [OTA] Extracted parameter: [key: value]=[fileid: 0]
    260 21259 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[certfile: ecdsa-sha256-signer.crt.pem]
    261 21260 [OTA Agent Task] [ota.c:1575] [INFO] [OTA] Extracted parameter [ sig-sha256-ecdsa: MEQCIE1SFkIHHiZAvkPpu6McJtx7SYoD... ]
    262 21261 [OTA Agent Task] [ota.c:1684] [INFO] [OTA] Extracted parameter: [key: value]=[fileType: 0]
    263 21262 [OTA Agent Task] [ota.c:2199] [INFO] [OTA] Job document was accepted. Attempting to begin the update.
    264 21263 [OTA Agent Task] [ota.c:2323] [INFO] [OTA] Job parsing success: OtaJobParseErr_t=OtaJobParseErrNone, Job name=AFR_OTA-9702f1a3-b747-4c3e-a0eb-a3b0cf83ddbb
    265 21318 [iot_thread] [ota_demo_core_mqtt.c:1850] [INFO] [MQTT]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    266 21418 [iot_thread] [ota_demo_core_mqtt.c:1850] [INFO] [MQTT]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    267 21469 [OTA Agent Task] [ota.c:938] [INFO] [OTA] Setting OTA data interface.
    268 21470 [OTA Agent Task] [ota.c:2839] [INFO] [OTA] Current State=[CreatingFile], Event=[ReceivedJobDocument], New state=[CreatingFile]
    269 21482 [MQTT Agent Task] [core_mqtt.c:886] [INFO] [MQTT] Packet received. ReceivedBytes=3.
    270 21483 [OTA Agent Task] [ota_demo_core_mqtt.c:1503] [INFO] [MQTT] SUBSCRIBED to topic $aws/things/__test_infra_thing71/streams/AFR_OTA-945d320b-a18b-441b-b435-4a18d4e7671f/data/cbor to bro
    271 21484 [OTA Agent Task] [ota.c:2839] [INFO] [OTA] Current State=[RequestingFileBlock], Event=[CreateFile], New state=[RequestingFileBlock]
    272 21518 [iot_thread] [ota_demo_core_mqtt.c:1850] [INFO] [MQTT]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    273 21532 [MQTT Agent Task] [core_mqtt_agent_command_functions.c:76] [INFO] [MQTT] Publishing message to $aws/things/__test_infra_thing71/streams/AFR_OTA-945d320b-a18b-441b-b435-4a18d4e7671f/
    274 21534 [OTA Agent Task] [ota_demo_core_mqtt.c:1553] [INFO] [MQTT] Sent PUBLISH packet to broker $aws/things/__test_infra_thing71/streams/AFR_OTA-945d320b-a18b-441b-b435-4a18d4e7671f/get/cbor
    275 21534 [OTA Agent Task] [ota_mqtt.c:1112] [INFO] [OTA] Published to MQTT topic to request the next block: topic=$aws/things/__test_infra_thing71/streams/AFR_OTA-945d320b-a18b-441b-b435-4a1
    276 21537 [OTA Agent Task] [ota.c:2839] [INFO] [OTA] Current State=[WaitingForFileBlock], Event=[RequestFileBlock], New state=[WaitingForFileBlock]
    277 21558 [MQTT Agent Task] [core_mqtt.c:886] [INFO] [MQTT] Packet received. ReceivedBytes=4217.
    278 21559 [MQTT Agent Task] [core_mqtt.c:1045] [INFO] [MQTT] De-serialized incoming PUBLISH packet: DeserializerResult=MQTTSuccess.
    279 21560 [MQTT Agent Task] [core_mqtt.c:1058] [INFO] [MQTT] State record updated. New state=MQTTPublishDone.
    280 21561 [MQTT Agent Task] [ota_demo_core_mqtt.c:1026] [INFO] [MQTT] Received data message callback, size 4120.
    281 21563 [OTA Agent Task] [ota.c:2464] [INFO] [OTA] Received valid file block: Block index=0, Size=4096
    282 21566 [OTA Agent Task] [ota.c:2683] [INFO] [OTA] Number of blocks remaining: 284
     
    ... // Output removed for brevity
     
    3672 42745 [OTA Agent Task] [ota.c:2464] [INFO] [OTA] Received valid file block: Block index=284, Size=752
    3673 42747 [OTA Agent Task] [ota.c:2633] [INFO] [OTA] Received final block of the update.
    (428298) ota_pal: No such certificate file: ecdsa-sha256-signer.crt.pem. Using certificate in ota_demo_config.h.
    3674 42818 [iot_thread] [ota_demo_core_mqtt.c:1850] [INFO] [MQTT]  Received: 285   Queued: 285   Processed: 284   Dropped: 0
    3675 42918 [iot_thread] [ota_demo_core_mqtt.c:1850] [INFO] [MQTT]  Received: 285   Queued: 285   Processed: 284   Dropped: 0
     
    ... // Output removed for brevity
     
    3678 43197 [OTA Agent Task] [ota.c:2654] [INFO] [OTA] Received entire update and validated the signature.
    3685 43215 [OTA Agent Task] [ota_demo_core_mqtt.c:862] [INFO] [MQTT] Received OtaJobEventActivate callback from OTA Agent.
     
    ... // Output removed for brevity
     
    2 39 [iot_thread] [INFO ][DEMO][390] ---------STARTING DEMO---------
     
    [0;32mI (3633) WIFI: WIFI_EVENT_STA_CONNECTED
    [0;32mI (4373) WIFI: SYSTEM_EVENT_STA_GOT_IP
     
    ... // Output removed for brevity 
     
    4 351 [sys_evt] [INFO ][DEMO][3510] Connected to WiFi access point, ip address: 255.255.255.0.
    5 351 [iot_thread] [INFO ][DEMO][3510] Successfully initialized the demo. Network type for the demo: 1
    6 351 [iot_thread] [ota_demo_core_mqtt.c:1902] [INFO] [MQTT] OTA over MQTT demo, Application version 0.9.1
    7 351 [iot_thread] [ota_demo_core_mqtt.c:1323] [INFO] [MQTT] Creating a TLS connection to <endpoint>-ats.iot.us-west-2.amazonaws.com:8883.
    9 718 [iot_thread] [core_mqtt.c:886] [INFO] [MQTT] Packet received. ReceivedBytes=2.
    10 718 [iot_thread] [core_mqtt_serializer.c:970] [INFO] [MQTT] CONNACK session present bit not set.
    11 718 [iot_thread] [core_mqtt_serializer.c:912] [INFO] [MQTT] Connection accepted.
     
    ... // Output removed for brevity
     
    17 736 [OTA Agent Task] [ota_demo_core_mqtt.c:1503] [INFO] [MQTT] SUBSCRIBED to topic $aws/things/__test_infra_thing71/jobs/notify-next to broker.
    18 737 [OTA Agent Task] [ota_mqtt.c:381] [INFO] [OTA] Subscribed to MQTT topic: $aws/things/__test_infra_thing71/jobs/notify-next
    30 818 [iot_thread] [ota_demo_core_mqtt.c:1850] [INFO] [MQTT]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    31 819 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[execution.jobId: AFR_OTA-9702f1a3-b747-4c3e-a0eb-a3b0cf83ddbb]
    32 820 [OTA Agent Task] [ota.c:1684] [INFO] [OTA] Extracted parameter: [key: value]=[execution.statusDetails.updatedBy: 589824]
    33 822 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[execution.jobDocument.afr_ota.streamname: AFR_OTA-945d320b-a18b-441b-b435-4a18d4e7671f]
    34 823 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[execution.jobDocument.afr_ota.protocols: ["MQTT"]]
    35 824 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[filepath: aws_demos.bin]
    36 825 [OTA Agent Task] [ota.c:1684] [INFO] [OTA] Extracted parameter: [key: value]=[filesize: 1164016]
    37 826 [OTA Agent Task] [ota.c:1684] [INFO] [OTA] Extracted parameter: [key: value]=[fileid: 0]
    38 827 [OTA Agent Task] [ota.c:1645] [INFO] [OTA] Extracted parameter: [key: value]=[certfile: ecdsa-sha256-signer.crt.pem]
    39 828 [OTA Agent Task] [ota.c:1575] [INFO] [OTA] Extracted parameter [ sig-sha256-ecdsa: MEQCIE1SFkIHHiZAvkPpu6McJtx7SYoD... ]
    40 829 [OTA Agent Task] [ota.c:1684] [INFO] [OTA] Extracted parameter: [key: value]=[fileType: 0]
    41 830 [OTA Agent Task] [ota.c:2102] [INFO] [OTA] In self test mode.
    42 830 [OTA Agent Task] [ota.c:1936] [INFO] [OTA] New image has a higher version number than the current image: New image version=0.9.1, Previous image version=0.9.0
    43 832 [OTA Agent Task] [ota.c:2120] [INFO] [OTA] Image version is valid: Begin testing file: File ID=0
    53 896 [OTA Agent Task] [ota.c:794] [INFO] [OTA] Beginning self-test.
    62 971 [OTA Agent Task] [ota_demo_core_mqtt.c:1553] [INFO] [MQTT] Sent PUBLISH packet to broker $aws/things/__test_infra_thing71/jobs/AFR_OTA-9702f1a3-b747-4c3e-a0eb-a3b0cf83ddbb/update to br63 971 [MQTT Agent Task] [core_mqtt.c:1045] [INFO] [MQTT] De-serialized incoming PUBLISH packet: DeserializerResult=MQTTSuccess.
    65 973 [MQTT Agent Task] [core_mqtt.c:1058] [INFO] [MQTT] State record updated. New state=MQTTPublishDone.
    64 973 [OTA Agent Task] [ota_demo_core_mqtt.c:902] [INFO] [MQTT] Successfully updated with the new image.
```

# 無線通信経由デモ設定
<a name="ota-demo-specific-config"></a>

OTA デモ設定は、`aws_iot_ota_update_demo.c` で提供されるデモ固有の設定オプションです。これらの設定は、OTA ライブラリ設定ファイルで提供されている OTA ライブラリ設定とは異なります。

**OTA\$1DEMO\$1KEEP\$1ALIVE\$1SECONDS**  
MQTT クライアントの場合、この設定は、1 つの制御パケットの送信が完了してから次の制御パケットの送信を開始するまでの最大時間間隔です。制御パケットがない場合、PINGREQ が送信されます。ブローカーは、このキープアライブ間隔の 1 倍半の時間でメッセージまたは PINGREQ パケットを送信しないクライアントを切断する必要があります。この設定は、アプリケーションの要件に基づいて調整する必要があります。

**OTA\$1DEMO\$1CONN\$1RETRY\$1BASE\$1INTERVAL\$1SECONDS**  
ネットワーク接続を再試行するまでの基本間隔 (秒単位)。OTA デモは、この基本時間間隔の後に再接続を試みます。この間隔は、試行が失敗するたびに倍増します。この基本遅延の最大値までのランダムな遅延も間隔に追加されます。

**OTA\$1DEMO\$1CONN\$1RETRY\$1MAX\$1INTERVAL\$1SECONDS**  
ネットワーク接続を再試行するまでの最大間隔 (秒単位)。再接続遅延は試行が失敗するたびに倍増しますが、この最大値に同じ間隔のジッターを加えた値を超えることはありません。

# Texas Instruments CC3220SF-LAUNCHXL での FreeRTOS OTA デモのダウンロード、構築、フラッシュ、実行
<a name="download-ota-ti"></a>

**重要**  <a name="deprecation-message"></a>
このリファレンス統合は、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。<a name="download-demo"></a>

**FreeRTOS と OTA デモコードをダウンロードするには**
+ GitHub サイト ([https://github.com/FreeRTOS/FreeRTOS](https://github.com/FreeRTOS/FreeRTOS)) からソースコードをダウンロードすることができます。<a name="build-demo"></a>

**デモアプリケーションを構築するには**

1. の手順に従って[FreeRTOS の開始方法](freertos-getting-started.md)、`aws_demos`プロジェクトを Code Composer Studio にインポートし、 AWS IoT エンドポイント、Wi-Fi SSID とパスワード、ボードのプライベートキーと証明書を設定します。

1.  `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして `CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` または `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED` を定義します。

1. ソリューションを構築し、エラーなしでビルドされていることを確認します。

1. ターミナルエミュレーターを起動し、次の設定を使用してボードに接続します。
   + ボーレート: 115200
   + データビット: 8
   + パリティ: なし
   + ストップビット: 1

1. ボード上でプロジェクトを実行し、Wi-Fi と AWS IoT MQTT メッセージブローカーに接続できることを確認します。

実行時に、ターミナルエミュレーターは次のようなテキストを表示するはずです。

```
    0 1000 [Tmr Svc] Simple Link task created
    Device came up in Station mode
    1 2534 [Tmr Svc] Write certificate...
    2 5486 [Tmr Svc] [ERROR] Failed to destroy object. PKCS11_PAL_DestroyObject failed.
    3 5486 [Tmr Svc] Write certificate...
    4 5776 [Tmr Svc] Security alert threshold = 15
    5 5776 [Tmr Svc] Current number of alerts = 1
    6 5778 [Tmr Svc] Running Demos.
    7 5779 [iot_thread] [INFO ][DEMO][5779] ---------STARTING DEMO---------
    8 5779 [iot_thread] [INFO ][INIT][5779] SDK successfully initialized.
    Device came up in Station mode
    [WLAN EVENT] STA Connected to the AP: afrlab-pepper , BSSID: 74:83:c2:b4:46:27
    [NETAPP EVENT] IP acquired by the device
    Device has connected to afrlab-pepper
    Device IP Address is 192.168.36.176 
    9 8283 [iot_thread] [INFO ][DEMO][8282] Successfully initialized the demo. Network type for the demo: 1
    10 8283 [iot_thread] [INFO] OTA over MQTT demo, Application version 0.9.0
    11 8283 [iot_thread] [INFO] Creating a TLS connection to <endpoint>-ats.iot.us-west-2.amazonaws.com:8883.
    12 8852 [iot_thread] [INFO] Creating an MQTT connection to <endpoint>-ats.iot.us-west-2.amazonaws.com.
    13 8914 [iot_thread] [INFO] Packet received. ReceivedBytes=2.
    14 8914 [iot_thread] [INFO] CONNACK session present bit not set.
    15 8914 [iot_thread] [INFO] Connection accepted.
    16 8914 [iot_thread] [INFO] Received MQTT CONNACK successfully from broker.
    17 8914 [iot_thread] [INFO] MQTT connection established with the broker.
    18 8915 [iot_thread] [INFO]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    19 8953 [OTA Agent T] [INFO] Current State=[RequestingJob], Event=[Start], New state=[RequestingJob]
    20 9008 [MQTT Agent ] [INFO] Packet received. ReceivedBytes=3.
    21 9015 [OTA Agent T] [INFO] SUBSCRIBED to topic $aws/things/__test_infra_thing73/jobs/notify-next to broker.
    22 9015 [OTA Agent T] [INFO] Subscribed to MQTT topic: $aws/things/__test_infra_thing73/jobs/notify-next
    23 9504 [MQTT Agent ] [INFO] Publishing message to $aws/things/__test_infra_thing73/jobs/$next/get.
    24 9535 [MQTT Agent ] [INFO] Packet received. ReceivedBytes=2.
    25 9535 [MQTT Agent ] [INFO] Ack packet deserialized with result: MQTTSuccess.
    26 9536 [MQTT Agent ] [INFO] State record updated. New state=MQTTPublishDone.
    27 9537 [OTA Agent T] [INFO] Sent PUBLISH packet to broker $aws/things/__test_infra_thing73/jobs/$next/get to broker.
    28 9537 [OTA Agent T] [WARN] OTA Timer handle NULL for Timerid=0, can't stop.
    29 9537 [OTA Agent T] [INFO] Current State=[WaitingForJob], Event=[RequestJobDocument], New state=[WaitingForJob]
    30 9539 [MQTT Agent ] [INFO] Packet received. ReceivedBytes=120.
    31 9539 [MQTT Agent ] [INFO] De-serialized incoming PUBLISH packet: DeserializerResult=MQTTSuccess.
    32 9540 [MQTT Agent ] [INFO] State record updated. New state=MQTTPublishDone.
    33 9540 [MQTT Agent ] [INFO] Received job message callback, size 62.
    34 9616 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=execution
    35 9616 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=execution.jobId
    36 9617 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=execution.jobDocument
    37 9617 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=execution.jobDocument.afr_ota
    38 9617 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=execution.jobDocument.afr_ota.protocols
    39 9618 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=execution.jobDocument.afr_ota.files
    40 9618 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=filesize
    41 9618 [OTA Agent T] [INFO] Failed job document content check: Required job document parameter was not extracted: parameter=fileid
    42 9619 [OTA Agent T] [INFO] Failed to parse JSON document as AFR_OTA job: DocParseErr_t=7
    43 9619 [OTA Agent T] [INFO] No active job available in received job document: OtaJobParseErr_t=OtaJobParseErrNoActiveJobs
    44 9619 [OTA Agent T] [ERROR] Failed to execute state transition handler: Handler returned error: OtaErr_t=OtaErrJobParserError
    45 9620 [OTA Agent T] [INFO] Current State=[WaitingForJob], Event=[ReceivedJobDocument], New state=[CreatingFile]
    46 9915 [iot_thread] [INFO]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    47 10915 [iot_thread] [INFO]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    48 11915 [iot_thread] [INFO]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    49 12915 [iot_thread] [INFO]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    50 13915 [iot_thread] [INFO]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
    51 14915 [iot_thread] [INFO]  Received: 0   Queued: 0   Processed: 0   Dropped: 0
```

# Microchip Curiosity PIC32MZEF での FreeRTOS OTA デモのダウンロード、構築、フラッシュ、実行
<a name="download-ota-mchip"></a>

**重要**  <a name="deprecation-message"></a>
このリファレンス統合は、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

**注記**  
Microchip との合意に基づき、Curiosity PIC32MZEF (DM320104) は FreeRTOS Reference Integration リポジトリのメインブランチから削除されるため、新しいリリースには搭載されません。Microchip は PIC32MZEF (DM320104) が新しい設計に推奨されなくなったことを[公式に発表](https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM320104)しました。PIC32MZEF プロジェクトとソースコードには、以前のリリースタグから引き続きアクセスできます。Microchip では、新しい設計に Curiosity [ PIC32MZ-EF-2.0 Development board (DM320209)](https://devices.amazonaws.com/detail/a3G0h0000077I69EAE/Curiosity-PIC32MZ-EF-2-0-Development-Board) を使用するよう推奨しています。Pic32mzv1 プラットフォームは、FreeRTOS リファレンス統合リポジトリの [v202012.00](https://github.com/aws/amazon-freertos/tree/202012.00) に引き続き用意されています。ただし、プラットフォームは FreeRTOS リファレンスの [v202107.00](https://github.com/aws/amazon-freertos/tree/202107.00) によってサポートされなくなりました。<a name="mch-dowload-demo"></a>

**FreeRTOS OTA デモコードをダウンロードするには**
+ GitHub サイト ([https://github.com/FreeRTOS/FreeRTOS](https://github.com/FreeRTOS/FreeRTOS)) からソースコードをダウンロードすることができます。<a name="mch-build-demo"></a>

**OTA 更新デモアプリケーションを構築するには**

1. の手順に従って[FreeRTOS の開始方法](freertos-getting-started.md)、MPLAB X IDE に`aws_demos`プロジェクトをインポートし、 AWS IoT エンドポイント、Wi-Fi SSID とパスワード、ボードのプライベートキーと証明書を設定します。

1. `vendors/vendor/boards/board/aws_demos/config_files/ota_demo_config.h` ファイルを開き、証明書を入力します。

   ```
   [] = "your-certificate-key";
   ```

1. コード署名証明書の内容を次に貼り付けます。

   ```
   #define otapalconfigCODE_SIGNING_CERTIFICATE [] = "your-certificate-key";
   ```

   `aws_clientcredential_keys.h` と同じ書式に従って、各行は改行文字 ('\$1n') で終わり、引用符で囲む必要があります。

   たとえば、証明書は次のようになります。

   ```
   "-----BEGIN CERTIFICATE-----\n"
   "MIIBXTCCAQOgAwIBAgIJAM4DeybZcTwKMAoGCCqGSM49BAMCMCExHzAdBgNVBAMM\n"
   "FnRlc3Rf62lnbmVyQGFtYXpvbi5jb20wHhcNMTcxMTAzMTkxODM1WhcNMTgxMTAz\n"
   "MTkxODM2WjAhMR8wHQYDVQBBZZZ0ZXN0X3NpZ25lckBhbWF6b24uY29tMFkwEwYH\n"
   "KoZIzj0CAQYIKoZIzj0DAQcDQgAERavZfvwL1X+E4dIF7dbkVMUn4IrJ1CAsFkc8\n"
   "gZxPzn683H40XMKltDZPEwr9ng78w9+QYQg7ygnr2stz8yhh06MkMCIwCwYDVR0P\n"
   "BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMAoGCCqGSM49BAMCA0gAMEUCIF0R\n"
   "r5cb7rEUNtWOvGd05MacrgOABfSoVYvBOK9fP63WAqt5h3BaS123coKSGg84twlq\n"
   "TkO/pV/xEmyZmZdV+HxV/OM=\n"
   "-----END CERTIFICATE-----\n";
   ```

1. [Python 3](https://www.python.org/downloads/) 以降をインストールします。

1. `pip install pyopenssl` を実行し、`pyOpenSSL` をインストールします。

1. `demos/ota/bootloader/utility/codesigner_cert_utility/` パスに、コード署名証明書を .pem 形式でコピーします。証明書ファイルの名前を `aws_ota_codesigner_certificate.pem` に変更します。

1.  `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして `CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` または `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED` を定義します。

1. ソリューションを構築し、エラーなしでビルドされていることを確認します。

1. ターミナルエミュレーターを起動し、次の設定を使用してボードに接続します。
   + ボーレート: 115200
   + データビット: 8
   + パリティ: なし
   + ストップビット: 1

1. ボードからデバッガーを取り外し、ボードでプロジェクトを実行して、Wi-Fi と AWS IoT MQTT メッセージブローカーに接続できることを確認します。

プロジェクトを実行すると、MPLAB X IDE は出力ウィンドウを開きます。**[ICD4]** タブが選択されていることを確認します。次のような出力が表示されます。

```
Bootloader version 00.09.00
[prvBOOT_Init] Watchdog timer initialized.
[prvBOOT_Init] Crypto initialized.

[prvValidateImage] Validating image at Bank : 0
[prvValidateImage] No application image or magic code present at: 0xbd000000
[prvBOOT_ValidateImages] Validation failed for image at 0xbd000000

[prvValidateImage] Validating image at Bank : 1
[prvValidateImage] No application image or magic code present at: 0xbd100000
[prvBOOT_ValidateImages] Validation failed for image at 0xbd100000

[prvBOOT_ValidateImages] Booting default image.


>0 36246 [IP-task] vDHCPProcess: offer ac140a0eip
                                                 1 36297 [IP-task] vDHCPProcess: offer ac140a0eip
                 2 36297 [IP-task]

IP Address: 172.20.10.14
3 36297 [IP-task] Subnet Mask: 255.255.255.240
4 36297 [IP-task] Gateway Address: 172.20.10.1
5 36297 [IP-task] DNS Server Address: 172.20.10.1


6 36299 [OTA] OTA demo version 0.9.2
7 36299 [OTA] Creating MQTT Client...
8 36299 [OTA] Connecting to broker...
9 38673 [OTA] Connected to broker.
10 38793 [OTA Task] [prvSubscribeToJobNotificationTopics] OK: $aws/things/devthingota/jobs/$next/get/accepted
11 38863 [OTA Task] [prvSubscribeToJobNotificationTopics] OK: $aws/things/devthingota/jobs/notify-next
12 38863 [OTA Task] [OTA_CheckForUpdate] Request #0
13 38964 [OTA] [OTA_AgentInit] Ready.
14 38973 [OTA Task] [prvParseJSONbyModel] Extracted parameter [ clientToken: 0:devthingota ]
15 38973 [OTA Task] [prvParseJSONbyModel] parameter not present: execution
16 38973 [OTA Task] [prvParseJSONbyModel] parameter not present: jobId
17 38973 [OTA Task] [prvParseJSONbyModel] parameter not present: jobDocument
18 38973 [OTA Task] [prvParseJSONbyModel] parameter not present: streamname
19 38973 [OTA Task] [prvParseJSONbyModel] parameter not present: files
20 38975 [OTA Task] [prvParseJSONbyModel] parameter not present: filepath
21 38975 [OTA Task] [prvParseJSONbyModel] parameter not present: filesize
22 38975 [OTA Task] [prvParseJSONbyModel] parameter not present: fileid
23 38975 [OTA Task] [prvParseJSONbyModel] parameter not present: certfile
24 38975 [OTA Task] [prvParseJSONbyModel] parameter not present: sig-sha256-ecdsa
25 38975 [OTA Task] [prvParseJobDoc] Ignoring job without ID.
26 38975 [OTA Task] [prvOTA_Close] Context->0x8003b620
27 38975 [OTA Task] [prvPAL_Abort] Abort - OK
28 39964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
29 40964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
30 41964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
31 42964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
32 43964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
33 44964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
34 45964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
35 46964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
36 47964 [OTA] State: Ready  Received: 1   Queued: 1   Processed: 1   Dropped: 0
```

ターミナルエミュレーターは次のようなテキストを表示します。

```
AWS Validate: no valid signature in descr: 0xbd000000
AWS Validate: no valid signature in descr: 0xbd100000


>AWS Launch:  No Map performed. Running directly from address: 0x9d000020?
AWS Launch:  wait for app at: 0x9d000020
WILC1000: Initializing...
0 0 

>[None] Seed for randomizer: 1172751941
1 0 [None] Random numbers: 00004272 00003B34 00000602 00002DE3
Chip ID 1503a0

[spi_cmd_rsp][356][nmi spi]: Failed cmd response read, bus error...

[spi_read_reg][1086][nmi spi]: Failed cmd response, read reg (0000108c)...

[spi_read_reg][1116]Reset and retry 10 108c

Firmware ver. : 4.2.1

Min driver ver : 4.2.1

Curr driver ver: 4.2.1

WILC1000: Initialization successful!

Start Wi-Fi Connection...
Wi-Fi Connected
2 7219 [IP-task] vDHCPProcess: offer c0a804beip
3 7230 [IP-task] vDHCPProcess: offer c0a804beip
4 7230 [IP-task] 

IP Address: 192.168.4.190
5 7230 [IP-task] Subnet Mask: 255.255.240.0
6 7230 [IP-task] Gateway Address: 192.168.0.1
7 7230 [IP-task] DNS Server Address: 208.67.222.222


8 7232 [OTA] OTA demo version 0.9.0
9 7232 [OTA] Creating MQTT Client...
10 7232 [OTA] Connecting to broker...
11 7232 [OTA] Sending command to MQTT task.
12 7232 [MQTT] Received message 10000 from queue.
13 8501 [IP-task] Socket sending wakeup to MQTT task.
14 10207 [MQTT] Received message 0 from queue.
15 10256 [IP-task] Socket sending wakeup to MQTT task.
16 10256 [MQTT] Received message 0 from queue.
17 10256 [MQTT] MQTT Connect was accepted. Connection established.
18 10256 [MQTT] Notifying task.
19 10257 [OTA] Command sent to MQTT task passed.
20 10257 [OTA] Connected to broker.
21 10258 [OTA Task] Sending command to MQTT task.
22 10258 [MQTT] Received message 20000 from queue.
23 10306 [IP-task] Socket sending wakeup to MQTT task.
24 10306 [MQTT] Received message 0 from queue.
25 10306 [MQTT] MQTT Subscribe was accepted. Subscribed.
26 10306 [MQTT] Notifying task.
27 10307 [OTA Task] Command sent to MQTT task passed.
28 10307 [OTA Task] [OTA] Subscribed to topic: $aws/things/Microchip/jobs/$next/get/accepted

29 10307 [OTA Task] Sending command to MQTT task.
30 10307 [MQTT] Received message 30000 from queue.
31 10336 [IP-task] Socket sending wakeup to MQTT task.
32 10336 [MQTT] Received message 0 from queue.
33 10336 [MQTT] MQTT Subscribe was accepted. Subscribed.
34 10336 [MQTT] Notifying task.
35 10336 [OTA Task] Command sent to MQTT task passed.
36 10336 [OTA Task] [OTA] Subscribed to topic: $aws/things/Microchip/jobs/notify-next

37 10336 [OTA Task] [OTA] Check For Update #0
38 10336 [OTA Task] Sending command to MQTT task.
39 10336 [MQTT] Received message 40000 from queue.
40 10366 [IP-task] Socket sending wakeup to MQTT task.
41 10366 [MQTT] Received message 0 from queue.
42 10366 [MQTT] MQTT Publish was successful.
43 10366 [MQTT] Notifying task.
44 10366 [OTA Task] Command sent to MQTT task passed.
45 10376 [IP-task] Socket sending wakeup to MQTT task.
46 10376 [MQTT] Received message 0 from queue.
47 10376 [OTA Task] [OTA] Set job doc parameter [ clientToken: 0:Microchip ]
48 10376 [OTA Task] [OTA] Missing job parameter: execution
49 10376 [OTA Task] [OTA] Missing job parameter: jobId
50 10376 [OTA Task] [OTA] Missing job parameter: jobDocument
51 10378 [OTA Task] [OTA] Missing job parameter: ts_ota
52 10378 [OTA Task] [OTA] Missing job parameter: files
53 10378 [OTA Task] [OTA] Missing job parameter: streamname
54 10378 [OTA Task] [OTA] Missing job parameter: certfile
55 10378 [OTA Task] [OTA] Missing job parameter: filepath
56 10378 [OTA Task] [OTA] Missing job parameter: filesize
57 10378 [OTA Task] [OTA] Missing job parameter: sig-sha256-ecdsa
58 10378 [OTA Task] [OTA] Missing job parameter: fileid
59 10378 [OTA Task] [OTA] Missing job parameter: attr
60 10378 [OTA Task] [OTA] Returned buffer to MQTT Client.
61 11367 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
62 12367 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
63 13367 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
64 14367 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
65 15367 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
66 16367 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
```

この出力は、Microchip Curiosity PIC32MZEF が OTA 更新に必要な MQTT トピックに接続 AWS IoT してサブスクライブできることを示しています。保留中の OTA 更新ジョブがないため、`Missing job parameter` メッセージが必要です。

# Espressif ESP32 での FreeRTOS OTA デモのダウンロード、構築、フラッシュ、実行
<a name="download-ota-esp"></a>

**重要**  <a name="deprecation-message"></a>
このリファレンス統合は、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

1. FreeRTOS のソースを [GitHub](https://github.com/aws/amazon-freertos) からダウンロードしてください。手順については、[README.md](https://github.com/aws/amazon-freertos/blob/main/README.md) ファイルを参照してください。必要なすべてのソースとライブラリを含む IDE でプロジェクトを作成します。

1. 必要な GCC ベースのツールチェーンを設定するには、「[Espressif の開始方法](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html)」の指示に従ってください。

1. `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして `CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` または `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED` を定義します。

1. `vendors/espressif/boards/esp32/aws_demos` ディレクトリで `make` を実行し、デモプロジェクトを構築します。[Espressif の開始方法](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html)で説明されているように、デモプログラムをフラッシュし、`make flash monitor` を実行して出力を検証できます。

1. OTA 更新デモを実行する前に以下を確認してください。
   + `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして `CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` または `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED` を定義します。
   + `vendors/vendor/boards/board/aws_demos/config_files/ota_demo_config.h` を開いて、次の場所にある SHA-256/ECDSA コード署名証明書をコピーします。

     ```
     #define otapalconfigCODE_SIGNING_CERTIFICATE [] = "your-certificate-key";
     ```

# Renesas RX65N での FreeRTOS OTA デモのダウンロード、構築、フラッシュ、および実行
<a name="download-rx65n-ota"></a>

**重要**  <a name="deprecation-message"></a>
このリファレンス統合は、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

この章では、Renesas RX65N で FreeRTOS OTA デモアプリケーションをダウンロード、構築、フラッシュ、および実行する方法について説明します。

**Topics**
+ [オペレーティング環境をセットアップする](#download-rx65n-ota-environment)
+ [AWS リソースをセットアップする](#download-rx65n-ota-setup)
+ [ヘッダーファイルをインポートして設定し、aws\$1demos と boot\$1loader を構築する](#download-rx65n-ota-import-configure)

## オペレーティング環境をセットアップする
<a name="download-rx65n-ota-environment"></a>

このセクションの手順では、次の環境を使用します。
+ **IDE**: e2 studio 7.8.0、e2 studio 2020-07
+ **ツールチェーン**: CCRX Compiler v3.0.1
+ **ターゲットデバイス**: RSKRX65N-2MB
+ **デバッガー**: E2、E2 Lite エミュレータ
+ **ソフトウェア**: Renesas Flash Programmer、Renesas Secure Flash Programmer.exe、Tera Term

**ハードウェアをセットアップするには**

1. E2 Lite エミュレータと USB シリアルポートを RX65N ボードと PC に接続します。

1. 電源を RX65N に接続します。

## AWS リソースをセットアップする
<a name="download-rx65n-ota-setup"></a>

1. FreeRTOS デモを実行するには、 AWS IoT サービスへのアクセス権限を持つ IAM ユーザーの AWS アカウントが必要です。まだの場合は、[AWSアカウントとアクセス許可の設定](freertos-prereqs.md#freertos-account-and-permissions)の手順に従ってください。

1. OTA の更新を設定するには、[OTA 更新の前提条件](ota-prereqs.md)の手順に従います。特に、[MQTT を使用した OTA 更新の前提条件](ota-mqtt-freertos.md) の手順を実行してください。

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/home) を開きます。

1. 左側のナビゲーションペインで、**[Manage]** (管理)、**[Things]** (モノ) の順に選択して、モノを作成します。

   モノとは、 AWS IoTにおける特定のデバイスまたは論理エンティティを表します。物理的なデバイスやセンサー (電球や壁のスイッチなど) は、モノとして扱うことができます。また、アプリケーションのインスタンスのような論理エンティティや AWS IoT、接続しないが接続するデバイスに関連する物理エンティティ (エンジンセンサーやコントロールパネルがある車など) でもかまいません。 は、モノの管理に役立つモノレジストリ AWS IoT を提供します。

   1. **[Create]** (作成)、**[Create a single thing]** (単一のモノを作成する) の順に選択します。

   1. モノの名前を **[Name]** (名前) に入力し、**[Next]** (次へ) を選択します。

   1. [**証明書の作成**] を選択します。

   1. 作成された 3 つのファイルをダウンロードして、**[Activate]** (アクティブ化) を選択します。

   1. [**ポリシーのアタッチ**] を選択します。  
![\[ダウンロードするファイルを表示するコンソール画面\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/download-these-files-rx65n.png)

   1. [デバイスポリシー](ota-mqtt-freertos.md#ota-mqtt-freertos-device-policy)で作成したポリシーを選択します。

      MQTT を使用して OTA 更新を受信する各デバイスは、 にモノとして登録する必要があり AWS IoT 、モノにはリストされているようなポリシーがアタッチされている必要があります。`"Action"` および `"Resource"` オブジェクトの項目の詳細については、[AWS IoT Core ポリシーアクション](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policy-actions.html)と[AWS IoT Core アクションリソース](https://docs.aws.amazon.com/iot/latest/developerguide/iot-action-resources.html)を参照してください。

**注意事項**
      + アクセス`iot:Connect`許可により、デバイスは MQTT AWS IoT 経由で に接続できます。
      +  AWS IoT ジョブ (`.../jobs/*`) のトピックに対する `iot:Subscribe` および `iot:Publish` アクセス許可を使用すると、接続されたデバイスがジョブ通知とジョブドキュメントを受け取り、ジョブ実行の完了状態を公開できます。
      + OTA ストリーム (`.../streams/*`) AWS IoT のトピックに対する `iot:Subscribe`および アクセス`iot:Publish`許可により、接続されたデバイスは OTA 更新データを取得できます AWS IoT。これらのアクセス許可は、MQTT を介してファームウェア更新を実行するために必要です。
      + アクセス`iot:Receive`許可により、 AWS IoT Core はそれらのトピックに関するメッセージを接続されたデバイスに発行できます。このアクセス許可は、MQTT メッセージの配信ごとにチェックされます。このアクセス許可を使用して、トピックに現在サブスクライブしているクライアントへのアクセスを取り消すことができます。

1. コード署名プロファイルを作成し、コード署名証明書を登録するには AWS。

   1. キーと証明書を作成するには、[Renesas MCU ファームウェア更新の設計ポリシー](https://www.renesas.com/us/en/document/apn/renesas-mcu-firmware-update-design-policy)のセクション 7.3「OpenSSL で ECDSA-SHA256 キーペアを生成する」を参照してください。

   1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/home) を開きます。左側のナビゲーションペインで、**[Manage]** (管理)、**[Jobs]** (ジョブ) の順に選択します。**[Create a job]** (ジョブの作成) を選択して、**[Create OTA update Job]** (OTA 更新ジョブの作成) を選択します。

   1. **[Select devices to update]** (更新するデバイスの選択) で、**[Select]** (選択) を選択して作成済みのモノを選択します。**[次へ]** を選択してください。

   1. **[Create a FreeRTOS OTA update job]** (FreeRTOS OTA 更新ジョブの作成) ページで、次の手順を実行します。

      1. **[Select the protocol for firmware image transfer]** (ファームウェアイメージ転送プロトコルを選択) で、**[MQTT]** を選択します。

      1. **[Select and sign your firmware image]** (ファームウェアイメージの選択と署名) で、**[Sign a new firmware image for me]** (新しいファームウェアイメージに署名します) を選択します。

      1. **[Code signing profile]** (コード署名プロファイル) で、**[Create]** (作成) を選択します。

      1. **[Create a code signing profile]** (コード署名プロファイルの作成) ウィンドウで、**[Profile name]** (プロファイル名) を入力します。**[Device hardware platform]** (デバイスハードウェアプラットフォーム) で、**[Windows Simulator]** を選択します。**[Code signing certificate]** (コード署名証明書) で、**[Import]** (インポート) を選択します。

      1. 証明書 (`secp256r1.crt`)、証明書のプライベートキー (`secp256r1.key`)、証明書チェーン (`ca.crt`) を参照して選択します。

      1. **[Pathname of code signing certificate on device]** (デバイスのコード署名証明書のパス名) を入力します。次に **[作成]** を選択します。

1. のコード署名へのアクセスを許可するには AWS IoT、「」の手順に従います[のコード署名へのアクセス権を付与する AWS IoT](code-sign-policy.md)。

Tera Term が PC にインストールされていない場合は、以下のとおり [https://ttssh2.osdn.jp/index.html.en](https://ttssh2.osdn.jp/index.html.en) からダウンロードしてセットアップできます。USB シリアルポートがデバイスから PC に差し込まれていることを確認します。

![\[Tera Term シリアルポート設定ウィンドウ\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/tera-team-rx65n.png)


## ヘッダーファイルをインポートして設定し、aws\$1demos と boot\$1loader を構築する
<a name="download-rx65n-ota-import-configure"></a>

まず、FreeRTOS パッケージの最新バージョンを選択すると、GitHub からこれがダウンロードされ、プロジェクトに自動的にインポートされます。このようにして、FreeRTOS の設定とアプリケーションコードの記述に集中できます。

1. e2 studio を起動します。

1. **[File]** (ファイル) を選択して、**[Import...]** (インポート...) を選択します。

1. **[Renesas GitHub FreeRTOS (with IoT libraries) Project]** (Renesas GitHub FreeRTOS (IoT ライブラリ) プロジェクト) を選択します。  
![\[e-squared studio インポートウィンドウ\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/import-renesas-project-rx65n.png)

1. **[Check for more version...]** (他のバージョンを確認する...) を選択して、ダウンロードダイアログボックスを表示します。  
![\[e-squared studio ダウンロードダイアログウィンドウ\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/check-more-version-rx65n.png)

1. 最新のパッケージを選択します。  
![\[e-squared studio モジュールのダウンロードダイアログウィンドウ\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/choose-latest-version-rx65n.png)

1. **[Agree]** (同意する) を選択して、エンドユーザー使用許諾契約に同意します。  
![\[e-squared studio EULA ダイアログ\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/eula-rx65n.png)

1. ダウンロードが完了するまで待ちます。  
![\[ダウンロードの進行状況バー\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/downloading-rx65n.png)

1. **aws\$1demos** と **boot\$1loader** プロジェクトを選択し、**[Finish]** (完了) を選択してインポートします。  
![\[プロジェクトインポートウィンドウ\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/import-projects-rx65n.png)

1. 両方のプロジェクトで、プロジェクトプロパティを開きます。ナビゲーションペインで **[Tool Chain Editor]** (ツールチェーンエディタ) を選択します。

   1. **[Current toolchain]** (現在のツールチェーン) を選択します。

   1. **[Current builder]** (現在のビルダー) を選択します。  
![\[e-squared studio プロパティウィンドウ\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/project-properties-rx65n.png)

1. ナビゲーションペインで **[設定]** を選択します。**[Toolchain]** (ツールチェーン) タブで、ツールチェーンの **[Version]** (バージョン) を選択します。  
![\[Renesas CCRX バージョン v3.01.00 のツールチェーン統合設定で、ツールチェーン変更オプションが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/project-properties-toolchain-rx65n.png)

   **[Tool Settings]** (ツール設定) タブを選択して、**[Converter]** (コンバーター) を展開し、**[Output]** (出力) を選択します。メインウィンドウで **[Output hex file]** (16 進数ファイルの出力) が選択されていることを確認し、**[Output file type]** (出力ファイルタイプ) を選びます。  
![\[C/C++ ビルド設定ウィンドウで、出力 16 進数ファイル、出力ファイルタイプ、出力ディレクトリ、ファイル分割オプションなどのコンパイラとリンカーのオプションが表示されます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/project-properties-settings-rx65n.png)  
![\[インターフェイス設定ツリーで、スタック分析、ツールチェーンエディタ、C/C++ 全般、MCU、プロジェクトリファレンスなどのオプションが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/project-properties-settings-2-rx65n.png)

1. bootloader プロジェクトで、`projects\renesas\rx65n-rsk\e2studio\boot_loader\src\key\code_signer_public_key.h` を開き、パブリックキーを入力します。パブリックキーの作成方法については、[Amazon Web Services を使用して RX65N で FreeRTOS OTA を実装する方法](https://www.renesas.com/us/en/document/apn/rx-family-how-implement-freertos-ota-using-amazon-web-services-rx65n)と [Renesas MCU ファームウェア更新の設計ポリシー](https://www.renesas.com/us/en/document/apn/renesas-mcu-firmware-update-design-policy)のセクション 7.3「OpenSSL で ECDSA-SHA256 キーペアを生成する」を参照してください。  
![\[C ヘッダーファイルを示す Code Editor で、CODE_SIGNER_PUBLIC_KEY と PEM エンコードされたコードの署名者のパブリックキー変数の定義が含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/open-bootloader-project-rx65n.png)

   次にプロジェクトを構築して、`boot_loader.mot` を作成します。

1. `aws_demos` プロジェクトを開きます。

   1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/home) を開きます。

   1. 左のナビゲーションペインの [**Settings**] (設定) を選択します。**[Device data endpoint]** (デバイスデータエンドポイント) テキストボックスのカスタムエンドポイントをメモします。

   1. **[Manage]** (管理) を選択して、**[Things]** (モノ) を選択します。ボードの AWS IoT モノの名前を書き留めます。

   1. `aws_demos` プロジェクトで、`demos/include/aws_clientcredential.h` を開き、次の値を指定します。

      ```
      #define clientcredentialMQTT_BROKER_ENDPOINT[] = "Your AWS IoT endpoint";
      #define clientcredentialIOT_THING_NAME "The AWS IoT thing name of your board"
      ```  
![\[AWS IoT モノの名前とブローカーエンドポイントの設定を示すコードスニペット。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/client-credential-rx65n.png)

   1. `tools/certificate_configuration/CertificateConfigurator.html` ファイルを開きます。

   1. ダウンロード済みの証明書 PEM ファイルとプライベートキー PEM ファイルをインポートします。

   1. **[Generate and save aws\$1clientcredential\$1keys.h]** (aws\$1clientcredential\$1keys.h の生成と保存) を選択して、`demos/include/` ディレクトリのこのファイルを置き換えます。  
![\[証明書設定ツールには、 AWS IoT コンソールからクライアント証明書とプライベートキーの PEM ファイルを提供するフィールドと、aws_clientcredential_keys.h ファイルを生成して保存するボタンがあります。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/certificate-config-tool-rx65n.png)

   1. `vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/ota_demo_config.h` ファイルを開いて、次の値を指定します。

      ```
      #define otapalconfigCODE_SIGNING_CERTIFICATE [] = "your-certificate-key";
      ```

      ここで、*your-certificate-key* はファイル `secp256r1.crt` の値です。証明書の各行の後に必ず「\$1」を追加してください。`secp256r1.crt` ファイルの作成方法については、[Amazon Web Services を使用して RX65N で FreeRTOS OTA を実装する方法](https://www.renesas.com/us/en/document/apn/rx-family-how-implement-freertos-ota-using-amazon-web-services-rx65n)と [Renesas MCU ファームウェア更新の設計ポリシー](https://www.renesas.com/us/en/document/apn/renesas-mcu-firmware-update-design-policy)のセクション 7.3「OpenSSL で ECDSA-SHA256 キーペアを生成する」を参照してください。  
![\[ソースコードファイルで、秘匿化済みの証明書データを含む PEM エンコードされたコードの署名者証明書の定数文字列を定義する C コードを示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/codesigner-cert-rx65n.png)

1. **タスク A: ファームウェアの初期バージョンをインストールする**

   1. `vendors/renesas/boards/board/aws_demos/config_files/aws_demo_config.h` ファイルを開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして、`CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` または `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED` を定義します。

   1. `demos/include/ aws_application_version.h` ファイルを開き、ファームウェアの初期バージョンを `0.9.2` に設定します。  
![\[コードスニペットで、メジャーバージョン番号、マイナーバージョン番号、ビルドバージョン番号のマクロなど、アプリケーションのバージョン定義を示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/firmware-version-rx65n.png)

   1. **[Section Viewer]** (セクションビューワー) で以下の設定を変更します。  
![\[セクションビューワーウィンドウには、メモリアドレス、SU、SI、レジスターなどのセクション名、ネットワークバッファ、例外、アクションボタンなどのインターフェイスコンポーネントが表示されます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/section-viewer-rx65n.png)

   1. **[Build]** (構築) を選択して、`aws_demos.mot` ファイルを作成します。

1. Renesas Secure Flash Programmer を使用してファイル `userprog.mot` を作成します。`userprog.mot` は `aws_demos.mot` と `boot_loader.mot` の組み合わせです。このファイルを RX65N-RSK にフラッシュすると、初期ファームウェアをインストールできます。

   1. [https://github.com/renesas/Amazon-FreeRTOS-Tools](https://github.com/renesas/Amazon-FreeRTOS-Tools) をダウンロードして、`Renesas Secure Flash Programmer.exe` を開きます。

   1. **[Initial Firm]** (初期ファーム) タブを選択し、以下のパラメータを設定します。
      + **[Private Key Path]** (プライベートキーのパス): `secp256r1.privatekey` の場所。
      + **[Boot Loader File Path]** (ブートローダーファイルパス): `boot_loader.mot` の場所 (`projects\renesas\rx65n-rsk\e2studio\boot_loader\HardwareDebug`)。
      + **[File Path]** (ファイルパス): `aws_demos.mot` の場所 (`projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug`)。  
![\[Renesas Secure Flash Programmer ウィンドウで、MCU、ファームウェア検証、シーケンス番号、AES キーパス、ファイルパスフィールドが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/secure-flash-rx65n.png)

   1. `init_firmware` という名前のディレクトリを作成し、`userprog.mot` を生成して `init_firmware` ディレクトリに保存します。生成が成功したことを確認します。

1. RX65N-RSK で初期ファームウェアをフラッシュします。

   1. Renesas Flash Programmer (プログラミング GUI) の最新バージョンを [https://www.renesas.com/tw/en/products/software-tools/tools/programmer/renesas-flash-programmer-programming-gui.html](https://www.renesas.com/tw/en/products/software-tools/tools/programmer/renesas-flash-programmer-programming-gui.html) からダウンロードします。

   1. `vendors\renesas\rx_mcu_boards\boards\rx65n-rsk\aws_demos\flash_project\erase_from_bank\ erase.rpj` ファイルを開いて銀行のデータを消去します。

   1. **[Start]** (開始) を選択して、銀行を消去します。  
![\[Renesas Flash Programmer ウィンドウには、RX グループのマイクロコントローラープロジェクトの詳細、ファイルパス、消去、プログラム、開始時に検証ボタンと OK ボタンなどのフラッシュオペレーションオプションが表示されます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/flash-programmer-erasing-rx65n.png)

   1. `userprog.mot` をフラッシュするには、**[Browse...]** (参照...) を選択して `init_firmware` ディレクトリに移動し、`userprog.mot` ファイルを選択して、**[Start]** (開始) を選択します。  
![\[Renesas Flash Programmer ウィンドウには、マイクロコントローラー RX グループ、プログラムファイルを参照するオプション、消去ボタンと開始ボタン、消去対象として選択したブロックのステータスの詳細など、消去オペレーション設定が表示されます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/flash-programmer-complete-rx65n.png)

1. バージョン 0.9.2 (初期バージョン) のファームウェアが RX65N-RSK にインストールされました。RX65N-RSK ボードは OTA 更新をリッスンするようになりました。PC で Tera Term を開いている場合、初期ファームウェアの実行時に次のように表示されます。

   ```
   -------------------------------------------------
   RX65N secure boot program
   -------------------------------------------------
   Checking flash ROM status.
   bank 0 status = 0xff [LIFECYCLE_STATE_BLANK]
   bank 1 status = 0xfc [LIFECYCLE_STATE_INSTALLING]
   bank info = 1. (start bank = 0)
   start installing user program.
   copy secure boot (part1) from bank0 to bank1...OK
   copy secure boot (part2) from bank0 to bank1...OK
   update LIFECYCLE_STATE from [LIFECYCLE_STATE_INSTALLING] to [LIFECYCLE_STATE_VALID]
   bank1(temporary area) block0 erase (to update LIFECYCLE_STATE)...OK
   bank1(temporary area) block0 write (to update LIFECYCLE_STATE)...OK
   swap bank...
   -------------------------------------------------
   RX65N secure boot program
   -------------------------------------------------
   Checking flash ROM status.
   bank 0 status = 0xf8 [LIFECYCLE_STATE_VALID]
   bank 1 status = 0xff [LIFECYCLE_STATE_BLANK]
   bank info = 0. (start bank = 1)
   integrity check scheme = sig-sha256-ecdsa
   bank0(execute area) on code flash integrity check...OK
   jump to user program
   0 1 [ETHER_RECEI] Deferred Interrupt Handler Task started
   1 1 [ETHER_RECEI] Network buffers: 3 lowest 3
   2 1 [ETHER_RECEI] Heap: current 234192 lowest 234192
   3 1 [ETHER_RECEI] Queue space: lowest 8
   4 1 [IP-task] InitializeNetwork returns OK
   5 1 [IP-task] xNetworkInterfaceInitialise returns 0
   6 101 [ETHER_RECEI] Heap: current 234592 lowest 233392
   7 2102 [ETHER_RECEI] prvEMACHandlerTask: PHY LS now 1
   8 3001 [IP-task] xNetworkInterfaceInitialise returns 1
   9 3092 [ETHER_RECEI] Network buffers: 2 lowest 2
   10 3092 [ETHER_RECEI] Queue space: lowest 7
   11 3092 [ETHER_RECEI] Heap: current 233320 lowest 233320
   12 3193 [ETHER_RECEI] Heap: current 233816 lowest 233120
   13 3593 [IP-task] vDHCPProcess: offer c0a80a09ip
   14 3597 [ETHER_RECEI] Heap: current 233200 lowest 233000
   15 3597 [IP-task] vDHCPProcess: offer c0a80a09ip
   16 3597 [IP-task] IP Address: 192.168.10.9
   17 3597 [IP-task] Subnet Mask: 255.255.255.0
   18 3597 [IP-task] Gateway Address: 192.168.10.1
   19 3597 [IP-task] DNS Server Address: 192.168.10.1
   20 3600 [Tmr Svc] The network is up and running
   21 3622 [Tmr Svc] Write certificate...
   22 3697 [ETHER_RECEI] Heap: current 232320 lowest 230904
   23 4497 [ETHER_RECEI] Heap: current 226344 lowest 225944
   24 5317 [iot_thread] [INFO ][DEMO][5317] ---------STARTING DEMO---------
   
   25 5317 [iot_thread] [INFO ][INIT][5317] SDK successfully initialized.
   26 5317 [iot_thread] [INFO ][DEMO][5317] Successfully initialized the demo. Network type for the demo: 4
   27 5317 [iot_thread] [INFO ][MQTT][5317] MQTT library successfully initialized.
   28 5317 [iot_thread] [INFO ][DEMO][5317] OTA demo version 0.9.2
   
   29 5317 [iot_thread] [INFO ][DEMO][5317] Connecting to broker...
   
   30 5317 [iot_thread] [INFO ][DEMO][5317] MQTT demo client identifier is rx65n-gr-rose (length 13).
   31 5325 [ETHER_RECEI] Heap: current 206944 lowest 206504
   32 5325 [ETHER_RECEI] Heap: current 206440 lowest 206440
   33 5325 [ETHER_RECEI] Heap: current 206240 lowest 206240
   38 5334 [ETHER_RECEI] Heap: current 190288 lowest 190288
   39 5334 [ETHER_RECEI] Heap: current 190088 lowest 190088
   40 5361 [ETHER_RECEI] Heap: current 158512 lowest 158168
   41 5363 [ETHER_RECEI] Heap: current 158032 lowest 158032
   42 5364 [ETHER_RECEI] Network buffers: 1 lowest 1
   43 5364 [ETHER_RECEI] Heap: current 156856 lowest 156856
   44 5364 [ETHER_RECEI] Heap: current 156656 lowest 156656
   46 5374 [ETHER_RECEI] Heap: current 153016 lowest 152040
   47 5492 [ETHER_RECEI] Heap: current 141464 lowest 139016
   48 5751 [ETHER_RECEI] Heap: current 140160 lowest 138680
   49 5917 [ETHER_RECEI] Heap: current 138280 lowest 138168
   59 7361 [iot_thread] [INFO ][MQTT][7361] Establishing new MQTT connection.
   62 7428 [iot_thread] [INFO ][MQTT][7428] (MQTT connection 81cfc8, CONNECT operation 81d0e8) Wait complete with result SUCCESS.
   63 7428 [iot_thread] [INFO ][MQTT][7428] New MQTT connection 4e8c established.
   64 7430 [iot_thread] [OTA_AgentInit_internal] OTA Task is Ready.
   65 7430 [OTA Agent T] [prvOTAAgentTask] Called handler. Current State [Ready] Event [Start] New state [RequestingJob]
   66 7431 [OTA Agent T] [INFO ][MQTT][7431] (MQTT connection 81cfc8) SUBSCRIBE operation scheduled.
   67 7431 [OTA Agent T] [INFO ][MQTT][7431] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Waiting for operation completion.
   68 7436 [ETHER_RECEI] Heap: current 128248 lowest 127992
   69 7480 [OTA Agent T] [INFO ][MQTT][7480] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Wait complete with result SUCCESS.
   70 7480 [OTA Agent T] [prvSubscribeToJobNotificationTopics] OK: $aws/things/rx65n-gr-rose/jobs/$next/get/accepted
   71 7481 [OTA Agent T] [INFO ][MQTT][7481] (MQTT connection 81cfc8) SUBSCRIBE operation scheduled.
   72 7481 [OTA Agent T] [INFO ][MQTT][7481] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Waiting for operation completion.
   73 7530 [OTA Agent T] [INFO ][MQTT][7530] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Wait complete with result SUCCESS.
   74 7530 [OTA Agent T] [prvSubscribeToJobNotificationTopics] OK: $aws/things/rx65n-gr-rose/jobs/notify-next
   75 7530 [OTA Agent T] [prvRequestJob_Mqtt] Request #0
   76 7532 [OTA Agent T] [INFO ][MQTT][7532] (MQTT connection 81cfc8) MQTT PUBLISH operation queued.
   77 7532 [OTA Agent T] [INFO ][MQTT][7532] (MQTT connection 81cfc8, PUBLISH operation 818b80) Waiting for operation completion.
   78 7552 [OTA Agent T] [INFO ][MQTT][7552] (MQTT connection 81cfc8, PUBLISH operation 818b80) Wait complete with result SUCCESS.
   79 7552 [OTA Agent T] [prvOTAAgentTask] Called handler. Current State [RequestingJob] Event [RequestJobDocument] New state [WaitingForJob]
   80 7552 [OTA Agent T] [prvParseJSONbyModel] Extracted parameter [ clientToken: 0:rx65n-gr-rose ]
   81 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: execution
   82 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: jobId
   83 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: jobDocument
   84 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: afr_ota
   85 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: protocols
   86 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: files
   87 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: filepath
   99 7651 [ETHER_RECEI] Heap: current 129720 lowest 127304
   100 8430 [iot_thread] [INFO ][DEMO][8430] State: Ready  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   101 9430 [iot_thread] [INFO ][DEMO][9430] State: WaitingForJob  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   102 10430 [iot_thread] [INFO ][DEMO][10430] State: WaitingForJob  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   103 11430 [iot_thread] [INFO ][DEMO][11430] State: WaitingForJob  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   104 12430 [iot_thread] [INFO ][DEMO][12430] State: WaitingForJob  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   105 13430 [iot_thread] [INFO ][DEMO][13430] State: WaitingForJob  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   106 14430 [iot_thread] [INFO ][DEMO][14430] State: WaitingForJob  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   107 15430 [iot_thread] [INFO ][DEMO][15430] State: WaitingForJob  Received: 1   Queued: 0   Processed: 0   Dropped: 0
   ```

1. **タスク B: ファームウェアのバージョンを更新する**

   1. `demos/include/aws_application_version.h` ファイルを開き、`APP_VERSION_BUILD` トークン値を `0.9.3` に増やします。

   1. プロジェクトを再構築します。

1. Renesas Secure Flash Programmer で `userprog.rsu` ファイルを作成し、ファームウェアのバージョンを更新します。

   1. `Amazon-FreeRTOS-Tools\Renesas Secure Flash Programmer.exe` ファイルを開きます。

   1. **[Update Firm]** (ファームの更新) タブを選択し、以下のパラメータを設定します。
      + **[File Path]** (ファイルパス): `aws_demos.mot` ファイルの場所 (`projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug`)。

   1. `update _firmware` という名前のディレクトリを作成します。`userprog.rsu` を生成して、`update_firmware` ディレクトリに保存します。生成が成功したことを確認します。  
![\[Renesas Secure Flash Programmer ウィンドウには、MCU 選択、ファームウェア検証タイプ、シーケンス番号、AES MAC キーフィールド、セキュアファームウェアを生成するためのファイルパス入力が表示されます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/update-firmware-rx65n.png)

1. [更新を保存する Amazon S3 バケットを作成する](dg-ota-bucket.md) のとおり、ファームウェア更新 `userproj.rsu` を Amazon S3 バケットに更新します。  
![\[Amazon S3 バケット管理インターフェイスで、フォルダ、アップロード、バージョン、権限オプションがあります。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/upload-firmware-rx65n.png)

1. RX65N-RSK でファームウェアを更新するジョブを作成します。

   AWS IoT ジョブは、1 つ以上の接続されたデバイスに保留中の[ジョブ](https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html)を通知するサービスです。ジョブは、多数のデバイスの管理、デバイス上のファームウェアおよびセキュリティ証明書の更新、デバイスの再起動や診断の実行などの管理タスクの実行に使用できます。

   1. [AWS IoT コンソール](https://console.aws.amazon.com/iotv2/) にサインインします。ナビゲーションペインで、**[Manage]** (管理)、**[Jobs]** (ジョブ) の順に選択します。

   1. **[Create a job]** (ジョブの作成) を選択して、**[Create OTA Update job]** (OTA 更新ジョブの作成) を選択します。モノを選択して、**[Next]** (次へ) を選択します。

   1. FreeRTOS OTA 更新ジョブを次のように作成します。
      + **[MQTT]** を選択します。
      + 前のセクションで作成したコード署名プロファイルを選択します。
      + Amazon S3 バケットにアップロードしたファームウェアイメージを選択します。
      + **[Pathname of firmware image on device]** (デバイスのファームウェアイメージのパス名) で、**test** と入力します。
      + 前のセクションで作成した IAM ロールを選択します。

   1. [**次へ**] を選択します。  
![\[ファームウェアイメージの署名と OTA 更新設定には、新しいファームウェアの署名、以前に署名されたファームウェアの選択、カスタム署名されたファームウェアの使用、コード署名プロファイルの指定、ファームウェアイメージファイル、デバイスのパス、OTA 更新ジョブの IAM ロールのオプションがあります。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/create-job-next-rx65n.png)

   1. ID を入力して、**[Create]** (作成) を選択します。

1. Tera Term を再度開いて、ファームウェアが OTA デモバージョン 0.9.3 に正常に更新されたことを確認します。  
![\[コマンドライン出力で、スレッドの初期化とブローカーへの接続を示します。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/update-successful-rx65n.png)

1.  AWS IoT コンソールで、ジョブのステータスが**成功**であることを確認します。  
![\[AFR OTA-demo テストジョブ概要: 1 つリソースが正常に完了しました。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/completed-succeeded-rx65n.png)

# チュートリアル: FreeRTOS Bluetooth Low Energy を使用した Espressif ESP32 での OTA 更新の実行
<a name="ota-updates-esp32-ble"></a>

**重要**  <a name="deprecation-message"></a>
このリファレンス統合は、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

このチュートリアルでは、Android デバイスの MQTT Bluetooth Low Energy プロキシに接続されている Espressif ESP32 マイクロコントローラーを更新する方法について示します。 AWS IoT Over-the-air (OTA) 更新ジョブを使用してデバイスを更新します。デバイスは、Android デモアプリに入力された Amazon Cognito 認証情報 AWS IoT を使用して に接続します。認可されたオペレータがクラウドから OTA 更新を開始します。デバイスが Android デモアプリを介して接続すると、OTA 更新が開始され、デバイスのファームウェアが更新されます。

FreeRTOS バージョン 2019.06.00 以降メジャーには、Wi-Fi プロビジョニングと AWS IoT サービスへの安全な接続に使用できる Bluetooth Low Energy MQTT プロキシサポートが含まれています。Bluetooth Low Energy 機能を使用すると、Wi-Fi を必要とせずにモバイルデバイスとペアリングして接続できる低電力デバイスを構築できます。デバイスは、汎用アクセスプロファイル (GAP) と汎用属性 (GATT) プロファイルを使用する Android または iOS の Bluetooth Low Energy SDK を介して接続することにより、MQTT を使用して通信できます。

Bluetooth Low Energy 経由の OTA 更新を許可するステップは次のとおりです。

1. **ストレージを設定する: **Amazon S3 バケットとポリシーを作成し、更新を実行できるユーザーを設定します。

1. **コード署名証明書を作成する: **署名証明書を作成し、ユーザーによるファームウェアの更新の署名を許可します。

1. **Amazon Cognito 認証を設定する: **認証情報プロバイダー、ユーザープール、およびユーザープールへのアプリケーションアクセスを作成します。

1. **FreeRTOS を設定する: **Bluetooth Low Energy、クライアント認証情報、およびコード署名パブリック証明書を設定します。

1. **Android アプリを設定する: **認証情報プロバイダー、ユーザープールを設定し、アプリケーションを Android デバイスにデプロイします。

1. **OTA 更新スクリプトを実行する: **OTA 更新を開始するには、OTA 更新スクリプトを使用します。

更新の仕組みについては、「[FreeRTOS 無線通信経由更新](freertos-ota-dev.md)」を参照してください。Bluetooth Low Energy MQTT プロキシ機能のセットアップ方法の詳細については、次の記事を参照してください: [Espressif ESP32 での FreeRTOS Bluetooth Low Energy の使用](https://aws.amazon.com/blogs/iot/using-bluetooth-low-energy-with-amazon-freertos-on-espressif-esp32/) (執筆者 Richard Kang)。

## 前提条件
<a name="ota-updates-esp32-ble-prereq"></a>

このチュートリアルのステップを実行するには、以下のリソースを持っている必要があります。
+ ESP32 開発ボード。
+ MicroUSB to USB A ケーブル 1 本。
+  AWS アカウント (無料利用枠で十分）。
+ Android v 6.0 以降と Bluetooth バージョン 4.2 以降を搭載した Android 携帯電話。

開発用コンピュータには、次のものが必要です。
+ Xtensa ツールチェーンと FreeRTOS のソースコードと例のための十分なディスク容量 (約 500 Mb)。
+ インストール済みの Android Studio。
+ インストール済みの [AWS CLI](https://aws.amazon.com/cli/)。
+ インストール済みの Python3。
+ [Python 用 boto3 AWS Software Developer Kit (SDK)](https://github.com/boto/boto3)。

このチュートリアルのステップは、Xtensa ツールチェーン、ESP-IDF、および FreeRTOS コードがホームディレクトリ内の `/esp` ディレクトリにインストールされていることを前提としています。`~/esp/xtensa-esp32-elf/bin` を `$PATH` 変数に追加する必要があります。

## ステップ 1: ストレージを設定する
<a name="ota-updates-esp32-ble-step1"></a>

1. ファームウェアイメージを保持するためにバージョニングを有効にしている [更新を保存する Amazon S3 バケットを作成する](dg-ota-bucket.md)。

1. [OTA 更新サービスロールを作成する](create-service-role.md)、および次の管理ポリシーをロールに追加します。
   + AWSIotLogging
   + AWSIoTRuleActions
   + AWSIoTThingsRegistration
   + AWSFreeRTOSOTAUpdate

1. OTA 更新を実行できる[ユーザーを作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)します。このユーザーは、アカウント内の IoT デバイスに対するファームウェアアップデートに署名して、それをデプロイできるほか、すべてのデバイスで OTA 更新を実行するためのアクセス権を持っています。アクセスは信頼できるエンティティに限定する必要があります。

1. 「[OTA ユーザーポリシーの作成](create-ota-user-policy.md)」のステップを実行し、そのポリシーをユーザーにアタッチします。

## ステップ 2: コード署名証明書を作成する
<a name="ota-updates-esp32-ble-step2"></a>

1. ファームウェアイメージを保持するために、バージョニングを有効にした Amazon S3 バケットを作成します。

1. ファームウェアの署名に使用できるコード署名証明書を作成します。証明書をインポートするときに、証明書の Amazon リソースネーム (ARN) を書き留めます。

   ```
   aws acm import-certificate --profile=ota-update-user --certificate file://ecdsasigner.crt --private-key file://ecdsasigner.key
   ```

   出力例:

   ```
   {
   "CertificateArn": "arn:aws:acm:us-east-1:<account>:certificate/<certid>"
   }
   ```

   ARN は、後で署名プロファイルを作成するために使用します。必要に応じて、次のコマンドを使用してプロファイルを作成できます。

   ```
   aws signer put-signing-profile --profile=ota-update-user --profile-name esp32Profile --signing-material certificateArn=arn:aws:acm:us-east-1:account:certificate/certid --platform AmazonFreeRTOS-Default --signing-parameters certname=/cert.pem
   ```

   出力例:

   ```
   {
   "arn": "arn:aws:signer::<account>:/signing-profiles/esp32Profile"
   }
   ```

## ステップ 3: Amazon Cognito 認証の設定
<a name="ota-updates-esp32-ble-step3"></a>

**AWS IoT ポリシーを作成する**

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/) にサインインします。

1. コンソールの右上隅で、**[My Account]** (マイアカウント) を選択します。**[Account Settings]** (アカウント設定) で、12 桁のアカウント ID を書き留めます。

1. 左側のナビゲーションペインで **[設定]** を選択します。**[Device data endpoint]** (デバイスデータエンドポイント) で、エンドポイントの値を書き留めます。エンドポイントは、`xxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com` のようになります。この例では、 AWS リージョンは「us-west-2」です。

1. 左のナビゲーションペインで **[Secure]** (安全性) を選択し、**[Policies]** (ポリシー) を選択してから **[Create]** (作成) を選択します。アカウントにポリシーがない場合は、「You don’t have any policies yet (まだポリシーがありません)」というメッセージが表示され、**[Create a policy]** (ポリシーの作成) を選択できます。

1. ポリシーの名前を入力します。例えば、「esp32\$1mqtt\$1proxy\$1iot\$1policy」などです。

1. **[Add statements]** (ステートメントを追加) セクションで、**[Advanced mode]** (アドバンストモード) を選択します。次の JSON をポリシーエディタウィンドウにコピーして貼り付けます。`aws-account-id` を自分のアカウント ID に、`aws-region` を自分のリージョン ([us-west-2] など) に置き換えます。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:Connect",
               "Resource": "arn:aws:iot:us-east-1:123456789012:*"
           },
           {
               "Effect": "Allow",
               "Action": "iot:Publish",
               "Resource": "arn:aws:iot:us-east-1:123456789012:*"
           },
           {
               "Effect": "Allow",
               "Action": "iot:Subscribe",
               "Resource": "arn:aws:iot:us-east-1:123456789012:*"
           },
           {
               "Effect": "Allow",
               "Action": "iot:Receive",
               "Resource": "arn:aws:iot:us-east-1:123456789012:*"
           }
       ]
   }
   ```

------

1. **[作成]** を選択します。

**AWS IoT モノを作成する**

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/) にサインインします。

1. 左側のナビゲーションペインで、[**管理**]、[**モノ**] の順に選択します。

1. 右上隅の **[Create]** (作成) を選択します。アカウントにモノが登録されていない場合は、「You don’t have any things yet (まだモノがありません)」というメッセージが表示され、**[Register a thing]** (モノの登録) を選択できます。

1. ** AWS IoT モノの作成**ページで、**モノを 1 つ**作成する を選択します。

1. **[Add your device to the thing registry]** (Thing Registry にデバイスを追加) ページで、モノの名前 ([esp32-ble] など) を入力します。文字には、英数字、ハイフン (-)、とアンダースコア (\$1) のみを使用できます。[**次へ**] を選択します。

1. **[Add a certificate for your thing]** (モノに証明書を追加) ページの **[Skip certificate and create thing]** (証明書をスキップしてモノを作成) から **[Create thing without certificate]** (証明書なしでモノを作成) を選択します。認証と認可に Amazon Cognito 認証情報を使用する BLE プロキシモバイルアプリケーションを使用しているため、デバイス証明書は必要ありません。

**Amazon Cognito アプリクライアントを作成する**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/users/)にサインインします。

1. 右上のナビゲーションバナーで、**[Create a user pool]** (ユーザープールを作成する) を選択します。

1. プール名を入力します (例えば「esp32\$1mqtt\$1proxy\$1user\$1pool」)。

1. [**Review defaults**] を選択します。

1. **[App Clients]** (アプリクライアント) で、**[Add app client]** (アプリクライアントの追加) を選択してから、**[Add an app client]** (アプリクライアントの追加) を選択します。

1. アプリクライアント名を入力します (例えば「mqtt\$1app\$1client」)。

1. **[Generate client secret]** (クライアントシークレットを生成) が選択されていることを確認します。

1. **[アプリケーションクライアントを作成]** を選択します。

1. [**プールの詳細に戻る**] を選択します。

1. ユーザープールの **[Review]** (確認) ページで、**[Create pool]** (プールの作成) を選択します。[Your user pool was created successfully] (ユーザープールは正常に作成されました) というメッセージが表示されます。プール ID を書き留めます。

1. ナビゲーションペインで、**[App clients]** (アプリクライアント) を選択します。

1. **[Show Details]** (詳細を表示) を選択します。アプリクライアント ID およびアプリクライアントシークレットを書き留めます。

**Amazon Cognito アイデンティティプールを作成する**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/federated)にサインインします。

1. [**Create new identity pool**] を選択します。

1. アイデンティティプールの名前を入力します (例えば「mqtt\$1proxy\$1identity\$1pool」)。

1. **[Authentication providers]** (認証プロバイダー) を展開します。

1. **[Cognito]** タブを選択します。

1. 前のステップで書き留めておいたユーザープール ID とアプリクライアント ID を入力します。

1. **[プールの作成]** を選択します。

1. 次のページで、認証されたアイデンティティおよび 認証されていないアイデンティティの新しいロールを作成するために、**[Allow]** (許可) を選択します。

1. アイデンティティプールの ID を書き留めます。形式は `us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` です。

**認証されたアイデンティティに IAM ポリシーをアタッチします。**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/federated)を開きます。

1. 今しがた作成したアイデンティティプールを選択します (例えば「mqtt\$1proxy\$1identity\$1pool」)。

1. [**Edit identity pool**] (ID プールの編集) をクリックします。

1. 認証されたロールに割り当てられた IAM ロールを書き留めます (例えば「Cognito\$1mqtt\$1proxy\$1identity\$1poolAuth\$1Role」)。

1. [IAM コンソール](https://console.aws.amazon.com/iam/home)を開きます。

1. ナビゲーションペインで **[ロール]** を選択します。

1. 割り当てられたロール (例えば「Cognito\$1mqtt\$1proxy\$1identity\$1poolAuth\$1Role」) を検索して選択します。

1. **[Add inline policy]** (インラインポリシーの追加) を選択し、次に **[JSON]** を選択します。

1. 以下のポリシーを入力します。

------
#### [ JSON ]

****  

   ```
   {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
          {
             "Effect": "Allow",
             "Action": [
                "iot:AttachPolicy",
                "iot:AttachPrincipalPolicy",
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe"
             ],
             "Resource": "*"
          }]
       }
   ```

------

1. **ポリシーのレビュー** を選択します。

1. ポリシー名を入力します (例えば「mqttProxyCognitoPolicy」)。

1. [**Create policy**] (ポリシーの作成) を選択します。

## ステップ 4: Amazon FreeRTOS を設定する
<a name="ota-updates-esp32-ble-step4"></a>

1. [FreeRTOS GitHub リポジトリ](https://github.com/aws/amazon-freertos)から、最新バージョンの Amazon FreeRTOS コードをダウンロードします。

1. OTA アップデートのデモを有効にするには、[Espressif ESP32-DevKitC と ESP-WROVER-KIT の開始方法](getting_started_espressif.md) のステップに従います。

1. 次のファイルで、これらの追加変更を行います。

   1. `vendors/espressif/boards/esp32/aws_demos/config_files/aws_demo_config.h` を開き、`CONFIG_OTA_UPDATE_DEMO_ENABLED` を定義します。

   1. `vendors/espressif/boards/esp32/aws_demos/common/config_files/aws_demo_config.h` を開き、`democonfigNETWORK_TYPES` を `AWSIOT_NETWORK_TYPE_BLE` に変更します。

   1. `demos/include/aws_clientcredential.h` を開き、`clientcredentialMQTT_BROKER_ENDPOINT` のエンドポイント URL を入力します。

      `clientcredentialIOT_THING_NAME` のモノの名前を入力します (例えば「esp32-ble」)。Amazon Cognito 認証情報を使用する場合、証明書を追加する必要はありません。

   1. `vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h` を開き、`configSUPPORTED_NETWORKS` と `configENABLED_NETWORKS` を変更して `AWSIOT_NETWORK_TYPE_BLE` のみを含めるようにします。

   1. `vendors/vendor/boards/board/aws_demos/config_files/ota_demo_config.h` ファイルを開き、証明書を入力します。

      ```
      #define otapalconfigCODE_SIGNING_CERTIFICATE [] = "your-certificate-key";
      ```

   アプリケーションが起動し、次のデモ版を出力します。

   ```
   11 13498 [iot_thread] [INFO ][DEMO][134980] Successfully initialized the demo. Network type for the demo: 2
   12 13498 [iot_thread] [INFO ][MQTT][134980] MQTT library successfully initialized.
   13 13498 [iot_thread] OTA demo version 0.9.20
   14 13498 [iot_thread] Creating MQTT Client...
   ```

## ステップ 5: Android アプリケーションを設定する
<a name="ota-updates-esp32-ble-step5"></a>

1. Android Bluetooth Low Energy SDK とサンプルアプリケーションを [amazon-freertos-ble-android-sdk](https://github.com/aws/amazon-freertos-ble-android-sdk) GitHub レポからダウンロードします。

1. ファイル `app/src/main/res/raw/awsconfiguration.json` を開き、次の JSON サンプルの手順を使用して、Pool Id (プール ID)、Region (リージョン)、AppClientID (アプリクライアント ID)、および AppClientSecret (アプリクライアントシークレット) を入力します。

   ```
   {
     "UserAgent": "MobileHub/1.0",
     "Version": "1.0",
     "CredentialsProvider": {
       "CognitoIdentity": {
         "Default": {
           "PoolId": "Cognito->Manage Identity Pools->Federated Identities->mqtt_proxy_identity_pool->Edit Identity Pool->Identity Pool ID",
           "Region": "Your region (for example us-east-1)"
         }
       }
     },
   
     "IdentityManager": {
       "Default": {}
     },
   
     "CognitoUserPool": {
       "Default": {
         "PoolId": "Cognito-> Manage User Pools -> esp32_mqtt_proxy_user_pool -> General Settings -> PoolId",
         "AppClientId": "Cognito-> Manage User Pools -> esp32_mqtt_proxy_user_pool -> General Settings -> App clients ->Show Details",
         "AppClientSecret": "Cognito-> Manage User Pools -> esp32_mqtt_proxy_user_pool -> General Settings -> App clients ->Show Details",
         "Region": "Your region (for example us-east-1)"
       }
     }
   }
   ```

1. `app/src/main/java/software/amazon/freertos/DemoConstants.java` を開き、前もって作成したポリシー名 (例: *esp32\$1mqtt\$1proxy\$1iot\$1policy*) とリージョン (例: *us-east-1*)) を入力します。

1. デモアプリケーションを構築してインストールします。

   1. Android Studio で、**[Build]** (構築) を選択してから **[Make Module app]** (モジュールアプリの作成) を選択します。

   1. **[Run]** (実行) を選択して ** [Run app]** (アプリケーションを実行) を選択します。Android Studio の logcat ウィンドウペインに移動して、ログメッセージをモニタリングできます。

   1. Android デバイスで、ログイン画面からアカウントを作成します。

   1. ユーザーを作成します。ユーザーが既に存在する場合は、認証情報を入力します。

   1. Amazon FreeRTOS デモによるデバイスの位置情報へのアクセスを許可します。

   1. Bluetooth Low Energy デバイスをスキャンします。

   1. 見つかったデバイスのスライダーを **[On]** (オン) にします。

   1. ESP32 のシリアルポートデバッグコンソールで **y** を押します。

   1. **[Pair & Connect]** (ペアリング & 接続) を選択します。

1. 接続が確立されると、**[More...]** (詳細...) リンクがアクティブになります。接続が完了すると、次のように Android デバイスの logcat で接続状態が「BLE\$1CONNECTED」に変更されます。

   ```
   2019-06-06 20:11:32.160 23484-23497/software.amazon.freertos.demo I/FRD: BLE connection state changed: 0; new state: BLE_CONNECTED
   ```

1. メッセージを送信する前に、Amazon FreeRTOS デバイスと Android デバイスが MTU をネゴシエートします。logcat に次のような出力が表示されます。

   ```
   2019-06-06 20:11:46.720 23484-23497/software.amazon.freertos.demo I/FRD: onMTUChanged : 512 status: Success
   ```

1. デバイスがアプリケーションに接続し、MQTT プロキシを使用して MQTT メッセージの送信を開始します。デバイスが通信できることを確認するには、MQTT\$1CONTROL の特性データ値が次のように 01 に変更されていることを確認します。

   ```
   2019-06-06 20:12:28.752 23484-23496/software.amazon.freertos.demo D/FRD: <-<-<- Writing to characteristic: MQTT_CONTROL with data: 01
   2019-06-06 20:12:28.839 23484-23496/software.amazon.freertos.demo D/FRD: onCharacteristicWrite for: MQTT_CONTROL; status: Success; value: 01
   ```

1. デバイスがペアリングされると、ESP32 コンソールにプロンプトが表示されます。BLE を有効にするには、**y** を押します。このステップを実行するまで、デモは機能しません。

   ```
   E (135538) BT_GATT: GATT_INSUF_AUTHENTICATION: MITM Required
   W (135638) BT_L2CAP: l2cble_start_conn_update, the last connection update command still pending.
   E (135908) BT_SMP: Value for numeric comparison = 391840
   15 13588 [InputTask] Numeric comparison:391840
   16 13589 [InputTask] Press 'y' to confirm
   17 14078 [InputTask] Key accepted
   W (146348) BT_SMP: FOR LE SC LTK IS USED INSTEAD OF STK
   18 16298 [iot_thread] Connecting to broker...
   19 16298 [iot_thread] [INFO ][MQTT][162980] Establishing new MQTT connection.
   20 16298 [iot_thread] [INFO ][MQTT][162980] (MQTT connection 0x3ffd5754, CONNECT operation 0x3ffd586c) Waiting for operation completion.
   21 16446 [iot_thread] [INFO ][MQTT][164450] (MQTT connection 0x3ffd5754, CONNECT operation 0x3ffd586c) Wait complete with result SUCCESS.
   22 16446 [iot_thread] [INFO ][MQTT][164460] New MQTT connection 0x3ffc0ccc established.
   23 16446 [iot_thread] Connected to broker.
   ```

## ステップ 6: OTA 更新スクリプトを実行する
<a name="ota-updates-esp32-ble-step6"></a>

1. 前提条件をインストールするには、次のコマンドを実行します。

   ```
   pip3 install boto3
   ```

   ```
   pip3 install pathlib
   ```

1. FreeRTOS アプリケーションバージョンを `demos/include/aws_application_version.h` にインクリメントします。

1. 新しい .bin ファイルを構築します。

1. Python スクリプト [start\$1ota.py](https://github.com/aws-samples/amazon-freertos-ota-scripts/blob/master/scripts/start_ota.py) をダウンロードします。スクリプトのヘルプの内容を表示するには、ターミナルウィンドウで次のコマンドを実行します。

   ```
   python3 start_ota.py -h
   ```

   次のようなものが表示されます。

   ```
   usage: start_ota.py [-h] --profile PROFILE [--region REGION]
                       [--account ACCOUNT] [--devicetype DEVICETYPE] --name NAME
                       --role ROLE --s3bucket S3BUCKET --otasigningprofile
                       OTASIGNINGPROFILE --signingcertificateid
                       SIGNINGCERTIFICATEID [--codelocation CODELOCATION]
   Script to start OTA update
   optional arguments:
   -h, --help            show this help message and exit
   --profile PROFILE     Profile name created using aws configure
   --region REGION       Region
   --account ACCOUNT     Account ID
   --devicetype DEVICETYPE thing|group
   --name NAME           Name of thing/group
   --role ROLE           Role for OTA updates
   --s3bucket S3BUCKET   S3 bucket to store firmware updates
   --otasigningprofile OTASIGNINGPROFILE
                         Signing profile to be created or used
   --signingcertificateid SIGNINGCERTIFICATEID
                         certificate id (not arn) to be used
   --codelocation CODELOCATION
                         base folder location (can be relative)
   ```

1. 提供された CloudFormation テンプレートを使用してリソースを作成した場合は、次のコマンドを実行します。

   ```
   python3 start_ota_stream.py --profile otausercf --name esp32-ble --role ota_ble_iot_role-sample --s3bucket afr-ble-ota-update-bucket-sample --otasigningprofile abcd --signingcertificateid certificateid
   ```

   ESP32 デバッグコンソールで更新がスタートします。

   ```
   38 2462 [OTA Task] [prvParseJobDoc] Job was accepted. Attempting to start transfer.
   ---
   49 2867 [OTA Task] [prvIngestDataBlock] Received file block 1, size 1024
   50 2867 [OTA Task] [prvIngestDataBlock] Remaining: 1290
   51 2894 [OTA Task] [prvIngestDataBlock] Received file block 2, size 1024
   52 2894 [OTA Task] [prvIngestDataBlock] Remaining: 1289
   53 2921 [OTA Task] [prvIngestDataBlock] Received file block 3, size 1024
   54 2921 [OTA Task] [prvIngestDataBlock] Remaining: 1288
   55 2952 [OTA Task] [prvIngestDataBlock] Received file block 4, size 1024
   56 2953 [OTA Task] [prvIngestDataBlock] Remaining: 1287
   57 2959 [iot_thread] State: Active  Received: 5   Queued: 5   Processed: 5   Dropped: 0
   ```

1. OTA 更新が完了すると、OTA 更新プロセスの要求に従ってデバイスが再起動します。次に、更新されたファームウェアを使用した接続が試行されます。アップグレードが成功すると、次のように更新されたファームウェアがアクティブとしてマークされ、コンソールに更新されたバージョンが表示されます。

   ```
   13 13498 [iot_thread] OTA demo version 0.9.21
   ```

# AWS IoT Device Shadow デモアプリケーション
<a name="shadow-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="shadow-demo-introduction"></a>

このデモでは、 AWS IoT Device Shadow ライブラリを使用して [AWS Device Shadow サービス](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)に接続する方法を示します。を使用して MQTT ブローカーへの TLS (相互認証) による AWS IoT MQTT 接続[coreMQTT ライブラリ](coremqtt.md)を確立し、coreJSON AWS ライブラリパーサーを使用して Shadow サービスから受信したシャドウドキュメントを解析します。デモでは、シャドウドキュメントの更新方法やシャドウドキュメントの削除方法など、基本的なシャドウオペレーションについて説明します。また、 AWS IoT Device Shadow サービスから送信されるメッセージ (シャドウ `/update` や `/update/delta` メッセージなど) を処理するために coreMQTT ライブラリを使ってコールバック関数を登録する方法も示します。

このデモは、シャドウドキュメント (状態) の更新要求と更新レスポンスが同じアプリケーションによって行われるため、学習演習としてのみ意図されています。現実的な本番シナリオでは、デバイスが現在接続されていない場合でも、外部アプリケーションによってデバイスの状態の更新がリモートで要求されます。デバイスは、接続時に更新要求を承認します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## 機能
<a name="shadow-demo-functionality"></a>

デモでは、シャドウ `/update` と `/update/delta` コールバックを示す一連の例をループする 1 つのアプリケーションタスクを作成して、リモートデバイスの状態を切り替えます。新しい `desired` 状態のシャドウアップデートを送信し、デバイスが新しい `desired` 状態に応答して `reported` を変更するまで待ちます。さらに、シャドウ `/update` コールバックは、変化するシャドウの状態を出力するために使用されます。このデモでは、MQTT ブローカーへの安全な AWS IoT MQTT 接続も使用し、デバイスシャドウに `powerOn`状態があることを前提としています。

このデモでは以下のオペレーションを実行します。

1. `shadow_demo_helpers.c` のヘルパー関数を使用して MQTT 接続を確立します。

1.  AWS IoT Device Shadow ライブラリで定義されたマクロを使用して、デバイスシャドウオペレーションの MQTT トピック文字列を組み立てます。

1. デバイスシャドウの削除用に使用する MQTT トピックに公開して、既存のデバイスシャドウを削除します。

1. `shadow_demo_helpers.c` のヘルパー関数を使って、`/update/delta`、`/update/accepted`、`/update/rejected` の MQTT トピックをサブスクライブします。

1. `shadow_demo_helpers.c` のヘルパー関数を使って `powerOn` の望ましい状態を公開します。これにより、デバイスに `/update/delta` メッセージが送信されます。

1. で受信 MQTT メッセージを処理し`prvEventCallback`、Device Shadow ライブラリ () で定義された関数を使用して、メッセージが AWS IoT デバイスシャドウに関連しているかどうかを判断します`Shadow_MatchTopic`。メッセージがデバイスシャドウ `/update/delta` メッセージの場合、メインのデモ関数が 2 つ目のメッセージを発行して、報告された状態を `powerOn` に更新します。`/update/accepted` メッセージを受信した場合、以前更新メッセージで発行されたものと `clientToken` が同じか確認します。これでデモは終了です。

![\[シャドウデモ端末の出力\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/shadow-demo-output.png)


デモはファイル `freertos/demos/device_shadow_for_aws/shadow_demo_main.c` または [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/device_shadow_for_aws/shadow_demo_main.c) で手に入ります。

次のスクリーンショットは、デモが成功したときに予想される出力です。

![\[成功した場合のシャドウデモ端末の出力\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/shadow-demo-screenshot.png)


## AWS IoT MQTT ブローカーに接続する
<a name="shadow-demo-connect-mqtt"></a>

 AWS IoT MQTT ブローカーに接続するには、 `MQTT_Connect()`と同じ方法を使用します[coreMQTT Mutual Authentication デモ](mqtt-demo-ma.md)。

## シャドウキュメントを削除する
<a name="shadow-demo-delete-document"></a>

シャドウドキュメントを削除するには、 AWS IoT Device Shadow ライブラリで定義されたマクロを使用して、空のメッセージ`xPublishToTopic`で を呼び出します。これは `MQTT_Publish` を使用して `/delete` トピックに公開します。次のコードセクションでは、これを `prvShadowDemoTask` 関数で実行する方法を示します。

```
/* First of all, try to delete any Shadow document in the cloud. */
returnStatus = PublishToTopic( SHADOW_TOPIC_STRING_DELETE( THING_NAME ),
                               SHADOW_TOPIC_LENGTH_DELETE( THING_NAME_LENGTH ),
                               pcUpdateDocument,
                               0U );
```

## シャドウトピックをサブスクライブする
<a name="shadow-demo-subscribe"></a>

Device Shadow トピックをサブスクライブして、シャドウの変更に関する通知を AWS IoT ブローカーから受信します。Device Shadow のトピックは、Device Shadow ライブラリで定義されているマクロによって組み立てられます。次のコードセクションでは、これを `prvShadowDemoTask` 関数で実行する方法を示します。

```
/* Then try to subscribe shadow topics. */
if( returnStatus == EXIT_SUCCESS )
{
    returnStatus = SubscribeToTopic( 
                     SHADOW_TOPIC_STRING_UPDATE_DELTA( THING_NAME ),
                     SHADOW_TOPIC_LENGTH_UPDATE_DELTA( THING_NAME_LENGTH ) );
}

if( returnStatus == EXIT_SUCCESS )
{
    returnStatus = SubscribeToTopic( 
                     SHADOW_TOPIC_STRING_UPDATE_ACCEPTED( THING_NAME ),
                     SHADOW_TOPIC_LENGTH_UPDATE_ACCEPTED( THING_NAME_LENGTH ) );
}

if( returnStatus == EXIT_SUCCESS )
{
    returnStatus = SubscribeToTopic( 
                     SHADOW_TOPIC_STRING_UPDATE_REJECTED( THING_NAME ),
                     SHADOW_TOPIC_LENGTH_UPDATE_REJECTED( THING_NAME_LENGTH ) );
}
```

## シャドウの更新を送信する
<a name="shadow-demo-send-updates"></a>

シャドウアップデートを送信するために、Device Shadow ライブラリで定義されるマクロを使用して、JSON 形式のメッセージ付きの `xPublishToTopic` を呼び出します。これは `MQTT_Publish` を使用して `/delete` トピックに公開します。次のコードセクションでは、これを `prvShadowDemoTask` 関数で実行する方法を示します。

```
#define SHADOW_REPORTED_JSON    \
    "{"                         \
    "\"state\":{"               \
    "\"reported\":{"            \
    "\"powerOn\":%01d"          \
    "}"                         \
    "},"                        \
    "\"clientToken\":\"%06lu\"" \
    "}"
snprintf( pcUpdateDocument,
          SHADOW_REPORTED_JSON_LENGTH + 1,
          SHADOW_REPORTED_JSON,
           ( int ) ulCurrentPowerOnState,
           ( long unsigned ) ulClientToken );

xPublishToTopic( SHADOW_TOPIC_STRING_UPDATE( THING_NAME ),
                 SHADOW_TOPIC_LENGTH_UPDATE( THING_NAME_LENGTH ),
                 pcUpdateDocument,
                 ( SHADOW_DESIRED_JSON_LENGTH + 1 ) );
```

## シャドウデルタメッセージとシャドウ更新メッセージを処理する
<a name="shadow-demo-delta-and-update"></a>

ユーザーコールバック関数は `MQTT_Init` 関数を使って [coreMQTT クライアントライブラリ](https://www.freertos.org/iot-device-shadow/device-shadow-demo.html#handle-shadow-messages) に登録され、受信パケットイベントを通知します。コールバック関数については、GitHub の「[prvEventCallback](https://github.com/aws/amazon-freertos/blob/main/demos/device_shadow_for_aws/shadow_demo_main.c#L671-L753)」を参照してください。

コールバック関数は受信パケットが `MQTT_PACKET_TYPE_PUBLISH` のタイプであることを確認し、Device Shadow ライブラリ API `Shadow_MatchTopic` を使用して、受信メッセージがシャドウメッセージであることを確認します。

受信メッセージが `ShadowMessageTypeUpdateDelta` タイプのシャドウメッセージである場合、[prvUpdateDeltaHandler](https://github.com/aws/amazon-freertos/blob/main/demos/device_shadow_for_aws/shadow_demo_main.c#L464-L580) を呼び出してこのメッセージを処理します。ハンドラ `prvUpdateDeltaHandler` が coreJSON ライブラリを使用してメッセージを解析し、`powerOn` 状態のデルタ値を取得し、これをローカルで保持されているデバイスの現在の状態と比較します。これらが異なる場合、シャドウドキュメントの `powerOn` 状態の新しい値を反映するようにローカルデバイスの状態が更新されます。

受信メッセージが `ShadowMessageTypeUpdateAccepted` タイプのシャドウメッセージである場合、[prvUpdateAcceptedHandler](https://github.com/aws/amazon-freertos/blob/main/demos/device_shadow_for_aws/shadow_demo_main.c#L584-L667) を呼び出してこのメッセージを処理します。ハンドラ `prvUpdateAcceptedHandler` は coreJSON ライブラリを使用してメッセージを解析し、メッセージから `clientToken` を取得します。このハンドラ関数は、JSON メッセージのクライアントトークンが、アプリケーションで使用されるクライアントトークンと一致するかチェックします。一致しない場合、関数は警告メッセージをログに記録します。

# セキュアソケットエコークライアントのデモ
<a name="secure-sockets-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

次の例では、1 つの RTOS タスクを使用します。この例のソースコードは `demos/tcp/aws_tcp_echo_client_single_task.c` にあります。

開始する前に、マイクロコントローラーに FreeRTOS をダウンロードしてあること、FreeRTOS デモプロジェクトを構築して実行してあることを確認します。FreeRTOS は [GitHub](https://github.com/aws/amazon-freertos) からクローンを作成またはダウンロードできます。手順については、[README.md](https://github.com/aws/amazon-freertos/blob/main/README.md) ファイルを参照してください。

**デモを実行するには**

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。  
TCP サーバーとクライアントのデモは、現在、Cypress CYW943907AEVAL1F および CYW954907AEVAL1F 開発キットではサポートされていません。

1. FreeRTOS 移植ガイドの [TLS エコーサーバーのセットアップ](https://docs.aws.amazon.com/freertos/latest/portingguide/tls-echo-server.html)の指示に従ってください。

   TLS Echo Server がポート 9000 で実行され、リッスンします。

   セットアップ中に 4 つのファイルが生成されます。
   + `client.pem` (クライアント証明書)
   + `client.key` (クライアントのプライベートキー)
   + `server.pem` (サーバー証明書)
   + `server.key` (サーバーのプライベートキー)

1. ツール `tools/certificate_configuration/CertificateConfigurator.html` を使ってクライアント証明書 (`client.pem`) とクライアントのプライベートキー (`client.key`) を `aws_clientcredential_keys.h` にコピーします。

1. `FreeRTOSConfig.h` ファイルを開きます。

1. `configECHO_SERVER_ADDR0`、`configECHO_SERVER_ADDR1`、 `configECHO_SERVER_ADDR2`、`configECHO_SERVER_ADDR3` の各変数を、TLS Echo Server の実行場所の IP アドレスを構成する 4 桁の整数に設定します。

1. `configTCP_ECHO_CLIENT_PORT` 変数を、TLS Echo Server がリッスンしているポートの `9000` に設定します。

1. `configTCP_ECHO_TASKS_SINGLE_TASK_TLS_ENABLED` 変数を `1` に設定します。

1. ツール `tools/certificate_configuration/PEMfileToCString.html` を使用して、サーバー証明書 (`server.pem`) を `cTlsECHO_SERVER_CERTIFICATE_PEM` ファイル内の `aws_tcp_echo_client_single_task.c` にコピーします。

1. `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h` を開き、`#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED` をコメントアウトして `CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` または `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED` を定義します。

マイクロコントローラーと TLS Echo Server は、同じネットワーク上に配置します。デモが始まると (`main.c`)、`Received correct string from echo server` というログメッセージが表示されます。