# 大疆机场远程调试 **Repository Path**: get2bad/dji-remote-controller ## Basic Information - **Project Name**: 大疆机场远程调试 - **Description**: 大疆机场远程操作界面 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-14 - **Last Updated**: 2025-12-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DJI Airport 解禁工具 > 基于 PyQt5 的 MQTT 无人机解禁证书管理系统 ## 项目简介 这是一个现代化的 PyQt5 应用,用于通过 MQTT 协议远程对无人机进行解禁操作。项目采用模块化架构,代码清晰,易于维护和扩展。 **主要功能:** - ✅ MQTT 连接管理(自动重连) - ✅ HTTP 文件服务(局域网共享) - ✅ 设备解禁证书管理 - ✅ 配置持久化存储 - ✅ 自动检测局域网 IP - ✅ 现代化浅色主题 UI --- ## 代码运行结构 ### 项目文件树 ``` dji-cloud_api/ ├── main.py # 应用入口点 ├── requirements.txt # 依赖说明 ├── README.md # 本文档 │ ├── src/ # 模块化源代码 │ ├── __init__.py # 包初始化 │ ├── config.py # 配置管理 │ ├── http_server.py # HTTP 文件服务 │ ├── mqtt_worker.py # MQTT 连接管理 │ ├── ui/ │ │ ├── __init__.py │ │ ├── main_window.py # 主窗口 │ │ └── dialogs.py # 对话框组件 │ └── utils/ │ ├── __init__.py │ └── helper.py # 工具函数 │ ├── main_pyqt.py # 原始代码备份 └── [其他文件...] ``` --- ## 代码逻辑 ### 模块说明 #### 1. **config.py** - 配置管理 - 集中定义所有常数(APP_NAME、HTTP_PORT、WINDOW_WIDTH/HEIGHT 等) - ConfigManager 类实现 JSON 配置持久化(load/save) - 跨平台支持,配置自动存储在系统临时目录 **配置文件位置:** - macOS/Linux: `$TMPDIR/.mqtt_config.json` - Windows: `%TEMP%\.mqtt_config.json` #### 2. **http_server.py** - HTTP 文件服务 - HTTPServerThread 后台线程实现 - 自动检测局域网 IP(通过 UDP 连接到 8.8.8.8) - 提供文件复制和 URL 生成方法 - 解决 localhost 问题,支持远程设备访问 #### 3. **mqtt_worker.py** - MQTT 连接 - MQTTWorker 继承 QThread,非阻塞处理 - 自动重连机制(指数退避:1-120 秒) - 使用 PyQt5 信号/槽进行线程安全通信 - 订阅主题并接收设备回复 #### 4. **ui/main_window.py** - 主窗口 - MainWindow 窗口类,协调所有模块 - UI 初始化、样式设置、菜单栏创建 - MQTT 连接管理和自动化流程 - 命令发送、结果展示、超时管理 #### 5. **ui/dialogs.py** - 对话框 - MQTTConfigDialog:MQTT 配置窗口(Broker、Port、Username、Password) - UnlockLicenseDialog:解禁证书窗口(SN 输入、文件选择) #### 6. **utils/helper.py** - 工具函数 - `generate_unlock_command()`:生成 MQTT 解禁命令 - `calculate_file_md5()`:计算文件校验和 - `format_command_for_display()`:格式化命令用于显示 ### 数据流 #### 启动流程 ``` 应用启动 → ConfigManager 加载配置 ├─ 配置存在 → 直接连接 MQTT └─ 配置不存在 → 弹出设置对话框 → 用户配置 Broker/Port/User/Pass → MQTTWorker 连接并订阅话题 → 应用就绪 ``` #### 解禁流程 ``` 用户点击"更新证书"按钮 → 弹出 UnlockLicenseDialog(获取 SN 和证书文件) → generate_unlock_command() 生成命令 ├─ copy_file_to_server()(复制证书到临时目录) ├─ calculate_file_md5()(计算文件哈希) └─ get_file_url()(生成 LAN IP URL) → MQTTWorker.publish() 发送 MQTT 消息 → 等待设备回复(超时 30 秒) → _on_mqtt_message() 处理回复 → 显示成功或失败结果 ``` --- ## 如何使用 ### 环境要求 - Python 3.8+ - PyQt5 5.15+ - paho-mqtt 1.6+ ### 安装依赖 ```bash pip3 install -r requirements.txt ``` ### 启动应用 ```bash python3 main.py ``` ### 首次运行 应用启动时,会按以下顺序进行初始化: #### 步骤 1:检查 MQTT 配置 ``` 如果已配置 MQTT → 跳到步骤 2(连接 MQTT) 如果未配置 MQTT → 自动打开 MQTT 设置窗口 ``` **MQTT 配置窗口**: - **Broker**:MQTT 服务器地址(如:mqtt.example.com) - **Port**:端口(默认 1883) - **Username**:用户名 - **Password**:密码 - 点击"测试连接"验证设置 - 点击"保存"完成配置 #### 步骤 2:连接 MQTT ``` 应用连接到 MQTT 服务器 连接成功后自动进入步骤 3 ``` #### 步骤 3:检查设备 SN ``` 如果已配置 SN → 应用就绪,可以开始操作 如果未配置 SN → 自动打开 SN 设置窗口 ``` **SN 设置窗口**: - 输入您的设备 SN 编号 - 点击"确定"保存 - SN 会被持久化存储,下次启动时自动加载 #### 步骤 4:就绪 ``` 所有配置完成后,应用显示"✅ 就绪 - 可以开始操作" 用户可以正常使用所有功能 ``` ### 正常使用 #### 解禁设备(流程已优化) ``` 1. 点击按钮:"🔓 更新设备解禁证书" 2. 对话框打开,已配置的 SN 号会自动显示(✅ 不需要手动输入!) 3. 选择解禁证书文件 4. 点击"确定" 5. 等待设备回复(最多 30 秒) ``` #### 修改/重新配置 SN ``` 方式一:点击主窗口上方"⚙️ 设置 SN"按钮 方式二:菜单 → 设置 → 设备 SN 号 ``` #### 发送 MQTT 服务命令 ``` 1. 在界面中部的“服务命令列表”选择需要执行的操作,每个接口都有独立按钮 2. 右侧编辑区会自动填充示例 JSON,可根据需要修改 3. 点击“📡 发送命令”按钮,等待下方输出区域或状态栏提示执行结果 ``` #### 重新配置 MQTT ``` 菜单栏 → 设置 → MQTT 连接设置 ``` ### 常见问题 **Q: 应用无法连接到 MQTT?** - 检查 Broker 地址和端口是否正确 - 验证网络连接 - 检查用户名和密码是否正确 **Q: 文件 URL 显示为 localhost?** - 检查网络是否支持 UDP(IP 检测使用) - 查看防火墙设置是否允许 UDP 连接 **Q: 配置文件保存在哪里?** - macOS/Linux: `$TMPDIR/.mqtt_config.json` - Windows: `%TEMP%\.mqtt_config.json` **Q: 证书文件存储在哪里?** - 系统临时目录下的 `dji_cert_server` 文件夹 - 由系统自动清理,无需手动删除 --- ## 打包为 Windows 可执行文件 ### 1. 环境准备 1. 在 Windows 上安装 **Python 3.9+**,并勾选 “Add Python to PATH” 2. 打开 `cmd` / PowerShell,进入项目根目录 3. 安装依赖(建议使用虚拟环境): ```powershell python -m venv venv venv\Scripts\activate pip install -r requirements.txt pip install pyinstaller>=6.0.0 ``` ### 2. 快速打包方式 #### 方式一:运行 Python 脚本(推荐,可跨平台) 首先进入虚拟环境: ```powershell # Windows venv\Scripts\activate # 或 macOS/Linux source venv/bin/activate ``` 然后运行打包脚本: ```powershell python build_exe.py ``` 脚本会自动: - 📦 调用 PyInstaller,将 `main.py` 打包为单个 exe - 📂 自动收集 PyQt5 依赖与 MQTT 模块 - 💾 将 `hms.json` 和 `dji_error.json` 嵌入到同目录 - 🎨 使用 `static/icon.ico` 作为程序图标 - 📦 在 `dist/` 下生成 `大疆机场远程调试.exe` #### 方式二:直接使用批处理脚本(Windows 一键打包) **无需手动激活虚拟环境 - 脚本自动处理!** ```powershell build_windows.bat ``` 批处理脚本会自动: - 🤖 检查并自动创建/激活虚拟环境 - 📦 检查 Python 依赖和 PyInstaller - 🏗️ 执行 PyInstaller 打包 - 📂 生成可执行文件:`大疆机场远程调试.exe` - 🎨 使用 `static/icon.ico` 作为程序图标 - 📊 包含 `hms.json` 和 `dji_error.json` 数据文件 > 如需修改 exe 名称,可编辑 `build_windows.bat` 内的 `PROJECT_NAME` 变量。 #### 方式三:手动 PyInstaller 命令 ```powershell pyinstaller ^ --onefile --windowed ^ --name DJI-Airport-Unlock ^ --hidden-import PyQt5.sip ^ --hidden-import paho.mqtt.client ^ --collect-all PyQt5 ^ --icon static\icon.png ^ --add-data "hms.json;." ^ --add-data "dji_error.json;." ^ main.py ``` *在 Windows 上使用 `;` 分隔 `--add-data` 的源与目标路径。* ### 3. 常见问题 | 问题 | 解决方案 | | --- | --- | | 找不到图标文件 | 确保 `static/icon.png` 文件存在 | | 虚拟环境问题 | 运行前先执行 `venv\Scripts\activate` 激活虚拟环境 | | `ModuleNotFoundError: PyQt5.sip` | `pip install PyQt5==5.15.*` 并添加 `--hidden-import=PyQt5.sip` | | `pathlib` 冲突 | 在虚拟环境中执行 `python build_exe.py`,或卸载旧版 `pathlib` | | 同时检测到 PyQt5/6 | 卸载未使用的 Qt 绑定,或使用仓库附带的 `build_exe.py`(已自动排除 PyQt6/PySide6) | | exe 运行时被拦截 | 将 exe 添加到 Windows Defender 白名单 | ### 4. 生成结果 ``` dist/ ├── DJI-Airport-Unlock.exe # build_exe.py 默认输出 └── Python_GUI_App.exe # build_windows.bat 默认输出 ``` - exe 体积约 80~120 MB,首次运行会解压,启动可能稍慢 - 应用运行时仍会在 `%TEMP%` 下创建配置/证书缓存 - 可直接将 `dist/*.exe` 发送给测试/客户,无需额外依赖 --- ## 许可证 MIT License ## 作者 王帅 --- **祝您使用愉快!** 🚀