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

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

教程:使用 FreeRTOS 蓝牙低功耗在乐鑫 ESP32 上执行 OTA 更新

本教程向您展示如何更新连接到 Android 设备上的 MQTT 蓝牙低功耗代理的乐鑫 ESP32 微控制器。它使用更新设备Amazon IoT无线 (OTA) 更新任务。该设备连接到Amazon IoT使用 Android 演示应用中输入的 Amazon Cognito 凭据。授权运营商从云端启动 OTA 更新。当设备通过 Android 演示应用程序连接时,将启动 OTA 更新并在设备上更新固件。

FreeRTOS 版本 2019.06.00 主要及更高版本包括蓝牙低功耗 MQTT 代理支持,可用于 Wi-Fi 配置和安全连接到Amazon IoT服务。通过使用低功耗蓝牙功能,您可以构建可与移动设备配对的低功耗设备以实现连接,而无需 Wi-Fi。设备可以通过使用通用访问配置文件 (GAP) 和通用属性 (GATT) 配置文件的 Android 或 iOS 低功耗蓝牙 SDK 进行连接,使用 MQTT 进行通信。

以下是允许通过低功耗蓝牙进行 OTA 更新的步骤:

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

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

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

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

  5. 配置 Android 应用程序:设置凭据提供程序、用户池,然后将应用程序部署到 Android 设备。

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

有关更新的工作原理的更多信息,请参阅FreeRTOS 无线更新. 有关如何设置蓝牙低功耗 MQTT 代理功能的其他信息,请参阅帖子在乐鑫 ESP32 上将蓝牙低功耗与 FreeRTOS 结合使用由理查德·康。

先决条件

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

  • ESP32 开发板。

  • microUSB 转 USB A 电缆。

  • 网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的Amazon账户(免费套餐就足够了)。

  • 安卓 v 6.0 或更高版本和蓝牙 4.2 或更高版本的安卓手机。

在你的开发计算机上你需要:

本教程中的步骤假设 Xtensa 工具链、ESP-IDF 和 FreeRTOS 代码已安装在/esp目录在您的主目录中。您必须添加~/esp/xtensa-esp32-elf/bin对您的$PATH变量。

第 1 步:配置存储

  1. 创建 Amazon S3 存储桶以存储更新启用版本控制以保存固件映像。

  2. 创建 OTA 更新服务角色并将以下托管策略添加到角色:

    • AWSIotLogging

    • WSIOTRULE 操作

    • AWSIOTGTingsRegis

    • awsFreertosota 更新

  3. 创建 IAM 用户它可以执行 OTA 更新。该用户可以签名并将固件更新部署到帐户中的 IoT 设备,并可以在所有设备上执行 OTA 更新。访问权限应限于受信任的实体。

  4. 按以下步骤操作:创建 OTA 用户策略并将其附加到 IAM 用户。

第 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. 在控制台的右上角,选择我的账户. UNDER账户设置记下您的 12 位账户 ID。

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

  4. 在左侧导航窗格中,选择Secure,选择策略,然后选择Create. 如果你的账户中没有任何政策,你会看到消息 “你还没有任何保单”,你可以选择创建策略.

  5. 为您的策略输入名称,例如 “sp32_mqtt_proxy_iot_Policy”。

  6. 添加语句部分中,选择高级模式。将以下 JSON 复制并粘贴到策略编辑器窗口中。Replaceaws-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. 在存储库的将设备添加到事物注册表页面上,为您的事物输入名称(例如,“esp32-ble”)。只允许使用字母数、连字符 (-) 和下划线 (_) 字符。选择下一步

  6. 在存储库的添加事物的证书页面,下跳过证书然后创建东西,选择创建没有证书的东西. 因为我们使用的 BLE 代理移动应用程序使用 Amazon Cognito 凭据进行身份验证和授权,因此不需要设备证书。

创建 Amazon Cognito 应用程序客户端

  1. 登录 Amazon Cognito 控制台

  2. 在右上角的导航横幅中,选择创建用户池.

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

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

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

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

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

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

  9. 选择返回池详细信息

  10. 在存储库的审核在用户池的页面上,选择创建池. 您应该看到一条显示 “您的用户池已成功创建。” 记下池 ID。

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

  12. 选择显示详情. 记下应用程序客户端 ID 和应用程序客户端密钥。

创建一个 Amazon Cognito 身份池

  1. 登录 Amazon Cognito 控制台

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

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

  4. Expand验证提供商.

  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. 选择编辑身份池

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

  5. 打开 IAM 控制台

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

  7. 搜索分配的角色(例如,“Cognito_mqTT_PROxy_identity_poolAuth_Role”),然后选择它。

  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. 输入策略名称(例如,“MQTTProxyCognitPolicy”)。

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

第 4 步:配置 Amazon FreeRTOS

  1. 从下载最新版本的 Amazon FreeRTOS 代码FreeRTOS 控制台或者FreeRTOS GitHub 存储库.

  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(例如,“sp32-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 蓝牙低功耗 SDK 和示例应用程序Amazon FreeRTOS s-ble-android-sdkGitHub 存储库。

  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. y在 ESP32 的串行端口调试控制台上。

    9. 选择配对并 Connect.

  5. 这些区域有:更多...连接建立后,链接将变为活动状态。连接完成后,Android 设备 Logcat 中的连接状态应更改为 “BLE_CONNECT”:

    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. 如果你使用了提供的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