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

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

使用低功耗蓝牙执行无线更新

Introduction

您可以使用 FreeRTOS 低功耗蓝牙 (BLE) 和无线更新 (OTA) 库,通过在配套设备上运行的 MQTT 代理,通过低功耗蓝牙对微控制器设备执行固件更新。此更新使用Amazon IoTOTA 职位。配套设备连接到Amazon IoT使用在演示应用程序中输入的 Amazon Cognito 凭据。授权运营商从云启动 OTA 更新。当设备通过演示应用程序连接时,会启动 OTA 更新并在设备上更新固件。

Prerequisites

  1. 将通过空气更新代理端口到每个微控制器设备:

  2. 将低功耗蓝牙库端口到每个微控制器:

  3. 设置Amazon账户(免费套餐已经足够)。

  4. 您必须能够访问安卓手机作为配套设备与 Android v 6.0 或更高版本和蓝牙版本 4.2 或更高版本.

  5. 设置开发平台:

    • Android Studio。

    • 这些区域有:Amazon CLI已安装。

    • Python3 安装。

    • Boto3Amazon适用于 Python 的软件开发工具包 (开发工具包)。

Setup

以下是设置所需步骤概述。您可以跳过步骤 1 和 2,如果您已经完成这些操作来测试通过 WiFi 或以太网进行无线更新。

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

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

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

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

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

第 1 步:配置存储

您可以跳过这些步骤,方法是启动Amazon CloudFormation模板.

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

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

    • AWSIotLogging

    • AWSIoTrueActions

    • AWSIoTThings 注册

    • AWSS 自由更新

  3. 添加内联策略添加到角色,以允许它执行Amazon IoT操作并允许访问您创建的 S3 存储桶。

  4. 创建 IAM 用户,可以执行 OTA 更新。此用户可以对固件更新进行签名和部署Amazon IoT设备,并有权在所有设备上执行 OTA 更新。访问权限应限于受信任的实体。

  5. 附加 OTA 用户策略的权限.

  6. 创建内联策略,允许您创建的 IAM 用户对固件进行签名。

第 2 步:创建代码签名证书

创建代码签名证书,可用于对固件进行签名。导入证书时,请注意证书 ARN。

aws acm import-certificate --profile=ota-update-user --certificate file://ecdsasigner.crt --private-key file://ecdsasigner.key { "CertificateArn": "arn:aws:acm:region:account:certificate/certid" }

ARN 稍后将用于创建签名配置文件。如果需要,此时可以使用以下命令创建配置文件:

aws signer put-signing-profile --profile=ota-update-user --profile-name myOTAProfile --signing-material certificateArn=arn:aws:acm:region:account:certificate/certid --platform AmazonFreeRTOS-Default --signing-parameters certname=/cert.pem { "arn": "arn:aws:signer::account:/signing-profiles/myOTAProfile" }

第 3 步:配置 Amazon Cognito 身份验证

Amazon IoTconfiguration

首先,设置Amazon IoT事物和政策. 由于我们在 Android 手机上使用 MQTT 代理,该代理将使用 Amazon Cognito 进行身份验证,因此该设备不需要Amazon IoT证书。

在您创建Amazon IoT策略,您需要知道您的Amazon区域和Amazon账号。

步骤 3a: 创建 Amazon IoT 策略

  1. 登录到 Amazon IoT 控制台

  2. 在右上角,选择您的账户,然后在我的账户记下 12 位账户 ID。

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

  4. 在左侧导航窗格中,选择Secure中,选择策略,然后选择Create.

  5. 如果您的帐户中没有创建策略,您将看到消息 “您还没有任何策略”,您应该选择创建策略.

  6. 输入策略的名称(例如,“mqtt_xeot_iot_策略”)。

  7. 添加语句部分中,选择高级模式。将以下 JSON 复制并粘贴到策略编辑器窗口中。将 “aws-账户编号” 替换为您的账户 ID(步骤 2)。将 “aws-区域” 替换为您的区域,例如 “us-west-2”(步骤 3)。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account-id:*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:region:account-id:*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "arn:aws:iot:region:account-id:*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "arn:aws:iot:region:account-id:*" } ] }
  8. 选择创建

步骤 3b: 创建Amazon IoTthing

  1. 登录到 Amazon IoT 控制台

  2. 在左侧导航窗格中选择管理,然后选择事物。在右上角,选择Create.

  3. 如果您的账户中未注册任何 IoT 事物,此时将显示消息 “您还没有任何事物”,您应选择注册事物.

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

  5. 在存储库的将设备添加到事物注册表页面上,输入事物的名称(例如,“my_thing”)。仅允许使用字母数字字符、连字符 (“-”) 和下划线 (“_”)。选择 Next (下一步)

  6. 在存储库的添加事物的证书页面,在跳过证书并创建东西中,选择创建没有证书的东西.

    由于我们使用的是使用 Amazon Cognito 凭据进行身份验证和授权的 BLE 代理移动应用程序,因此不需要任何设备证书。

Amazon Cognito 配置

MQTT 代理移动应用程序的身份验证需要 Amazon Cognito。IAM 策略附加到经过身份验证的身份,以允许委托人附加Amazon IoT策略添加到凭据。

步骤 3c:设置 Amazon Cognito 用户池

  1. 登录 Amazon Cognito 控制台

  2. 在右上方的导航区域中,选择创建用户池.

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

  4. 选择 Review defaults

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

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

  7. 确保生成客户端密钥处于选择状态。

  8. 选择 Create app client

  9. 选择返回池详细信息

  10. 在存储库的审核页上,选择创建池.

  11. 您应该看到一条消息,提示 “您的用户池已成功创建”。

  12. 记下 "池 ID"。

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

  14. 单击显示详细信息.

  15. 记下 “应用程序客户端 ID” 和 “应用程序客户端密钥”。

步骤三维:Amazon Cognito 身份池

  1. 登录 Amazon Cognito 控制台

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

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

  4. Expand身份证提供商.

  5. 选择Cognito选项卡。

  6. 输入用户池 ID应用程序客户端 ID您从 “步骤 3c 保存:设置 Amazon Cognito 用户池”。

  7. 选择 Create Pool

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

  9. 记下身份池 ID,其格式为 “我们向东方 1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

接下来,我们将 IAM 策略附加到经过身份验证的身份,以便证书可以将 IoT 策略附加到其中。

步骤 3e:将 IAM 策略附加到经过身份验证的身份

  1. 打开 Amazon Cognito 控制台

  2. 选择您刚刚创建的身份池(例如,“mqtt_proxy 标识池”)。

  3. 选择编辑身份池

  4. 记下分配给经过身份验证的角色的 IAM 角色(例如,“认知 _MQT_ 代理 _ 身份 _ 池认证 _ 角色”)。

  5. 打开 IAM 控制台

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

  7. 搜索角色(例如,"Cognito_MQTT_代理_代理_Cognit_代理_role"),然后选择它。

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

  9. 输入以下策略:

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

  11. 输入策略名称(例如,"MQttProxy Cognity 多余性")。

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

第 4 步:配置 FreeRTOS

启用 OTA 更新演示,如下所示:

注意

在演示运行器中,一次只能启用一个演示。

  1. 打开 vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h

    • DeFINERCONFIG_OTA_UPDATE_DEMO_ENABLED.

    • democonfigNETWORK_TYPES 更改为 AWSIOT_NETWORK_TYPE_BLE

  2. 打开 demos/include/aws_clientcredential.h:

    • 更改终端节点 URLclientcredentialMQTT_BROKER_ENDPOINT[].

    • 将事物名称更改为您的事物的名称(例如,“my_thing”),在clientcredentialIOT_THING_NAME.

      注意

      当您使用 Amazon Cognito 凭证时,无需添加证书。

  3. 打开 vendors/vendor/boards/board/aws_demos/common/config_files/aws_iot_network_config.h

    • 变更configSUPPORTED_NETWORKSconfigENABLED_NETWORKS以仅包含AWSIOT_NETWORK_TYPE_BLE.

  4. 打开 ota_demo_config.h:

    • 变更otapalconfigCODE_SIGNING_CERTIFICATE参考用于对固件二进制文件进行签名的证书。

    应用程序应启动并打印演示版本:

    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 应用程序

下载 Android 低功耗蓝牙 SDK 和示例应用程序,请从Amazon FreeRTOS android sdkGitHub 回购。

进行以下更改:

  1. 修改文件app/src/main/res/raw/awsconfiguration.json

    使用以下示例 JSON 中的说明填写 “PooliID”、“区域”、“应用程序客户端密码” 和 “应用程序客户端密码” 字段。

    { "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 -> mqtt_proxy_user_pool -> General Settings -> PoolId", "AppClientId": "Cognito-> Manage User Pools -> mqtt_proxy_user_pool -> General Settings -> App clients ->Show Details", "AppClientSecret": "Cognito-> Manage User Pools -> mqtt_proxy_user_pool -> General Settings -> App clients ->Show Details", "Region": "Your region (for example us-east-1)" } } }
  2. 修改文件app/src/main/java/software/amazon/freertos/DemoConstants.java

    • 指定您之前创建的策略名称(例如,“mqtt_Proxy_iot_策略”)。

    • 设置区域(例如,“us-east-1”)。

  3. 构建并安装演示应用程序:

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

    2. 选择运行运行应用程序. 您可以转到 Android Studio 中的 logcat 窗口窗格来监控日志消息。

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

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

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

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

    7. 将找到的设备的滑块移动到在 上.

    8. 'y '串行端口调试控制台上。

    9. 选择配对和 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

在传输消息之前,FreeRTOS 设备和 Android 设备必须协商 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:

微控制器控制台上的完整配对

当设备与 Android 设备配对时,系统将提示您按控制台上的 “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.

Testing

  1. 要安装先决条件,请运行以下命令:

    pip3 install boto3 pip3 install pathlib
  2. 下载python脚本。

  3. 提升 FreeRTOS 应用程序版本demos/include/aws_application_version.h并构建一个新的二进制文件。

  4. 要获得帮助,请在终端窗口运行以下命令:

    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 my_thing --role ota_ble_iot_role-sample --s3bucket afr-ble-ota-update-bucket-sample --otasigningprofile abcd --signingcertificateid certificateid

Validation

  1. 从控制台,日志显示 OTA 更新已开始,并且正在进行文件块下载:

    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
  2. OTA 更新完成后,设备将使用更新的固件重新启动,再次连接到 Android 应用程序,然后执行自检。

  3. 如果自检成功,更新后的固件将被标记为活动状态,您应该在控制台中看到更新的版本:

    13 13498 [iot_thread] OTA demo version 0.9.21

References