教程:使用 FreeRTOS 藍牙低功耗在濃縮咖啡 ESP32 上執行 OTA 更新 - 免費RTOS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教程:使用 FreeRTOS 藍牙低功耗在濃縮咖啡 ESP32 上執行 OTA 更新

重要

此參考集成託管在亞馬遜的 FreeRTOS 存儲庫上,該存儲庫已被棄用。建議您在建立新專案時從這裡開始。如果您已經有一個現有的 FreeRTOS 專案以目前已取代的亞馬遜免費伺服器儲存庫為基礎,請參閱Amazon-FreeRTOS Github 儲存庫遷移指南.

本教程將向您展示如何更新連接到 Android 設備上的 MQTT 藍牙低功耗代理的濃縮咖啡 ESP32 微控制器。它使用AWS IoT Over-the-air (OTA)更新作業更新設備。該設備連接到AWS IoT使用在 Android 演示應用程序中輸入的 Amazon Cognito 憑據。授權運營商從雲啟動 OTA 更新。當設備通過 Android 演示應用程序連接時,將啟動 OTA 更新,並在設備上更新固件。

FreeRTOS 版本 2019.06.00 主要及更新版本包含藍牙低功耗 MQTT 代理支援,可用於 Wi-Fi 佈建和與AWS IoT服務的安全連線。通過使用藍牙低功耗功能,您可以構建低功耗設備,無需 Wi-Fi 即可與移動設備配對以進行連接。設備可以通過使用通用訪問配置文件(GAP)和通用屬性(GATT)配置文件的 Android 或 iOS 低功耗藍牙 SDK 進行連接來使用 MQTT 進行通信。

以下是我們將遵循的步驟,以允許通過藍牙低功耗進行 OTA 更新:

  1. 設定儲存:建立 Amazon S3 儲存貯體和政策,並設定可執行更新的使用者。

  2. 建立程式碼簽署憑證:建立簽署憑證,並允許使用者簽署韌體更新。

  3. 設定 Amazon Cognito 身份驗證:建立登入資料提供者、使用者集區和應用程式對使用者集區的存取權。

  4. 設定 FreeRTOS:設定低功耗藍牙、用戶端認證和程式碼簽署公用憑證。

  5. 配置 Android 應用程序:設置憑據提供程序,用戶池並將應用程序部署到 Android 設備。

  6. 運行 OTA 更新腳本:要啟動 OTA 更新,請使用 OTA 更新腳本。

如需有關更新如何運作的詳細資訊,請參閱免費RTOS Over-the-Air更新。如需有關如何設定藍牙低功耗 MQTT 代理功能的其他資訊,請參閱 Richard Kang 在 Espressif ESP32 上使用藍牙低功耗搭配 FreeRTOS 文章。

先決條件

若要執行此教學課程中的步驟,您需要以下資源:

  • 一個 ESP32 開發板。

  • 一條微型 USB 連接 USB 連接線。

  • AWS帳戶(免費方案就足夠了)。

  • 具備安卓 v 6.0 或更高版本的安卓手機,以及藍牙 4.2 或更高版本。

在您的開發計算機上,您需要:

本教學課程中的步驟假設 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 Resource Name (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 registry (我的帳戶)。在「帳戶設定」 下,記下您的 12 位數帳戶 ID。

  3. 在左側的導覽窗格中,選擇 Settings (設定)。在裝置資料端點中,記下端點值。端點外觀大致如下xxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com。在此範例中,「AWS區域」為「US-西 -2」。

  4. 在左側導覽窗格中,選擇 [安全],選擇 [原則],然後選擇 [建立]。如果您的帳戶中沒有任何政策,您會看到「您還沒有任何政策」的訊息,您可以選擇 [建立政策]。

  5. 輸入原則的名稱,例如,「政策」。

  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. 選擇 建立

建立物AWS IoT件
  1. 登入 AWS IoT 主控台

  2. 在左側導覽窗格中,選擇 Manage (管理),然後選擇 Things (實物)

  3. 選擇右上角的「建立」。如果您的帳戶中沒有註冊任何項目,則會顯示「您還沒有任何物件」的訊息,您可以選擇註冊物件

  4. Creating AWS IoT things (建立 IoT 物件) 頁面上,選擇 Create a single thing (建立單一物件)

  5. Add registry (將裝置新增至物件登錄檔) 頁面上,輸入您物件的名稱 (例如 esp32-ble)。只允許英數字元、連字號 (-) 和底線 (_) 字元。選擇 下一步

  6. 在 [為您的物件新增憑證] 頁面的 [略過憑證並建立物件] 下,選擇 [建立不含憑證的物件]。由於我們使用使用 Amazon Cognito 登入資料進行身份驗證和授權的 BLE 代理行動應用程式,因此不需要裝置憑證。

創建一個亞馬遜應用程序客戶端
  1. 登入 Amazon Cognito 主控台

  2. 在右上方導覽橫幅中,選擇 [建立使用者集區]。

  3. 輸入儲存池名稱 (例如,「儲存池」)。

  4. 選擇 Review defaults (檢閱預設值)。

  5. 在 [應用程式用戶端] 中,選擇 [新增應用程式用端],然後選擇 [新增應用

  6. 輸入應用程式用戶端名稱 (例如「mqtt_app_Client」)。

  7. 確定已選取 [產生用戶端密碼]。

  8. 選擇 Create app client (建立應用程式用戶端)

  9. 選擇 Return to pool details (回到集區的詳細資訊)

  10. 在使用者集區的 [檢閱] 頁面上,選擇 [建立集區]。您應該會看到一則訊息,指出您的使用者集區已成功建立。請記下集區 ID。

  11. 在導覽窗格中,選擇 App 用戶端

  12. 選擇顯示詳細資料。記下應用程式用戶端 ID 和應用程式用戶端密碼。

建立 Amazon Cognito 身分集區
  1. 登入 Amazon Cognito 主控台

  2. 選擇 Create new identity pool (建立新的身分集區)。

  3. 輸入識別集區的名稱 (例如,「mqtt_PROXY」)。

  4. 展開驗證提供者

  5. 選擇「Co gnito」索引標籤。

  6. 輸入您在先前步驟中記下的使用者集區 ID 和應用程式用戶端 ID。

  7. 選擇 Create Pool (建立集區)。

  8. 在下一頁上,若要為已驗證和未驗證身分建立新角色,請選擇 [允許]。

  9. 記下格式的識別集區 IDus-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

將 IAM 政策連接到已驗證的身分
  1. 開啟 Amazon Cognito 主控台

  2. 選取您剛才建立的身分集區 (例如,「mqtt_proxy_id」)。

  3. 選擇 Edit identity pool (編輯身分集區)

  4. 記下指派給已驗證角色的 IAM 角色 (例如,「驗證角色」)。

  5. 開啟 IAM 主控台

  6. 在導覽窗格中,選擇 Roles (角色)。

  7. 搜尋指定的角色 (例如,「核心角色」),然後加以選取。

  8. 選擇 [新增內嵌原則],然後選擇 [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. 輸入政策名稱 (例如mqttProxyCognito政策)。

  12. 選擇 建立政策

步驟 4:設定 Amazon FreeRTOS

  1. 從免費伺服器 GitHub 軟體庫下載最新版本的亞馬遜 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並輸入的端點 URLclientcredentialMQTT_BROKER_ENDPOINT

      輸入您的物件名稱clientcredentialIOT_THING_NAME (例如,「esp32」)。使用 Amazon Cognito 登入資料時,不必新增憑證。

    4. 打開vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h並更configENABLED_NETWORKSconfigSUPPORTED_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:設定安卓應用

  1. amazon-freertos-ble-android-sdk 軟件 GitHub 庫下載安卓低功耗藍牙 SDK 和示例應用程序。

  2. 開啟檔案app/src/main/res/raw/awsconfiguration.json並填寫集區 ID、區域 AppClientId,並 AppClientSecret 使用下列 JSON 範例中的指示。

    { "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_政策) 以及 [區域] (例如,我們-東部 -1)。

  4. 構建並安裝演示應用程序。

    1. 在 Android 工作室中,選擇生成,然後選擇製作模塊應用程序

    2. 選擇運行,然後運行應用程序。你可以去日誌貓窗格中的 Android 工作室監視日誌消息。

    3. 在 Android 設備上,從登錄屏幕創建一個帳戶。

    4. 建立使用者。如果使用者已存在,請輸入認證。

    5. 允許 Amazon FreeRTOS 演示訪問設備的位置。

    6. 掃描藍牙低功耗設備。

    7. 將找到的裝置的滑桿移至「開啟」。

    8. 按下 ESP32 序列埠除錯主控台上的 y。

    9. 選擇 [配對並 Connect]。

  5. 多... 建立連線後,連結會變成作用中的狀態。連接完成後,連接狀態應更改為「BLE_CONNECTED」在 Android 設備日誌中:

    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 備和安卓設備就 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_CONT_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. 下載蟒蛇腳本 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