本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:使用 FreeRTOS 低功耗蓝牙在 Espressif ESP32 上执行 OTA 更新
此参考集成托管在 Amazon-FreeRTOS 存储库中,该存储库已过时。建议您在创建新项目时从这里开始。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的 FreeRTOS 项目,请参阅亚马逊 FreeRTOS Github 存储库迁移指南。
本教程向您展示如何更新连接到 Android 设备上的 MQTT 低功耗蓝牙代理的 Espressif ESP32 微控制器。它使用Amazon IoT Over-the-air (OTA) 更新任务更新设备。设备Amazon IoT使用在安卓演示应用程序中输入的Amazon Cognito 凭证进行连接。授权运营商从云端启动 OTA 更新。当设备通过 Android 演示应用程序连接时,将启动 OTA 更新并在设备上更新固件。
FreeRTOS 版本 2019.06.00 Major 及更高版本包括蓝牙低功耗 MQTT 代理支持,可用于 Wi-Fi 配置和Amazon IoT服务安全连接。通过使用低功耗蓝牙功能,您可以构建低功耗设备,这些设备无需使用 Wi-Fi 即可与移动设备配对以实现连接。设备可以通过使用通用访问配置文件 (GAP) 和通用属性 (GATT) 配置文件的 Android 或 iOS 低功耗蓝牙 SDK 进行连接,使用 MQTT 进行通信。
为允许通过低功耗蓝牙进行 OTA 更新,我们将遵循以下步骤:
-
配置存储:创建 Amazon S3 存储桶和策略,并配置可以执行更新的用户。
-
创建代码签名证书:创建签名证书并允许用户签署固件更新。
-
配置 Amazon Cognito 身份验证:创建凭证提供商、用户池和对用户池的应用程序访问权限。
-
配置 FreeRTOS:设置低功耗蓝牙、客户端凭证和代码签名公共证书。
-
配置 Android 应用程序:设置凭证提供商、用户池并将应用程序部署到 Android 设备。
-
运行 OTA 更新脚本:要启动 OTA 更新,请使用 OTA 更新脚本。
有关更新工作原理的更多信息,请参阅FreeRTOS 无线更新。有关如何设置低功耗蓝牙 MQTT 代理功能的更多信息,请参阅 Richard K ang 在 Espressif ESP32 上使用低功耗蓝牙 FreeRTOS
先决条件
要执行本教程中的步骤,您需要以下资源:
-
ESP32 开发板。
-
一根 microUSB 转 USB A 的电缆。
-
一个Amazon账户(免费套餐就足够了)。
-
搭载安卓 6.0 或更高版本和蓝牙 4.2 或更高版本的安卓手机。
在你的开发计算机上,你需要:
-
足够的磁盘空间(约 500 Mb)来存放 Xtensa 工具链和 FreeRTOS 源代码和示例。
-
安卓工作室已安装。
-
已Amazon CLI
安装的。 -
Python 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 身份验证配置
创建 Amazon IoT 策略
-
登录到 Amazon IoT 控制台
。 -
在控制台的右上角,选择 My Adevice Add Add regi stry 在 Add registry (账户设置),请记录下您的 12 位账户 ID。
-
在左侧导航窗格中,选择 Settings (设置)。在设备数据端点中,记下端点值。终端节点应该如下所示
xxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com
。在此示例中,Amazon区域为 “us-west-2”。 -
在左侧导航窗格中,选择 “安全”,选择 “策略”,然后选择 “创建”。如果您的账户中没有任何政策,您将看到 “您还没有任何政策” 消息,您可以选择创建策略。
-
为您的策略输入 Name,例如 esp32_mqtttt_proxy_iot_policy。
-
在添加语句部分中,选择高级模式。将以下 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
:*" } ] } -
选择 Create(创建)。
创建事Amazon IoT物
-
登录到 Amazon IoT 控制台
。 -
在左侧导航窗格中选择管理,然后选择事物。
-
在右上角,选择 Create (创建)。如果您的账户中没有注册任何东西,则会显示 “您还没有任何东西” 消息,您可以选择 “注册事物”。
-
在创建 Amazon IoT事物页面上,选择创建单个事物。
-
在 A dd your device t事物输入 Name (名称),请为您的事物输入 Name(例如 esp32-ble)。仅允许字母数字、连字符 (-) 和下划线 (_)。选择 Next(下一步)。
-
在 “为您的事物添加证书” 页面上的 “跳过证书并创建事物” 下,选择 “不使用证书创建事物”。由于我们使用使用 Amazon Cognito 凭证进行身份验证和授权的 BLE 代理移动应用程序,因此不需要设备证书。
创建Amazon Cognito 应用程序客户端
-
在右上方的导航横幅中,选择 Create a a a user pool(创建用户池)
-
输入池名称(例如,“esp32_mqtt_proxy_user_pool”)。
-
选择 Review defaults (查看原定设置)。
-
在应用程序客户端中,选择添加应用程序客户端,然后选择添加应用程序客户端。
-
输入应用程序客户端名称(例如 “mqtt_app_client”)。
-
确保选择 “生成客户端密钥”。
-
选择 Create app client(创建应用程序客户端)。
-
选择 Return to pool details(返回池详细信息)。
-
在用户池的查看页面上,选择创建池。您应看到一条显示 Add your pool 已成功创建的消息。记录下池 ID。
-
在导航窗格中,选择应用程序客户端。
-
选择 “显示详细信息”。记下应用程序客户端 ID 和应用程序客户端密钥。
创建一个 Amazon Cognito 身份池
-
选择 Create new identity pool(创建新身份池)。
-
输入身份池的名称(例如,“mqtt_proxy_identity_pool”)。
-
扩展身份验证提供商。
-
选择 “Cognito” 选项卡。
-
输入您在前面的步骤中记下的用户池 ID 和应用程序客户端 ID。
-
选择 Create Pool(创建池)。
-
在下一页上,要为经过身份验证和未经身份验证的身份创建新角色,请选择 All ow。
-
记下身份池 ID,其格式为
us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
。
将 IM 策略附加到经过身份验证的身份
-
选择你刚刚创建的身份池(例如,“mqtt_proxy_identity_pool”)。
-
选择编辑身份池。
-
记下分配给经过身份验证的角色的 IAM 角色(例如,“cognito_mqtt_proxy_identity_poolath_Role”)。
-
打开 IAM 控制台
。 -
在导航窗格中,选择 Roles (角色)。
-
搜索分配的角色(例如,“cognito_mqtt_proxy_identity_poolath_Role”),然后将其选中。
-
选择 “添加内联策略”,然后选择 JSON。
-
输入以下策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:AttachPolicy", "iot:AttachPrincipalPolicy", "iot:Connect", "iot:Publish", "iot:Subscribe" ], "Resource": "*" }] }
-
请选择查看策略。
-
输入策略名称(例如,“mqttProxyCognito策略”)。
-
选择 Create policy(创建策略)。
步骤 4:配置Amazon FreeRTOS
-
从 FreeRTOS GitHub 存储库下载最新版本的Amazon FreeRTOS
代码。 -
要启用 OTA 更新演示,请按照中的步骤操作开始使用 Espressif ESP32-DevKit C 和 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-ble”)。使用 Amazon Cognito 凭证时,无需添加证书。 -
打开
vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h
configSUPPORTED_NETWORKS
并更改configENABLED_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
并按照以下 JSON 示例中的说明填写池 ID AppClientId、区域。 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)
" } } } -
打开
app/src/main/java/software/amazon/freertos/DemoConstants.java
并输入您之前创建的策略名称(例如esp32_mqtt_proxy_iot_
policy)以及区域(例如us-east-1
)。 -
生成并安装演示应用程序。
-
在 Android Studio 中,选择构建,然后选择制作模块应用程序。
-
选择运行,然后选择运行应用程序。你可以前往 Android Studio 中的 logcat 窗口窗格来监控日志消息。
-
在 Android 设备上,从登录屏幕创建一个帐户。
-
创建用户。如果用户已经存在,请输入凭据。
-
允许Amazon FreeRTOS 演示访问设备的位置。
-
扫描低功耗蓝牙设备。
-
将找到的设备的滑块移至开启。
-
在 ESP32 的串行端口调试控制台上按 y。
-
选择 “配对并Connect”。
-
-
更多... 建立连接后,链接变为活动状态。连接完成后,安卓设备日志中的连接状态应更改为 “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
-
在传输消息之前,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_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 文件。
-
下载 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)
-
如果您使用提供的Amazon 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