

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

# チュートリアル: 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
   ```