恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Matter OTA Provider Linux 参考应用完全指南:构建、命令行参数与源码原理
首页
资讯中心
/
Matter OTA Provider Linux 参考应用完全指南:构建、命令行参数与源码原理
Matter OTA Provider Linux 参考应用完全指南:构建、命令行参数与源码原理
发布时间:2026/9/18 7:26:20
Matter OTA Provider Linux 参考应用完全指南构建、命令行参数与源码原理【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip本篇指南围绕 connectedhomeipMatter 参考实现中的 Linux OTA Provider 参考应用展开它以examples/ota-provider-app/linux为骨架完整实现了一个 OTA Software Update Provider Cluster ServerOTA 软件升级提供方集群服务器用于向同 Fabric 内的 OTA Requestor 设备提供固件升级镜像。读完本文你将掌握该应用的构建方法、全部命令行参数的含义与默认值、--otaImageListJSON 配置文件的编写规范、OTA 镜像头Software Image Header的生成方式以及通过 ACL 授权让 Requestor 正常调用 QueryImage 的完整配置流程并深入理解其底层源码实现。应用定位与整体结构OTA Provider 是 Matter OTA 升级链路中的服务端角色OTA Requestor请求方通常是终端设备向 Provider 发送QueryImage命令询问是否有可用更新Provider 依据自身策略返回QueryImageResponse随后双方通过 BDXBulk Data Exchange协议传输固件镜像Requestor 下载完成后调用ApplyUpdateRequest与NotifyUpdateApplied完成升级闭环。Linux 版本的 OTA Provider 是一个完整可运行的参考实现其核心源码分布如下入口与参数解析命令行选项定义、JSON 镜像列表解析、ApplicationInit初始化OTA Provider 核心逻辑OTAProviderDelegate接口的三个命令处理函数HandleQueryImage、HandleApplyUpdateRequest、HandleNotifyUpdateApplied以及镜像选择、用户同意、BDX 会话初始化等BDX 发送器继承chip::bdx::Responder负责以发送方角色执行 BDX 传输头文件见 BdxOtaSender.h构建配置 与 args.gni。应用将 OTA Provider 集群部署在endpoint 0见 main.cpp 中的kOtaProviderEndpoint 0并通过chip::app::Clusters::OTAProvider::SetDelegate(kOtaProviderEndpoint, GetOtaProviderExample())将委托实例注册到集群服务器上。启动阶段还会把BdxOtaSender注册为 BDX 协议的无请求消息处理器从而能够接收 Requestor 发起的 BDX 传输请求见 main.cpp。构建 OTA Provider 应用推荐使用仓库自带的 GN 构建脚本命令如下scripts/examples/gn_build_example.sh examples/ota-provider-app/linux out/debug chip_config_network_layer_blefalseexamples/ota-provider-app/linux待构建的 example 目标out/debug构建输出目录chip_config_network_layer_blefalse禁用 BLE 网络层Linux 平台通常使用 IP 网络完成发现与配对。构建产物为可执行文件chip-ota-provider-app默认输出到out/debug目录。从 BUILD.gn 可以看到该目标依赖ota-provider-common、app-mainLinux 平台应用框架、ota-provider集群实现、user-consent用户同意模块、bdx协议栈以及jsoncpp用于解析镜像列表 JSON。命令行参数完全解析应用通过ChipLinuxAppInit(argc, argv, cmdLineOptions)解析参数完整选项定义见 main.cpp。下表整理了所有选项及其在源码中的行为标注了默认值与首次响应后回退策略。选项说明-a, --applyUpdateAction proceed \| awaitNextAction \| discontinue首次ApplyUpdateResponse中Action字段的值后续所有响应固定使用proceed。源码中发送响应后会把mUpdateAction重置为kProceed见 OTAProviderExample.cpp-c, --userConsentNeeded若提供QueryImageResponse的UserConsentNeeded字段置为true仅当 QueryImage 命令中RequestorCanConsent为 true 时生效否则该字段为false见 SendQueryImageResponse-f, --filepath file path包含 OTA 镜像的文件路径应用将自动把该文件提供给 OTA Requestor-i, --imageUri uriQueryImageResponse中ImageURI字段的值若未提供应用会基于节点 ID 与文件设计符自动生成一个合法的 BDX URI-m, --maxBDXBlockSize sizeBDX 传输最大块大小若未提供使用默认值 1024 字节源码常量kMaxBdxBlockSize见 OTAProviderExample.cpp。注意该选项未出现在 README 表格中但已由源码支持-o, --otaImageList file path包含 OTA 镜像列表的 JSON 文件路径-p, --delayedApplyActionTimeSec 秒首次ApplyUpdateResponse中DelayedActionTime字段的值后续响应固定为 0-q, --queryImageStatus updateAvailable \| busy \| updateNotAvailable首次QueryImageResponse中Status字段的值后续响应固定回退为updateAvailable-t, --delayedQueryActionTimeSec 秒首次QueryImageResponse中DelayedActionTime字段的值后续响应固定为 0-u, --userConsentState granted \| denied \| deferred首次QueryImageResponse的用户同意状态后续固定为granted。注意--queryImageStatus优先级更高覆盖本选项三者映射关系为granted→updateAvailable、denied→updateNotAvailable、deferred→busy-x, --ignoreQueryImage 次数忽略不响应QueryImage 命令的次数用于测试超时/无响应场景-y, --ignoreApplyUpdate 次数忽略 ApplyUpdate 请求的次数-P, --pollInterval 毫秒BDX 传输的轮询间隔默认 50ms源码常量kBdxServerPollIntervalMillis--persistQueryImageStatus长选项无短形式。提供后--queryImageStatus及其DelayedActionTime将用于每一次QueryImageResponse而不是首次响应后回退到updateAvailable便于持续模拟busy/updateNotAvailable状态见 main.cpp其中若干选项与源码实现存在深层关联状态回退机制默认情况下busy、updateNotAvailable等状态被设计为一次性条件——服务完一次后ApplyQueryImageStatusAfterResponse()会将状态重置回updateAvailable、延时归零避免测试套件因 Provider 卡死在异常状态而反复重启见 OTAProviderExample.cpp。如需持续保持特定状态请使用--persistQueryImageStatus。用户同意状态deferred在内部映射为UserConsentState::kObtaining获取中此时 Provider 返回busy状态granted映射为kGranted、denied映射为kDenied见 main.cpp。忽略计数--ignoreQueryImage N会让前 N 次 QueryImage 请求石沉大海不发送任何响应也不发送错误状态对应HandleQueryImage开头的计数判断见 OTAProviderExample.cpp。除上述选项外应用还继承 Linux 平台通用参数例如--discriminator长鉴别码默认 3840、--secured-device-port安全端口默认 5540、--KVSKVS 存储位置默认/tmp/chip_kvs、--autoApplyImage等具体可参考 OTA Requestor Linux README 中的运行示例。一个典型启动命令如下参考 ota-requestor-app/linux/README.mdout/chip-ota-provider-app --discriminator 22 --secured-device-port 5565 --KVS /tmp/chip_kvs_provider --filepath /tmp/ota-image.bin使用--filepath与--otaImageList两种提供镜像的方式存在严格的约束参数解析逻辑见 main.cpp二者不能同时提供HandleOptions通过静态标志位检测若先出现-f再出现-o或反之会直接报错退出至少必须提供其一若两者都为nullptrApplicationInit会记录错误日志 Either an OTA file or image list file must be specified 并调用chipDie()终止进程见 main.cpp提供--filepath时应用直接将该文件作为唯一可提供的镜像提供--otaImageList时应用解析 JSON 文件从中选取最新且有效的软件版本并把对应 OTA 文件发送给 Requestor。镜像列表 JSON 格式--otaImageList指向的 JSON 文件以deviceSoftwareVersionModel数组为核心解析逻辑见 main.cpp。注意文件顶部允许出现 C/C 风格注释builder[collectComments] trueREADME 示例中的{ foo: 1, // ignored by parser正是利用了这一特性——解析器会忽略该无效字段。{ foo: 1, // ignored by parser deviceSoftwareVersionModel: [ { vendorId: 1, productId: 1, softwareVersion: 10, softwareVersionString: 1.0.0, cDVersionNumber: 18, softwareVersionValid: true, minApplicableSoftwareVersion: 0, maxApplicableSoftwareVersion: 100, otaURL: /tmp/ota_v10.bin }, { vendorId: 1, productId: 1, softwareVersion: 20, softwareVersionString: 1.0.1, cDVersionNumber: 18, softwareVersionValid: false, minApplicableSoftwareVersion: 0, maxApplicableSoftwareVersion: 100, otaURL: /tmp/ota_v20.bin }, { vendorId: 1, productId: 1, softwareVersion: 30, softwareVersionString: 1.0.2, cDVersionNumber: 18, softwareVersionValid: true, minApplicableSoftwareVersion: 0, maxApplicableSoftwareVersion: 100, otaURL: /tmp/ota_v30.bin }, { vendorId: 1, productId: 1, softwareVersion: 40, softwareVersionString: 1.1.0, cDVersionNumber: 18, softwareVersionValid: true, minApplicableSoftwareVersion: 0, maxApplicableSoftwareVersion: 100, otaURL: /tmp/ota_v40.bin }, { vendorId: 1, productId: 1, softwareVersion: 50, softwareVersionString: 1.1.1, cDVersionNumber: 18, softwareVersionValid: false, minApplicableSoftwareVersion: 0, maxApplicableSoftwareVersion: 100, otaURL: /tmp/ota_v50.bin } ] }各字段含义与源码默认值解析时缺省即采用见 main.cpp字段说明解析默认值vendorId厂商 ID1productId产品 ID1softwareVersion软件版本号uint3210softwareVersionString软件版本字符串1.0.0cDVersionNumber认证声明CD版本号0softwareVersionValid该版本是否有效可选trueminApplicableSoftwareVersion适用的最低请求方版本0maxApplicableSoftwareVersion适用的最高请求方版本1000otaURLOTA 镜像文件路径https://test.com版本校验与镜像选择从源码可以确认两条关键行为版本一致性校验SetOTACandidates()会逐个打开候选镜像并解析其头部通过VerifyOrDie强制校验 JSON 中的vendorId、productId、softwareVersion、softwareVersionString、min/maxApplicableSoftwareVersion与镜像头完全一致只要有一项不一致进程即终止见 OTAProviderExample.cpp。因此务必保证otaURL指向的文件确实带有与 JSON 条目匹配的镜像头。候选选择算法SelectOTACandidate()首先按softwareVersion升序排序所有候选然后依次遍历选出满足以下全部条件的候选softwareVersionValid true候选版本号请求方当前版本号requestorSoftwareVersion candidate.softwareVersion请求方当前版本号落在[minApplicableSoftwareVersion, maxApplicableSoftwareVersion]区间内。由于候选已升序排列最终命中的将是满足条件中版本最高的一个见 OTAProviderExample.cpp。若没有任何候选命中QueryImageResponse的状态会置为updateNotAvailable。对照上述示例 JSONv10 对应有效请求方版本为 0 时会命中 v10而softwareVersionValidfalse的 v20、v50 永远不会被选中。同时注意Provider 端版本判定逻辑与 OTA Requestor 侧的行为仅当响应版本高于当前运行版本时才继续下载相互配合共同构成完整的升级前提校验。软件镜像头Software Image HeaderMatter 规范第 11.21.1 节要求所有 Matter 软件镜像必须携带一个软件镜像头。仓库提供了 ota_image_tool.py 用于在固件上生成所需头部。凡是通过--filepath或--otaImageList提供给 OTA Provider 的镜像都必须包含该头部——Provider 会从头部解析SoftwareVersion字段并填入QueryImageResponse。例如为一个软件版本号为 2 的固件生成带头镜像src/app/ota_image_tool.py create -v 0xDEAD -p 0xBEEF -vn 2 -vs 2.0 -da sha256 firmware.bin firmware.ota参数含义-v指定厂商 ID0xDEAD、-p指定产品 ID0xBEEF、-vn指定版本号2、-vs指定版本字符串2.0、-da指定摘要算法sha256输出为firmware.ota。在 Provider 端镜像头的解析路径为ParseOTAHeader()以二进制方式读取文件前 1024 字节常量kOtaHeaderMaxSize交给OTAImageHeaderParser的AccumulateAndDecode解码见 OTAProviderExample.cpp。当使用--filepath直接提供单个镜像时每次HandleQueryImage都会重新解析镜像头来取得mSoftwareVersion与mSoftwareVersionString见 OTAProviderExample.cpp。如需构建一个携带指定软件版本的 OTA Requestor 应用进行端到端验证请参考 OTA Requestor Linux README 中 Generate Images 一节其流程是先修改CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION为更大版本号再重新构建 Requestor 并用ota_image_tool.py为生成的可执行文件打上匹配版本号的镜像头最后用带--autoApplyImage的旧版本 Requestor 应用发起升级。访问控制要求ACLOTA Provider 集群的可用性依赖 ACLAccess Control List访问控制列表授权。Commissioner 或 Administrator应当在配网时或之后安装必要的 ACL 条目允许同 Fabric 内的 OTA Requestor 处理QueryImage命令否则该 Provider 对 Requestor 不可用。由于ACL属性本身是一个列表写入时不能只包含新条目而必须先读取现有条目再连同新条目一并写入。下面是一个写入两条 ACL 条目的完整示例out/chip-tool accesscontrol write acl [{fabricIndex: 1, privilege: 5, authMode: 2, subjects: [112233], targets: null}, {fabricIndex: 1, privilege: 3, authMode: 2, subjects: null, targets: [{cluster: 41, endpoint: null, deviceType: null}]}] 0xDEADBEEF 0条目 1配网时自动创建的原始条目向节点 ID 112233默认控制器节点 ID授予privilege: 5Administer管理权限覆盖所有 endpoint 上的所有集群条目 2新增条目向所有节点subjects: null授予privilege: 3Operate操作权限目标为cluster: 41——即 OTA Provider 集群0x0029 的十进制值——覆盖所有 endpoint。该示例的适用前提Provider 位于 fabric index 1节点 ID 为0xDEADBEEFendpoint 为 0。authMode: 2表示使用 Case证书认证会话模式。注意endpoint: null与deviceType: null表示不限制 endpoint 与设备类型targets: null表示不限制目标。当前限制Current LimitationsREADME 明确了该参考实现目前的已知限制对应源码也可找到佐证仅支持同步 BDX 传输BdxOtaSender使用轮询式事件处理默认每 50ms 轮询一次可经--pollInterval调整不支持异步/多会话并行不校验 VID/PIDSelectOTACandidate()的注释明确说明当前以 vendorId/productId 作为查询主键的校验尚未启用VendorID and ProductID will be the primary key when querying the DCL servers. If not we can add the vendor/product ID checks here.见 OTAProviderExample.cpp同一时刻仅支持一个传输SendQueryImageResponse()中若InitializeTransfer失败说明已有 BDX 传输正在进行会将状态临时切换为kBusy见 OTAProviderExample.cpp同时HandleApplyUpdateRequest中也留有 TODO 注释说明尚未通过追踪updateToken来支持多传输见 OTAProviderExample.cpp。测试与验证该示例附带单元测试可用于验证镜像列表版本校验与 BDX 会话逻辑TestOTAProviderExample.cpp覆盖 OTA Provider 示例核心逻辑TestBdxOtaSenderPeerBinding.cpp覆盖 BDX 发送器的对端绑定与会话行为。实际验证 OTA 升级链路时推荐组合使用 OTA Provider 与 OTA Requestor Linux 应用分别以不同的--discriminator、--secured-device-port、--KVS启动两者并完成配网后即可观察 QueryImage → BDX 传输 → ApplyUpdate 的完整流程。Requestor 侧的日志如 Available update version X is current version Y, update ignored可帮助诊断版本校验失败而 Image does not contain a valid header 则提示镜像缺少头部。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考