

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

# 無線通信経由更新デモアプリケーション
<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
   ```