Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

17 KiB
Raw Permalink Blame History

固件升级问题

**本文引用的文件** - [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt) - [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp) - [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp) - [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp) - [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp) - [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp) - [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat) - [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat) - [License-GD20.bat](file://tools/License-GD20.bat) - [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp) - [http_client.h](file://h/httpClient/http_client.h)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件系统性梳理固件升级过程中可能出现的问题与解决策略,重点围绕以下方面:

  • 网络连接失败、服务器不可达、文件下载中断、校验错误等常见问题
  • 解析日志“Could not resolve host: update.geomative.com”的根本原因与定位方法
  • LicenseUpgrade.cpp 中升级流程的实现机制,包括 HTTP 请求处理与文件传输逻辑
  • 提供解决方案:检查网络、配置代理、手动下载固件包等
  • 指导用户使用 IAP-GD10.bat 等批处理脚本进行离线升级,并验证升级结果
  • 为技术支持人员提供恢复模式的操作指南

项目结构

本仓库包含升级相关的 UI 交互、网络传输、文件下载、DFU 烧写与批处理脚本等模块。关键路径如下:

  • 升级 UI 与流程控制:cpp/Operator/LicenseUpgrade.cpp
  • 文件下载与传输:cpp/Tools/FileTransfer_crul.cpp、cpp/Tools/FileTransfer.cpp、cpp/Tools/HttpDownload.cpp
  • 网络连接与重连:cpp/Tools/NetWorkOper.cpp
  • 日志与诊断:LOG/upg_geo_filetrans_log.txt
  • 离线升级脚本:Install/Geomative Studio/tools/IAP-GD10.bat、Install/Geomative Studio/tools/License-GD10.bat、tools/License-GD20.bat
  • 在线固件升级流程:cpp/Tools/checkupdate.cpp
graph TB
subgraph "升级UI层"
LU["LicenseUpgrade.cpp"]
end
subgraph "传输与下载层"
FTC["FileTransfer_crul.cpp"]
FT["FileTransfer.cpp"]
HD["HttpDownload.cpp"]
end
subgraph "网络与重连"
NWO["NetWorkOper.cpp"]
end
subgraph "日志与诊断"
LOG["upg_geo_filetrans_log.txt"]
end
subgraph "离线脚本"
IAP["IAP-GD10.bat"]
LGD10["License-GD10.bat"]
LGD20["License-GD20.bat"]
end
subgraph "在线升级"
CU["checkupdate.cpp"]
end
LU --> FTC
LU --> FT
FTC --> LOG
IAP --> LGD10
LGD10 --> LGD20
CU --> LGD20
NWO --> LU

图表来源

章节来源

核心组件

  • LicenseUpgrade:负责选择设备、下载 License 文件、触发 DFU 烧写脚本、显示进度与结果。
  • FileTransfer_crul:基于 libcurl 的 HTTP 下载封装,支持超时、进度回调、错误日志与 IPv4 DNS 解析。
  • FileTransfer:通用文件传输工具接口与辅助函数。
  • HttpDownload:基于 Winsock 的多线程断点续传下载器(备用/对比实现)。
  • NetWorkOper:网络连接管理、重连、控制命令收发与设备上下线通知。
  • 日志:upg_geo_filetrans_log.txt 记录 DNS 解析失败等错误。
  • 批处理脚本:IAP-GD10.bat、License-GD10.bat、License-GD20.bat 实现离线 DFU 烧写。
  • checkupdate:在线固件升级流程(文件准备、复制、发送、校验)。

章节来源

架构总览

升级流程分为在线与离线两条主线:

  • 在线升级:LicenseUpgrade 触发 FileTransfer_crul 下载 FACTORY/LICENSE,随后通过批处理脚本执行 DFU 烧写。
  • 离线升级:IAP-GD10.bat 先生成 DFU 文件,再通过 DfuSeCommand 烧写;License-GD10/20.bat 分别烧写 FACTORY 与 LICENSE。
sequenceDiagram
participant UI as "LicenseUpgrade.cpp"
participant FT as "FileTransfer_crul.cpp"
participant LOG as "upg_geo_filetrans_log.txt"
participant BAT as "License-GD10.bat/License-GD20.bat"
participant DFU as "DfuSeCommand"
participant DEV as "目标设备"
UI->>FT : 设置URL/路径/超时/进度
FT->>FT : GetUrlResConValild() 测试URL可达性(IPv4)
FT-->>UI : 返回下载结果
alt 成功
UI->>BAT : 启动烧写脚本
BAT->>DFU : 生成并烧写 FACTORY/LIC
DFU-->>DEV : 写入固件
UI-->>UI : 显示升级成功
else 失败
FT-->>LOG : 记录错误日志
UI-->>UI : 弹窗提示网络/权限/超时
end

图表来源

详细组件分析

组件ALicenseUpgrade(在线升级流程)

  • 功能要点
    • 设备选择与在线状态检查
    • 下载 FACTORY 与 LICENSE 文件(通过 FileTransfer_crul
    • 触发 DFU 烧写脚本(License-GD10/20.bat
    • 进度条与百分比显示
  • 关键流程
    • 初始化 FileTransfer,设置下载路径、名称、超时与进度回调
    • 拼接下载 URLtheApp.m_strUpgUrl + 设备序列号 + 文件名)
    • 循环下载 FACTORY/LICENSE,失败则清理并返回
    • 下载完成后执行 DFU 烧写脚本,等待进程结束并提示结果
flowchart TD
Start(["进入 GetLicenseFile"]) --> Init["初始化 FileTransfer<br/>设置超时/进度/路径"]
Init --> Loop{"遍历 FACTORY/LICENSE"}
Loop --> |设置URL/名称| SetOpt["SetOption(OPT_URL_ADDRESS/OPT_DOWNLOAD_NAME)"]
SetOpt --> Download["DownloadFile()"]
Download --> Ok{"下载成功?"}
Ok --> |否| Cleanup["清理/删除 FACTORY 并返回失败"]
Ok --> |是| Next["更新进度/显示100%"]
Next --> Loop
Loop --> |完成| Burn["CreateProcess 启动 License-GD10/20.bat"]
Burn --> Wait["WaitForSingleObject 等待进程"]
Wait --> Result{"结果判定"}
Result --> |成功| Done(["升级成功"])
Result --> |超时/失败| Fail(["升级失败"])

图表来源

章节来源

组件BFileTransfer_crulHTTP 下载与错误日志)

  • 功能要点
    • 初始化 libcurl,版本检查
    • 设置 URL、超时、进度回调、错误缓冲
    • GetUrlResConValild 对 URL 进行 HEAD 测试,强制使用 IPv4 解析,最多重试 3 次
    • DownloadFile 执行实际下载,写入本地文件,记录详细日志
  • 错误日志
    • 当 curl_perform 失败时,记录错误信息与 URL
    • 当文件写入失败或字节数不匹配时,记录错误日志
flowchart TD
A["SetOption 配置"] --> B["GetUrlResConValild(URL)"]
B --> C{"curl_perform 成功?"}
C --> |否| E["记录错误日志<br/>返回失败"]
C --> |是| D["DownloadFile() 执行下载"]
D --> F{"CURLE_OK?"}
F --> |否| G["弹窗提示网络环境<br/>记录错误日志"]
F --> |是| H["关闭句柄/返回成功"]

图表来源

章节来源

组件C:离线升级脚本(IAP-GD10.bat 与 License-GD10/20.bat

  • IAP-GD10.bat
    • 生成 APP.dfu 并通过 DfuSeCommand 烧写
    • 删除临时 dfu 文件
  • License-GD10/20.bat
    • 先烧写 FACTORY,再烧写 LICENSE
    • 使用 DfuCreateFile 与 DfuSeCommand
sequenceDiagram
participant U as "用户"
participant IAP as "IAP-GD10.bat"
participant DFU as "DfuCreateFile/DfuSeCommand"
participant L10 as "License-GD10.bat"
participant L20 as "License-GD20.bat"
U->>IAP : 双击运行
IAP->>DFU : 生成APP.dfu并烧写
U->>L10 : 双击运行
L10->>DFU : 生成并烧写 FACTORY
U->>L20 : 双击运行
L20->>DFU : 生成并烧写 LICENSE

图表来源

  • [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
  • [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
  • License-GD20.bat

章节来源

  • [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
  • [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
  • License-GD20.bat

组件D:在线固件升级(checkupdate.cpp

  • 功能要点
    • 准备固件文件,复制到 .\firmware\ 目录
    • 通过设备命令删除 SD 卡上的旧文件
    • 发送新文件到 /SD/ 并校验结果
  • 适用场景
    • 在线升级功能板固件,与 License 升级流程互补

章节来源

依赖关系分析

  • LicenseUpgrade 依赖 FileTransfer_crul 进行 HTTP 下载
  • FileTransfer_crul 依赖 libcurl,内部强制 IPv4 解析并带重试
  • NetWorkOper 提供网络连接与重连能力,保障在线通信
  • 批处理脚本依赖 dfu 工具链完成离线烧写
  • 日志文件 upg_geo_filetrans_log.txt 记录 DNS 解析失败等错误
graph LR
LU["LicenseUpgrade.cpp"] --> FTC["FileTransfer_crul.cpp"]
FTC --> CURL["libcurl"]
NWO["NetWorkOper.cpp"] --> LU
LGD10["License-GD10.bat"] --> DFU["DfuSeCommand"]
LGD20["License-GD20.bat"] --> DFU
LOG["upg_geo_filetrans_log.txt"] --> FTC

图表来源

章节来源

性能考量

  • IPv4 强制解析与重试:GetUrlResConValild 中使用 IPv4 解析与最多 3 次重试,有助于在网络不稳定时提升成功率。
  • 进度回调与超时:DownloadFile 支持进度回调与超时设置,避免长时间阻塞。
  • 断点续传(对比实现):HttpDownload 支持多线程断点续传,适合大文件下载场景。
  • 离线烧写:批处理脚本一次性生成并烧写,减少多次交互带来的延迟。

章节来源

故障排查指南

1. 症状:DNS 解析失败(Could not resolve host

  • 现象
    • 日志出现“Could not resolve host: update.geomative.com”
  • 根因
    • DNS 解析失败或网络配置异常
    • 可能受代理、防火墙或本地 DNS 服务器影响
  • 定位步骤
    • 使用 nslookup 或 ping 测试域名解析
    • 检查系统代理与企业防火墙策略
    • 在 FileTransfer_crul 中强制使用 IPv4 解析,减少 AAAA 记录干扰
  • 解决方案
    • 更换 DNS 服务器(如 8.8.8.8 或 114.114.114.114
    • 配置系统代理或绕过代理访问
    • 使用离线脚本进行升级(IAP-GD10.bat、License-GD10/20.bat

章节来源

2. 症状:服务器不可达/超时

  • 现象
    • DownloadFile 返回失败,弹窗提示检查网络环境
  • 根因
    • 网络不稳定、服务器负载高、超时设置过短
  • 解决方案
    • 增大超时时间(SetOption(OPT_TIMEOUT)
    • 使用断点续传(HttpDownload)或重试机制
    • 离线升级(下载到本地后使用批处理脚本)

章节来源

3. 症状:文件下载中断/写入失败

  • 现象
    • 写入文件失败或写入字节数不匹配
  • 根因
    • 权限不足、磁盘空间不足、文件被占用
  • 解决方案
    • 确认 .\tools\ 目录可写且有足够空间
    • 关闭占用文件的程序
    • 重新下载并检查校验

章节来源

4. 症状:校验错误/升级失败

  • 现象
    • DFU 烧写后设备未识别或功能异常
  • 根因
    • 文件损坏、版本不兼容、烧写顺序错误
  • 解决方案
    • 重新下载并校验文件
    • 按 FACTORY -> LICENSE 的顺序烧写
    • 使用 checkupdate.cpp 的在线升级流程进行功能板固件升级

章节来源

5. 症状:网络连接不稳定

  • 现象
    • 连接中断、重连频繁
  • 根因
    • 网络波动、代理切换、设备上下线
  • 解决方案
    • 使用 NetWorkOper 的自动重连机制
    • 避免在 WiFi 模式下进行大量数据传输
    • 保持稳定的网络环境

章节来源

结论

  • 在线升级依赖稳定的网络与正确的 DNS 解析;FileTransfer_crul 提供了 IPv4 强制解析与重试机制,显著提升成功率。
  • 离线升级通过批处理脚本与 DFU 工具链实现,适用于网络受限或不可达场景。
  • 日志文件与错误提示是快速定位问题的关键,建议优先查看 upg_geo_filetrans_log.txt 与 FileTransfer_crul 的错误日志。
  • 技术支持可结合 NetWorkOper 的重连逻辑与 checkupdate.cpp 的在线升级流程,完成复杂场景下的恢复与验证。

附录

A. 使用 IAP-GD10.bat 进行离线升级

  • 步骤
    • 运行 IAP-GD10.bat 生成并烧写 APP.dfu
    • 运行 License-GD10.bat 烧写 FACTORY
    • 运行 License-GD20.bat 烧写 LICENSE
  • 验证
    • 观察脚本输出与设备指示灯状态
    • 重启设备并确认功能正常

章节来源

  • [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
  • [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
  • License-GD20.bat

B. 在线升级流程(checkupdate.cpp

  • 步骤
    • 准备固件文件并复制到 .\firmware\ 目录
    • 通过设备命令删除 SD 卡旧文件
    • 发送新文件并校验结果
  • 适用范围
    • 功能板固件升级,与 License 升级互补

章节来源