# 固件升级 **本文档引用的文件** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp) - [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp) - [GD10OperCmd.h](file://h/GD10OperCmd.h) - [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp) - [FileTransfer.h](file://h/FileTransfer.h) - [IAP-GD10.bat](file://tools/IAP-GD10.bat) - [License-GD10.bat](file://tools/License-GD10.bat) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp) ## 目录 1. [引言](#引言) 2. [固件升级流程概述](#固件升级流程概述) 3. [核心组件分析](#核心组件分析) 4. [升级准备阶段](#升级准备阶段) 5. [文件传输机制](#文件传输机制) 6. [升级执行与DFU工具](#升级执行与dfu工具) 7. [通信协议与指令集](#通信协议与指令集) 8. [升级状态监控与用户反馈](#升级状态监控与用户反馈) 9. [异常处理与恢复机制](#异常处理与恢复机制) 10. [版本兼容性考虑](#版本兼容性考虑) ## 引言 本文档全面描述了通过LicenseUpgrade模块触发并执行GD10设备固件升级的完整流程。文档详细阐述了升级准备、文件传输、升级执行、校验与重启等各个阶段的技术细节。通过分析GD10OperCmd中定义的升级指令集及其通信协议,解释了批处理脚本在调用DFU工具和传递参数中的作用。同时提供了升级失败、中断恢复、版本兼容性等关键问题的处理指南,并结合实际代码逻辑展示了升级状态监控和用户反馈机制。 ## 固件升级流程概述 GD10设备的固件升级流程是一个多阶段的复杂过程,涉及多个组件的协同工作。整个流程从用户通过LicenseUpgrade模块触发升级开始,经过升级准备、文件下载、设备通信、固件刷写和最终验证等阶段。该流程依赖于FileTransfer组件进行文件传输,利用批处理脚本调用DFU工具执行实际的固件刷写操作,并通过GD10OperCmd定义的通信协议与设备进行交互。 ```mermaid flowchart TD A[用户触发升级] --> B[升级准备] B --> C[下载升级文件] C --> D[建立设备通信] D --> E[执行固件刷写] E --> F[校验与重启] F --> G[升级完成] ``` **图示来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L146-L269) - [IAP-GD10.bat](file://tools/IAP-GD10.bat#L12-L16) ## 核心组件分析 ### LicenseUpgrade模块 LicenseUpgrade模块是固件升级流程的入口点,负责协调整个升级过程。该模块通过对话框界面与用户交互,收集必要的升级信息,并协调其他组件完成升级任务。 ```mermaid classDiagram class CLicenseUpgrade { +m_bIsCrulInitaled bool +m_bIsUpdating bool +m_comDev CComboBox +m_proDownFile CProgressCtrl +m_FileTransfer FileTransfer +OnInitDialog() BOOL +OnOK() void +GetLicenseFile(strDev CString) bool +OnTimer(nIDEvent UINT) void +UpdateGD10Dev(pCom CSComPort*) void } CLicenseUpgrade --> FileTransfer : "使用" CLicenseUpgrade --> CSComPort : "通信" ``` **图示来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L20-L496) - [FileTransfer.h](file://h/FileTransfer.h#L26-L46) ### GD10OperCmd指令集 GD10OperCmd类定义了与GD10设备通信的指令集,是实现设备控制的核心组件。该组件提供了项目管理、测区管理、脚本管理等功能的接口。 ```mermaid classDiagram class CGD10OperCmd { +m_pGD10Oper CGD10OperCmd* +GetInstance() CGD10OperCmd* +project_add(mac char*, projectcn char*) int +project_delete(mac char*, projectcn char*) bool +testzone_add(projectcn char*, testzonecn char*, type char*) int +testzone_delete(projectcn char*, testzonecn char*) int +script_add(scriptcn char*, scriptname char*, mudiumid char*) int +script_delete(scriptcn char*) bool +set_param(strParam CString) bool +unregister_user(strMacAddr CString) bool +loadDeviceMarkDataFromGD() bool +LoadDevMarkDataFormGDThread(lParam LPVOID) UINT } CGD10OperCmd : "单例模式" ``` **图示来源** - [GD10OperCmd.h](file://h/GD10OperCmd.h#L12-L52) - [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L24-L800) ## 升级准备阶段 升级准备阶段是固件升级流程的初始阶段,主要负责验证升级条件、初始化必要组件和设置升级参数。此阶段确保所有前置条件满足后,才开始实际的文件传输和固件刷写操作。 ```mermaid flowchart TD A[初始化对话框] --> B[检查设备连接] B --> C{设备是否在线?} C --> |否| D[显示错误信息] C --> |是| E[获取在线设备列表] E --> F[设置进度条范围] F --> G[初始化文件传输组件] G --> H[准备升级] ``` **图示来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L49-L97) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L56-L78) **本节来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L49-L97) ## 文件传输机制 文件传输机制是固件升级流程中的关键环节,负责从远程服务器下载必要的升级文件到本地。该机制使用FileTransfer组件实现,支持进度监控和错误处理。 ### FileTransfer组件 FileTransfer组件是基于C++的文件传输实现,提供了文件发送和接收的基本功能。该组件使用串口通信(CSComPort)作为传输媒介,并支持CRC校验确保数据完整性。 ```mermaid classDiagram class FileTransfer { +port CSComPort* +file FILE* +file_length long +byte_count long +file_count int +file_name[128] char +buffer[BUFFSIZE] char +Send(files char*[]) BOOL +Receive(Path CString) BOOL +error(fmt char*, ...) void +status(fmt char*, ...) void } FileTransfer --> CSComPort : "使用" FileTransfer : "抽象基类" ``` **图示来源** - [FileTransfer.h](file://h/FileTransfer.h#L26-L46) - [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp#L28-L47) ### 文件下载流程 文件下载流程从远程服务器获取固件升级所需的文件,包括FACTORY和LICENSE文件。该流程支持进度显示和错误恢复。 ```mermaid sequenceDiagram participant UI as "用户界面" participant LU as "LicenseUpgrade" participant FT as "FileTransfer" participant Server as "远程服务器" UI->>LU : 点击升级按钮 LU->>LU : 验证设备选择 LU->>FT : 初始化传输组件 LU->>FT : 设置下载参数 loop 下载每个文件 LU->>FT : 开始下载 FT->>Server : 发送HTTP请求 Server-->>FT : 返回文件数据 FT->>LU : 更新下载进度 LU->>UI : 显示进度 end FT-->>LU : 下载完成 LU->>LU : 准备固件刷写 ``` **图示来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L215-L269) - [FileTransfer.h](file://h/FileTransfer.h#L40-L41) **本节来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269) - [FileTransfer.h](file://h/FileTransfer.h#L26-L46) ## 升级执行与DFU工具 升级执行阶段使用DFU(Device Firmware Upgrade)工具将下载的固件文件刷写到GD10设备中。这一过程通过批处理脚本调用DFU工具完成,确保了升级过程的可靠性和一致性。 ### IAP-GD10批处理脚本 IAP-GD10.bat批处理脚本是执行固件升级的核心脚本,它调用DFU工具完成固件刷写。该脚本首先使用DfuCreateFile工具将二进制固件文件转换为DFU格式,然后使用DfuSeCommand工具将DFU文件刷写到设备中。 ```mermaid flowchart TD A[开始] --> B[延迟10秒] B --> C[创建DFU文件] C --> D[刷写固件] D --> E[删除临时DFU文件] E --> F[结束] ``` **图示来源** - [IAP-GD10.bat](file://tools/IAP-GD10.bat#L10-L16) ### License-GD10批处理脚本 License-GD10.bat批处理脚本专门用于升级设备的许可证文件。该脚本分两步执行:首先刷写FACTORY文件,然后刷写LICENSE文件,确保许可证信息正确更新。 ```mermaid flowchart TD A[开始] --> B[延迟2秒] B --> C[创建FACTORY DFU文件] C --> D[刷写FACTORY文件] D --> E[删除FACTORY DFU文件] E --> F[创建LICENSE DFU文件] F --> G[刷写LICENSE文件] G --> H[删除LICENSE DFU文件] H --> I[结束] ``` **图示来源** - [License-GD10.bat](file://tools/License-GD10.bat#L7-L20) ### DFU工具参数说明 DFU工具的调用参数具有特定含义,确保固件正确刷写到设备的指定位置: - `0x0483`: STMicroelectronics的厂商ID - `0xdf11`: DFU设备的产品ID - `0x2200`: 设备的设备ID - `APP`: 固件类型标识 - `0x08010000`: 固件在设备内存中的起始地址 - `"APP.dfu"`: 生成的DFU文件名 这些参数确保了固件被正确识别和刷写到GD10设备中。 **本节来源** - [IAP-GD10.bat](file://tools/IAP-GD10.bat#L12-L16) - [License-GD10.bat](file://tools/License-GD10.bat#L9-L20) ## 通信协议与指令集 GD10设备的通信协议定义了一套完整的指令集,用于控制设备的各种操作。这些指令通过串口通信发送到设备,实现对设备的远程控制。 ### 指令集功能 GD10OperCmd类定义的指令集涵盖了设备管理的各个方面: - **项目管理**: `project_add`和`project_delete`用于在设备上创建和删除项目 - **测区管理**: `testzone_add`和`testzone_delete`用于管理测区 - **脚本管理**: `script_add`和`script_delete`用于管理测量脚本 - **参数设置**: `set_param`用于设置设备参数 - **用户管理**: `unregister_user`用于用户注销 ### 通信流程 通信流程遵循典型的请求-响应模式,确保指令的可靠执行: ```mermaid sequenceDiagram participant App as "应用程序" participant Cmd as "GD10OperCmd" participant Dev as "GD10设备" App->>Cmd : 调用指令方法 Cmd->>Cmd : 验证设备连接 Cmd->>Dev : 发送指令 Dev-->>Cmd : 返回响应 Cmd->>App : 返回执行结果 alt 执行成功 App->>App : 更新UI状态 else 执行失败 App->>App : 显示错误信息 end ``` **图示来源** - [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L53-L800) - [GD10OperCmd.h](file://h/GD10OperCmd.h#L20-L37) **本节来源** - [GD10OperCmd.h](file://h/GD10OperCmd.h#L20-L37) - [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L53-L800) ## 升级状态监控与用户反馈 升级过程中的状态监控和用户反馈机制确保用户能够实时了解升级进度,并在出现问题时及时获得提示。 ### 进度监控实现 进度监控通过定时器和文件传输组件的回调机制实现,实时更新用户界面: ```mermaid flowchart TD A[启动定时器] --> B[获取当前下载大小] B --> C[获取文件总大小] C --> D[计算进度百分比] D --> E[更新进度条] E --> F[更新进度文本] F --> G{升级完成?} G --> |否| H[继续监控] G --> |是| I[停止定时器] ``` **图示来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L293-L324) ### 用户反馈机制 用户反馈机制通过消息框和界面元素更新提供清晰的状态信息: - **成功反馈**: 显示"升级成功"消息框 - **失败反馈**: 显示具体的错误信息 - **进度反馈**: 实时更新进度条和百分比文本 - **警告反馈**: 提示电量不足等潜在问题 ```mermaid flowchart TD A[升级开始] --> B[显示"正在升级"状态] B --> C[监控升级过程] C --> D{升级成功?} D --> |是| E[显示"升级成功"消息] D --> |否| F[显示错误详情] E --> G[关闭对话框] F --> H[保持对话框] ``` **本节来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L100-L171) - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L293-L324) ## 异常处理与恢复机制 异常处理与恢复机制确保升级过程在遇到问题时能够安全终止,并尽可能恢复到稳定状态。 ### 常见异常情况 升级过程中可能遇到的异常情况包括: - **设备连接中断**: 设备在升级过程中断开连接 - **文件下载失败**: 无法从服务器下载升级文件 - **电量不足**: 设备电量过低,无法安全执行升级 - **超时错误**: 操作在规定时间内未完成 - **权限不足**: 缺少执行升级所需的权限 ### 异常处理策略 针对不同异常情况,系统采用相应的处理策略: ```mermaid flowchart TD A[检测到异常] --> B{异常类型} B --> |文件下载失败| C[删除已下载的临时文件] B --> |电量不足| D[终止升级并提示充电] B --> |超时错误| E[释放资源并关闭连接] B --> |权限不足| F[提示用户检查权限] C --> G[清理资源] D --> G E --> G F --> G G --> H[显示错误信息] ``` **图示来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L247-L262) - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L363-L370) **本节来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L247-L262) - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L363-L370) ## 版本兼容性考虑 版本兼容性是固件升级过程中需要重点考虑的问题,确保新固件与现有硬件和软件环境的兼容性。 ### 兼容性检查 在执行升级前,系统应进行以下兼容性检查: - **硬件版本检查**: 确认固件与设备硬件版本匹配 - **软件版本检查**: 确保升级不会破坏现有功能 - **依赖项检查**: 验证所有依赖组件的版本兼容性 - **配置兼容性**: 确保新固件支持现有配置 ### 回滚机制 为应对升级后可能出现的兼容性问题,应具备回滚机制: - **备份旧固件**: 在升级前备份当前固件 - **快速恢复**: 提供快速恢复到旧版本的功能 - **配置保留**: 确保用户配置在回滚后仍然有效 - **日志记录**: 记录升级和回滚过程,便于问题排查 虽然当前代码中未显式实现回滚机制,但通过分阶段的升级流程和临时文件管理,为实现回滚提供了基础。 **本节来源** - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L156-L157) - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L443-L495)