チュートリアル: FreeRTOS Bluetooth Low Energy を使用した Espressif ESP32 での OTA 更新の実行 - 無料RTOS

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

チュートリアル: FreeRTOS Bluetooth Low Energy を使用した Espressif ESP32 での OTA 更新の実行

重要

このリファレンス統合は、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、ここから始めることをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「Amazon-FreeRTOS Github リポジトリ移行ガイド」を参照してください。

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

FreeRTOS バージョン 2019.06.00 メジャー以降には、AWS IoT のサービスへの Wi-Fi のプロビジョニングとセキュアな接続に使用できる 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 バケットとポリシーを作成し、更新を実行できるユーザーを設定します。

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

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

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

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

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

更新の仕組みについては、「無料RTOS Over-the-Air更新」を参照してください。Bluetooth Low Energy MQTT プロキシ機能のセットアップ方法の詳細については、次の記事を参照してください: Espressif ESP32 での FreeRTOS Bluetooth Low Energy の使用 (執筆者 Richard Kang)。

前提条件

このチュートリアルのステップを実行するには、以下のリソースを持っている必要があります。

  • ESP32 開発ボード。

  • MicroUSB to USB A ケーブル 1 本。

  • AWS アカウント (無料利用枠で十分です)。

  • Android v 6.0 以降と Bluetooth バージョン 4.2 以降を搭載した Android 携帯電話。

開発用コンピュータには、次のものが必要です。

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

ステップ 1: ストレージを設定する

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

  2. OTA 更新サービスロールを作成する、および次の管理ポリシーをロールに追加します。

    • AWSIotLogging

    • AWSIoTRuleActions

    • AWSIoTThingsRegistration

    • AWSFreeRTOSOTAUpdate

  3. OTA 更新を実行できるユーザーを作成します。このユーザーは、アカウント内の IoT デバイスに対するファームウェアアップデートに署名して、それをデプロイできるほか、すべてのデバイスで OTA 更新を実行するためのアクセス権を持っています。アクセスは信頼できるエンティティに限定する必要があります。

  4. OTA ユーザーポリシーを作成する」のステップを実行し、そのポリシーをユーザーにアタッチします。

ステップ 2: コード署名証明書を作成する

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

  2. ファームウェアの署名に使用できるコード署名証明書を作成します。証明書をインポートするときに、証明書の 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 認証の設定

AWS IoT ポリシーを作成する
  1. AWS IoT コンソールにサインインします。

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

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

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

  5. ポリシーの名前を入力します。例えば、「esp32_mqtt_proxy_iot_policy」などです。

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" } ] }
  7. [Create] (作成) を選択します。

AWS IoT のモノを作成する
  1. AWS IoT コンソールにサインインします。

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

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

  4. [Creating AWS IoT things (モノを作成する) ] ページで、[Create a single thing (単一のモノを作成する) ] を選択します。

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

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

Amazon Cognito アプリクライアントを作成する
  1. Amazon Cognito コンソールにサインインします。

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

  3. プール名を入力します (例えば「esp32_mqtt_proxy_user_pool」)。

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

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

  6. アプリクライアント名を入力します (例えば「mqtt_app_client」)。

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

  8. [Create app client] を選択します。

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

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

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

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

Amazon Cognito アイデンティティプールを作成する
  1. Amazon Cognito コンソールにサインインします。

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

  3. アイデンティティプールの名前を入力します (例えば「mqtt_proxy_identity_pool」)。

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

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

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

  7. [Create Pool] (プールの作成) を選択します。

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

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

認証されたアイデンティティに IAM ポリシーをアタッチします。
  1. Amazon Cognito コンソールを開きます。

  2. 今しがた作成したアイデンティティプールを選択します (例えば「mqtt_proxy_identity_pool」)。

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

  4. 認証されたロールに割り当てられた IAM ロールを書き留めます (例えば「Cognito_mqtt_proxy_identity_poolAuth_Role」)。

  5. IAM コンソールを開きます。

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

  7. 割り当てられたロール (例えば「Cognito_mqtt_proxy_identity_poolAuth_Role」) を検索して選択します。

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:AttachPolicy", "iot:AttachPrincipalPolicy", "iot:Connect", "iot:Publish", "iot:Subscribe" ], "Resource": "*" }] }
  10. [Review Policy (ポリシーの確認)] を選択します。

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

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

ステップ 4: Amazon FreeRTOS を設定する

  1. FreeRTOS GitHub リポジトリから、最新バージョンの Amazon FreeRTOS コードをダウンロードします。

  2. OTA アップデートのデモを有効にするには、Espressif ESP32-DevKitC と ESP-WROVER- の開始方法KIT のステップに従います。

  3. 次のファイルで、これらの追加変更を行います。

    1. vendors/espressif/boards/esp32/aws_demos/config_files/aws_demo_config.h を開き、CONFIG_OTA_UPDATE_DEMO_ENABLED を定義します。

    2. vendors/espressif/boards/esp32/aws_demos/common/config_files/aws_demo_config.h を開き、democonfigNETWORK_TYPESAWSIOT_NETWORK_TYPE_BLE に変更します。

    3. demos/include/aws_clientcredential.h を開き、clientcredentialMQTT_BROKER_ENDPOINT のエンドポイント URL を入力します。

      clientcredentialIOT_THING_NAME のモノの名前を入力します (例えば「esp32-ble」)。Amazon Cognito 認証情報を使用する場合、証明書を追加する必要はありません。

    4. vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h を開き、configSUPPORTED_NETWORKSconfigENABLED_NETWORKS を変更して AWSIOT_NETWORK_TYPE_BLE のみを含めるようにします。

    5. 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 アプリケーションを設定する

  1. Android Bluetooth Low Energy SDK とサンプルアプリケーションを amazon-freertos-ble-android-sdk GitHub レポからダウンロードします。

  2. ファイル 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)" } } }
  3. app/src/main/java/software/amazon/freertos/DemoConstants.java を開き、前もって作成したポリシー名 (例: esp32_mqtt_proxy_iot_policy) とリージョン (例: us-east-1)) を入力します。

  4. デモアプリケーションを構築してインストールします。

    1. Android Studio で、[Build] (構築) を選択してから [Make Module app] (モジュールアプリの作成) を選択します。

    2. [Run] (実行) を選択して [Run app] (アプリケーションを実行) を選択します。Android Studio の logcat ウィンドウペインに移動して、ログメッセージをモニタリングできます。

    3. Android デバイスで、ログイン画面からアカウントを作成します。

    4. ユーザーを作成します。ユーザーが既に存在する場合は、認証情報を入力します。

    5. Amazon FreeRTOS デモによるデバイスの位置情報へのアクセスを許可します。

    6. Bluetooth Low Energy デバイスをスキャンします。

    7. 見つかったデバイスのスライダーを [On] (オン) にします。

    8. ESP32 のシリアルポートデバッグコンソールで y を押します。

    9. [Pair & Connect] (ペアリング & 接続) を選択します。

  5. 接続が確立されると、[More...] (詳細...) リンクがアクティブになります。接続が完了すると、次のように Android デバイスの logcat で接続状態が「BLE_CONNECTED」に変更されます。

    2019-06-06 20:11:32.160 23484-23497/software.amazon.freertos.demo I/FRD: BLE connection state changed: 0; new state: BLE_CONNECTED
  6. メッセージを送信する前に、Amazon FreeRTOS デバイスと Android デバイスが MTU をネゴシエートします。logcat に次のような出力が表示されます。

    2019-06-06 20:11:46.720 23484-23497/software.amazon.freertos.demo I/FRD: onMTUChanged : 512 status: Success
  7. デバイスがアプリケーションに接続し、MQTT プロキシを使用して MQTT メッセージの送信を開始します。デバイスが通信できることを確認するには、MQTT_CONTROL の特性データ値が次のように 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
  8. デバイスがペアリングされると、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 更新スクリプトを実行する

  1. 前提条件をインストールするには、次のコマンドを実行します。

    pip3 install boto3
    pip3 install pathlib
  2. FreeRTOS アプリケーションバージョンを demos/include/aws_application_version.h にインクリメントします。

  3. 新しい .bin ファイルを構築します。

  4. Python スクリプト 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)
  5. 提供された AWS 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
  6. OTA 更新が完了すると、OTA 更新プロセスの要求に従ってデバイスが再起動します。次に、更新されたファームウェアを使用した接続が試行されます。アップグレードが成功すると、次のように更新されたファームウェアがアクティブとしてマークされ、コンソールに更新されたバージョンが表示されます。

    13 13498 [iot_thread] OTA demo version 0.9.21