教程:使用 FreeRTOS 低功耗蓝牙在 Espressif ESP32 上执行 OTA 更新 - FreeRTOS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:使用 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 更新,我们将遵循以下步骤:

  1. 配置存储:创建 Amazon S3 存储桶和策略,并配置可以执行更新的用户。

  2. 创建代码签名证书:创建签名证书并允许用户签署固件更新。

  3. 配置 Amazon Cognito 身份验证:创建凭证提供商、用户池和对用户池的应用程序访问权限。

  4. 配置 FreeRTOS:设置低功耗蓝牙、客户端凭证和代码签名公共证书。

  5. 配置 Android 应用程序:设置凭证提供商、用户池并将应用程序部署到 Android 设备。

  6. 运行 OTA 更新脚本:要启动 OTA 更新,请使用 OTA 更新脚本。

有关更新工作原理的更多信息,请参阅FreeRTOS 无线更新。有关如何设置低功耗蓝牙 MQTT 代理功能的更多信息,请参阅 Richard K ang 在 Espressif ESP32 上使用低功耗蓝牙 FreeRTOS 一文。

先决条件

要执行本教程中的步骤,您需要以下资源:

  • ESP32 开发板。

  • 一根 microUSB 转 USB A 的电缆。

  • 一个Amazon账户(免费套餐就足够了)。

  • 搭载安卓 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 身份验证配置

创建 Amazon IoT 策略
  1. 登录到 Amazon IoT 控制台

  2. 在控制台的右上角,选择 My Adevice Add Add regi stry 在 Add registry (账户设置),请记录下您的 12 位账户 ID。

  3. 在左侧导航窗格中,选择 Settings (设置)。在设备数据端点中,记下端点值。终端节点应该如下所示xxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com。在此示例中,Amazon区域为 “us-west-2”。

  4. 在左侧导航窗格中,选择 “安全”,选择 “策略”,然后选择 “创建”。如果您的账户中没有任何政策,您将看到 “您还没有任何政策” 消息,您可以选择创建策略

  5. 为您的策略输入 Name,例如 esp32_mqtttt_proxy_iot_policy。

  6. 添加语句部分中,选择高级模式。将以下 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(创建)

创建事Amazon IoT物
  1. 登录到 Amazon IoT 控制台

  2. 在左侧导航窗格中选择管理,然后选择事物

  3. 在右上角,选择 Create (创建)。如果您的账户中没有注册任何东西,则会显示 “您还没有任何东西” 消息,您可以选择 “注册事物”。

  4. 创建 Amazon IoT事物页面上,选择创建单个事物

  5. 在 A dd your device t事物输入 Name (名称),请为您的事物输入 Name(例如 esp32-ble)。仅允许字母数字、连字符 (-) 和下划线 (_)。选择 Next(下一步)

  6. 在 “为您的事物添加证书” 页面上的 “跳过证书并创建事物” 下,选择 “不使用证书创建事物”。由于我们使用使用 Amazon Cognito 凭证进行身份验证和授权的 BLE 代理移动应用程序,因此不需要设备证书。

创建Amazon Cognito 应用程序客户端
  1. 登录 Amazon Cognito 控制台

  2. 在右上方的导航横幅中,选择 Create a a a user pool(创建用户池

  3. 输入池名称(例如,“esp32_mqtt_proxy_user_pool”)。

  4. 选择 Review defaults (查看原定设置)

  5. 应用程序客户端中,选择添加应用程序客户端,然后选择添加应用程序客户端

  6. 输入应用程序客户端名称(例如 “mqtt_app_client”)。

  7. 确保选择 “生成客户端密钥”。

  8. 选择 Create app client(创建应用程序客户端)。

  9. 选择 Return to pool details(返回池详细信息)。

  10. 在用户池的查看页面上,选择创建池。您应看到一条显示 Add your pool 已成功创建的消息。记录下池 ID。

  11. 在导航窗格中,选择应用程序客户端

  12. 选择 “显示详细信息”。记下应用程序客户端 ID 和应用程序客户端密钥。

创建一个 Amazon Cognito 身份池
  1. 登录 Amazon Cognito 控制台

  2. 选择 Create new identity pool(创建新身份池)。

  3. 输入身份池的名称(例如,“mqtt_proxy_identity_pool”)。

  4. 扩展身份验证提供商

  5. 选择 “Cognito” 选项卡。

  6. 输入您在前面的步骤中记下的用户池 ID 和应用程序客户端 ID。

  7. 选择 Create Pool(创建池)。

  8. 在下一页上,要为经过身份验证和未经身份验证的身份创建新角色,请选择 All ow

  9. 记下身份池 ID,其格式为us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

将 IM 策略附加到经过身份验证的身份
  1. 打开 Amazon Cognito 控制台

  2. 选择你刚刚创建的身份池(例如,“mqtt_proxy_identity_pool”)。

  3. 选择编辑身份池

  4. 记下分配给经过身份验证的角色的 IAM 角色(例如,“cognito_mqtt_proxy_identity_poolath_Role”)。

  5. 打开 IAM 控制台

  6. 在导航窗格中,选择 Roles (角色)

  7. 搜索分配的角色(例如,“cognito_mqtt_proxy_identity_poolath_Role”),然后将其选中。

  8. 选择 “添加内联策略”,然后选择 JSON

  9. 输入以下策略:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:AttachPolicy", "iot:AttachPrincipalPolicy", "iot:Connect", "iot:Publish", "iot:Subscribe" ], "Resource": "*" }] }
  10. 请选择查看策略

  11. 输入策略名称(例如,“mqttProxyCognito策略”)。

  12. 选择 Create policy(创建策略)

步骤 4:配置Amazon FreeRTOS

  1. 从 FreeRTOS GitHub 存储库下载最新版本的Amazon FreeRTOS 代码。

  2. 要启用 OTA 更新演示,请按照中的步骤操作开始使用 Espressif ESP32-DevKit C 和 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-ble”)。使用 Amazon Cognito 凭证时,无需添加证书。

    4. 打开vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.hconfigSUPPORTED_NETWORKS并更改configENABLED_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并按照以下 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)" } } }
  3. 打开app/src/main/java/software/amazon/freertos/DemoConstants.java并输入您之前创建的策略名称(例如 esp32_mqtt_proxy_iot_ policy)以及区域(例如 us-east-1)。

  4. 生成并安装演示应用程序。

    1. 在 Android Studio 中,选择构建,然后选择制作模块应用程序

    2. 选择运行,然后选择运行应用程序。你可以前往 Android Studio 中的 logcat 窗口窗格来监控日志消息。

    3. 在 Android 设备上,从登录屏幕创建一个帐户。

    4. 创建用户。如果用户已经存在,请输入凭据。

    5. 允许Amazon FreeRTOS 演示访问设备的位置。

    6. 扫描低功耗蓝牙设备。

    7. 将找到的设备的滑块移至开启

    8. 在 ESP32 的串行端口调试控制台上按 y

    9. 选择 “配对并Connect”。

  5. 更多... 建立连接后,链接变为活动状态。连接完成后,安卓设备日志中的连接状态应更改为 “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 设备和安卓设备协商 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. 如果您使用提供的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
  6. OTA 更新完成后,设备将按照 OTA 更新过程的要求重新启动。然后它尝试使用更新的固件进行连接。如果升级成功,则更新后的固件将标记为激活,您应该在控制台中看到更新的版本:

    13 13498 [iot_thread] OTA demo version 0.9.21