本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教程:使用 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 更新:
-
設定儲存:建立 Amazon S3 儲存貯體和政策,並設定可執行更新的使用者。
-
建立程式碼簽署憑證:建立簽署憑證,並允許使用者簽署韌體更新。
-
設定 Amazon Cognito 身份驗證:建立登入資料提供者、使用者集區和應用程式對使用者集區的存取權。
-
設定 FreeRTOS:設定低功耗藍牙、用戶端認證和程式碼簽署公用憑證。
-
配置 Android 應用程序:設置憑據提供程序,用戶池並將應用程序部署到 Android 設備。
-
運行 OTA 更新腳本:要啟動 OTA 更新,請使用 OTA 更新腳本。
如需有關更新如何運作的詳細資訊,請參閱免費RTOS Over-the-Air更新。如需有關如何設定藍牙低功耗 MQTT 代理功能的其他資訊,請參閱 Richard Kang 在 Espressif ESP32 上使用藍牙低功耗搭配 FreeRTOS
先決條件
若要執行此教學課程中的步驟,您需要以下資源:
-
一個 ESP32 開發板。
-
一條微型 USB 連接 USB 連接線。
-
AWS帳戶(免費方案就足夠了)。
-
具備安卓 v 6.0 或更高版本的安卓手機,以及藍牙 4.2 或更高版本。
在您的開發計算機上,您需要:
-
適用於 Xtensa 工具鏈和 FreeRTOS 原始程式碼和範例的足夠磁碟空間 (約 500 Mb)。
-
安卓工作室安裝。
-
已AWS CLI
安裝。 -
已安裝蟒蛇 3。
本教學課程中的步驟假設 Xtensa 工具鏈、ESP-IDF 和 FreeRTOS 程式碼已安裝在主/esp
目錄中的目錄中。您必須新增~/esp/xtensa-esp32-elf/bin
至$PATH
變數。
步驟 1:設定儲存
-
建立 Amazon S3 儲存貯體以儲存您的更新啟用版本控制以保存固件映像。
-
建立OTA更新服務角色並將下列受管政策中新增至該角色:
-
AWSIotLogging
-
AWSIotRuleActions
-
AWSIotThingsRegistration
-
AWSFreeRTOSOTAUpdate
-
-
創建一個可以執行 OTA 更新的用戶。此使用者可在帳戶中簽署並部署韌體更新至 IoT 裝置,並可存取在所有裝置上執行 OTA 更新。存取權限應限於受信任的實體。
-
按照步驟操作建立OTA使用者政策並將其附加到您的用戶。
步驟 2:建立程式碼簽名憑證
-
建立已啟用版本控制的 Amazon S3 儲存貯體來存放韌體映像。
-
建立可用於簽署韌體的程式碼簽署憑證。請記下憑證匯入憑證時的憑證 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 政策
-
登入 AWS IoT 主控台
。 -
在主機的右上角,選擇 My registry (我的帳戶)。在「帳戶設定」 下,記下您的 12 位數帳戶 ID。
-
在左側的導覽窗格中,選擇 Settings (設定)。在裝置資料端點中,記下端點值。端點外觀大致如下
xxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com
。在此範例中,「AWS區域」為「US-西 -2」。 -
在左側導覽窗格中,選擇 [安全],選擇 [原則],然後選擇 [建立]。如果您的帳戶中沒有任何政策,您會看到「您還沒有任何政策」的訊息,您可以選擇 [建立政策]。
-
輸入原則的名稱,例如,「政策」。
-
在 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
:*" } ] } -
選擇 建立 。
建立物AWS IoT件
-
登入 AWS IoT 主控台
。 -
在左側導覽窗格中,選擇 Manage (管理),然後選擇 Things (實物)。
-
選擇右上角的「建立」。如果您的帳戶中沒有註冊任何項目,則會顯示「您還沒有任何物件」的訊息,您可以選擇註冊物件。
-
在 Creating AWS IoT things (建立 IoT 物件) 頁面上,選擇 Create a single thing (建立單一物件)。
-
在 Add registry (將裝置新增至物件登錄檔) 頁面上,輸入您物件的名稱 (例如 esp32-ble)。只允許英數字元、連字號 (-) 和底線 (_) 字元。選擇 下一步。
-
在 [為您的物件新增憑證] 頁面的 [略過憑證並建立物件] 下,選擇 [建立不含憑證的物件]。由於我們使用使用 Amazon Cognito 登入資料進行身份驗證和授權的 BLE 代理行動應用程式,因此不需要裝置憑證。
創建一個亞馬遜應用程序客戶端
-
在右上方導覽橫幅中,選擇 [建立使用者集區]。
-
輸入儲存池名稱 (例如,「儲存池」)。
-
選擇 Review defaults (檢閱預設值)。
-
在 [應用程式用戶端] 中,選擇 [新增應用程式用戶端],然後選擇 [新增應用
-
輸入應用程式用戶端名稱 (例如「mqtt_app_Client」)。
-
確定已選取 [產生用戶端密碼]。
-
選擇 Create app client (建立應用程式用戶端)。
-
選擇 Return to pool details (回到集區的詳細資訊)。
-
在使用者集區的 [檢閱] 頁面上,選擇 [建立集區]。您應該會看到一則訊息,指出您的使用者集區已成功建立。請記下集區 ID。
-
在導覽窗格中,選擇 App 用戶端。
-
選擇顯示詳細資料。記下應用程式用戶端 ID 和應用程式用戶端密碼。
建立 Amazon Cognito 身分集區
-
選擇 Create new identity pool (建立新的身分集區)。
-
輸入識別集區的名稱 (例如,「mqtt_PROXY」)。
-
展開驗證提供者。
-
選擇「Co gnito」索引標籤。
-
輸入您在先前步驟中記下的使用者集區 ID 和應用程式用戶端 ID。
-
選擇 Create Pool (建立集區)。
-
在下一頁上,若要為已驗證和未驗證身分建立新角色,請選擇 [允許]。
-
記下格式的識別集區 ID
us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
。
將 IAM 政策連接到已驗證的身分
-
選取您剛才建立的身分集區 (例如,「mqtt_proxy_id」)。
-
選擇 Edit identity pool (編輯身分集區)。
-
記下指派給已驗證角色的 IAM 角色 (例如,「驗證角色」)。
-
開啟 IAM 主控台
。 -
在導覽窗格中,選擇 Roles (角色)。
-
搜尋指定的角色 (例如,「核心角色」),然後加以選取。
-
選擇 [新增內嵌原則],然後選擇 [JSON]。
-
輸入下列政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:AttachPolicy", "iot:AttachPrincipalPolicy", "iot:Connect", "iot:Publish", "iot:Subscribe" ], "Resource": "*" }] }
-
選擇 Review Policy (檢閱政策)。
-
輸入政策名稱 (例如mqttProxyCognito政策)。
-
選擇 建立政策。
步驟 4:設定 Amazon FreeRTOS
-
從免費伺服器 GitHub 軟體庫下載最新版本的亞馬遜 FreeRTOS
程式碼。 -
若要啟用 OTA 更新示範,請依照中的步驟操作Espressif ESP32-DevKitC 和 入門 ESP-WROVER-KIT。
-
在下列檔案中進行這些額外的修改:
-
開啟
vendors/espressif/boards/esp32/aws_demos/config_files/aws_demo_config.h
並定義CONFIG_OTA_UPDATE_DEMO_ENABLED
。 -
開啟
vendors/espressif/boards/esp32/aws_demos/common/config_files/aws_demo_config.h
並變更democonfigNETWORK_TYPES
為AWSIOT_NETWORK_TYPE_BLE
。 -
開啟
demos/include/aws_clientcredential.h
並輸入的端點 URLclientcredentialMQTT_BROKER_ENDPOINT
。輸入您的物件名稱
clientcredentialIOT_THING_NAME
(例如,「esp32」)。使用 Amazon Cognito 登入資料時,不必新增憑證。 -
打開
vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h
並更configENABLED_NETWORKS
改configSUPPORTED_NETWORKS
和僅包括AWSIOT_NETWORK_TYPE_BLE
。 -
開啟檔
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:設定安卓應用
-
從 amazon-freertos-ble-android-sdk 軟件 GitHub 庫下載安卓低功耗藍牙 SDK
和示例應用程序。 -
開啟檔案
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)
" } } } -
開啟
app/src/main/java/software/amazon/freertos/DemoConstants.java
並輸入您先前建立的原則名稱 (例如,esp32_mqtt_proxy_iot_政策
) 以及 [區域] (例如,我們-東部 -1
)。 -
構建並安裝演示應用程序。
-
在 Android 工作室中,選擇生成,然後選擇製作模塊應用程序。
-
選擇運行,然後運行應用程序。你可以去日誌貓窗格中的 Android 工作室監視日誌消息。
-
在 Android 設備上,從登錄屏幕創建一個帳戶。
-
建立使用者。如果使用者已存在,請輸入認證。
-
允許 Amazon FreeRTOS 演示訪問設備的位置。
-
掃描藍牙低功耗設備。
-
將找到的裝置的滑桿移至「開啟」。
-
按下 ESP32 的序列埠除錯主控台上的 y。
-
選擇 [配對並 Connect]。
-
-
更多... 建立連線後,連結會變成作用中的狀態。連接完成後,連接狀態應更改為「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
-
在可以傳輸消息之前,Amazon FreeRTOS 備和安卓設備就 MTU 進行了協商。您應該會在 logcat 中看到下列輸出:
2019-06-06 20:11:46.720 23484-23497/software.amazon.freertos.demo I/FRD: onMTUChanged : 512 status: Success
-
設備連接到應用程序,並開始使用 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
-
裝置配對完成後,您會在 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 更新指令碼
-
若要安裝先決條件,請執行下列命令:
pip3 install boto3
pip3 install pathlib
-
在中增加 FreeRTOS 應用程式版本
demos/include/aws_application_version.h
。 -
建立新的 .bin 檔案。
-
下載蟒蛇腳本 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)
-
如果您使用提供的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
-
OTA 更新完成後,設備將根據 OTA 更新過程的要求重新啟動。然後,它會嘗試使用更新的韌體進行連線。如果升級成功,則更新的韌體會標示為作用中,您應該會在主控台中看到更新的版本:
13 13498 [iot_thread] OTA demo version 0.9.21