notwendig/QtRNetAnalyzer

GitHub: notwendig/QtRNetAnalyzer

一款用于分析和解码电动轮椅 R-Net 协议及 CAN 总线流量的 Qt 6 桌面工具。

Stars: 1 | Forks: 0

# QtRNetAnalyzer QtRNetAnalyzer 是一款用于 CAN 和 R-Net 流量的 Qt 6 桌面分析器。它提供实时 CAN 表、解码后的 R-Net 聚合、可标记的 R-Net 消息、实时信号绘图窗口以及模拟器/回放支持。 当前的硬件方案是 **Linux SocketCAN**。对于 Waveshare USBCAN-B / CANalyst-II 兼容硬件,请使用外部 [`waveUSBCAN_b`](https://github.com/notwendig/waveUSBCAN_b) 驱动来暴露常规的 Linux CAN 接口,例如 `can0` 和 `can1`。随后 QtRNetAnalyzer 将直接打开这些 SocketCAN 接口。 ## 当前状态 - 进行中开发的主分支:`chatgpt` - 默认硬件后端:Linux 上的 SocketCAN - 推荐的 USB-CAN 驱动:`waveUSBCAN_b` - 私有 ControlCAN/VCI 用户空间集成:已从活动路径中移除 - 模拟器/回放模式:无需硬件即可使用 ## 功能 - 实时 CAN 帧表格,包含时间戳、通道、方向、ID、DLC 和 payload - 解码后的 R-Net 表格,按 R-Net 类型键进行聚合 - 可标记的 R-Net 消息,用于信号绘图 - 实时信号绘图窗口,带有累积历史记录 - 模拟器菜单:选择源、启动一次、循环启动、停止 - 内置的合成 R-Net 轮椅/JSM 登录实验室场景,用于 UI 测试 - 通过 `can0` / `can1` 进行 Linux SocketCAN 捕获 - 支持对捕获的 CAN 帧进行 CSV/日志记录 ## 安全提示 R-Net 用于电动轮椅系统。请将此工具视为分析器和实验室工具。除非您完全了解电气、安全和法律后果,否则请勿在真实的轮椅总线上发送数据帧。对于真实的硬件分析,请尽可能首选仅监听的 CAN 配置。 ## 仓库结构 ``` . ├── .github/ GitHub CI, issue templates and PR template ├── doc/ Additional documentation and notes ├── src/ Qt/C++ source code ├── tools/ Helper scripts ├── CMakeLists.txt Top-level Qt/CMake build ├── README.md Project overview and setup notes ├── LICENSE GPL-3.0-only for source code └── LICENSE.docs CC BY-NC-SA 4.0 for documentation/analysis text ``` ## 环境要求 ### QtRNetAnalyzer - 推荐使用 Linux 进行硬件捕获 - CMake >= 3.21 - C++20 编译器 - Qt >= 6.5,包含 Core、Widgets 和 SerialBus 模块 - 硬件捕获的可选要求:Linux SocketCAN 头文件、Qt SocketCAN 插件以及可用的 CAN 接口 Fedora 示例: ``` sudo dnf install -y cmake ninja-build gcc-c++ qt6-qtbase-devel qt6-qtserialbus-devel ``` Ubuntu/Debian 示例: ``` sudo apt update sudo apt install -y build-essential cmake ninja-build qt6-base-dev libgl1-mesa-dev sudo apt install -y qt6-serialbus-dev || sudo apt install -y libqt6serialbus6-dev libqt6serialbus6-plugins ``` ### 硬件驱动 对于 Waveshare USBCAN-B / CANalyst-II 兼容设备,请安装并启动外部驱动: ``` cd ~/AndroidStudioProjects/waveUSBCAN_b sudo ./scripts/install.sh sudo systemctl enable --now waveusbcan_b-auto.service ip -details link show type can ``` 预期结果:可以看到如 `can0` 和 `can1` 等 Linux CAN 接口。 ### 设备选择菜单 QtRNetAnalyzer 现在在启动时增加了一个 **Device** 菜单。它使用 Qt SerialBus/QCanBus 向 Qt SocketCAN 插件查询当前可用的 CAN 接口,并提供以下选项: - **Auto**:传统的索引映射,例如设备索引 `0` => `can0`/`can1`。 - **waveUSBCAN_b pair**:检测到的双通道组合,如 `can0` + `can1`。 - **Single channel**:仅将检测到的一个 SocketCAN 接口作为 CAN1 打开。 在插入适配器或在 `waveUSBCAN_b` 中运行 `sudo ./scripts/install.sh` 后,请使用 **Device -> Refresh SocketCAN devices**。该菜单会更改下一次捕获时打开的设备;如果捕获已在运行,请关闭后重新打开。 在内部,这使用了 `QCanBus::availableDevices("socketcan")`。Qt 通过其 QCanBusFactory 插件机制加载 SocketCAN CAN 总线插件;QtRNetAnalyzer 并未实现自定义的 CAN 插件。 ## 构建 推荐在您的项目根目录进行本地构建: ``` cd ~/AndroidStudioProjects/QtRNetAnalyzer git checkout chatgpt cmake -S . -B build/Desktop-Debug -G Ninja -DQTRNET_ENABLE_SOCKETCAN=ON cmake --build build/Desktop-Debug -j"$(nproc)" ./build/Desktop-Debug/QtRNetAnalyzer ``` 如果您不使用 Ninja: ``` cmake -S . -B build/Desktop-Debug -DQTRNET_ENABLE_SOCKETCAN=ON cmake --build build/Desktop-Debug -j"$(nproc)" ./build/Desktop-Debug/QtRNetAnalyzer ``` 仅构建模拟器: ``` cmake -S . -B build/Desktop-Debug -DQTRNET_ENABLE_SOCKETCAN=OFF cmake --build build/Desktop-Debug -j"$(nproc)" ./build/Desktop-Debug/QtRNetAnalyzer --input candump.txt ``` ## SocketCAN / waveUSBCAN_b 使用说明 QtRNetAnalyzer 不再直接初始化 USB-CAN 适配器。它期望 SocketCAN 接口已经存在,并由 Linux 或 `waveUSBCAN_b` 服务完成配置。 当前 UI 中的接口映射: ``` Device index 0 -> can0 / can1 Device index 1 -> can2 / can3 ``` R-Net 通常以 125000 bit/s 的速率进行分析。手动仅监听设置可能如下所示: ``` sudo ip link set can0 down 2>/dev/null || true sudo ip link set can0 type can bitrate 125000 restart-ms 100 listen-only on sudo ip link set can0 up sudo ip link set can1 down 2>/dev/null || true sudo ip link set can1 type can bitrate 125000 restart-ms 100 listen-only on sudo ip link set can1 up ``` 对于有意要求 TX 的活跃实验室测试,请省略 `listen-only on` 并使用隔离的台架设置。 ## 快速硬件冒烟测试 在启动 QtRNetAnalyzer 之前,请在 GUI 外部验证驱动和接口: ``` ip -details link show type can candump can0 ``` 如果 `candump` 能接收到数据帧,QtRNetAnalyzer 也应该能够打开相应的通道。 ## 模拟与回放 QtRNetAnalyzer 可以在没有硬件的情况下使用: ``` ./build/Desktop-Debug/QtRNetAnalyzer --input path/to/candump.txt ``` 在 GUI 内部,使用“模拟”菜单: - 选择 - 加载 R-Net 轮椅模拟 (JSM 登录) - 启动 (循环) - 启动 (单次) - 停止 内置的轮椅/JSM 场景为合成的实验室数据。其目的是演练 UI、聚合和绘图路径;它并非真实的 R-Net 登录序列。 ## Open R-Net 协议致谢 R-Net 解码器进行了扩展,加入了一组基于表格的已知 CAN 帧族,这些帧族源自 Stephen Chavez 和 Specter 的公开 Open R-Net 研究。有关来源、许可和安全说明,请参见 `doc/open_rnet_decoder_attribution.md`。 导入的知识涵盖了额外的序列/身份验证、POP Quick、POP 分段/配置传输、Bluetooth 模块、cJSM、灯光/状态以及部分解码的诊断帧族。该集成仅用于解码;它不会添加新的传输自动化功能。 ## 故障排除 ### `未找到 SocketCAN interface can0` 内核驱动尚未创建该接口,或者接口名称不同。 ``` sudo systemctl status waveusbcan_b-auto.service ip -details link show type can ``` ### `can0 已关闭` 在 QtRNetAnalyzer 中按下“打开”之前,请先启用该接口: ``` sudo ip link set can0 type can bitrate 125000 restart-ms 100 sudo ip link set can0 up ``` ### 在旧的 ZIP 文件或本地实验后构建失败 从当前的 `chatgpt` 分支开始并重新干净构建: ``` cd ~/AndroidStudioProjects/QtRNetAnalyzer git checkout chatgpt rm -rf build/Desktop-Debug cmake -S . -B build/Desktop-Debug -DQTRNET_ENABLE_SOCKETCAN=ON cmake --build build/Desktop-Debug -j"$(nproc)" ``` ### 旧的 ControlCAN 或 submodule 文件仍然可见 活动的 SocketCAN 路径不需要专有的 ControlCAN SDK 文件,也不需要旧的 `waveshares_USBCAN_B` 用户空间 submodule。如果这些文件在本地仍被跟踪,并且您想要一个纯净的仅包含 SocketCAN 的分支,请显式删除它们: ``` git rm -f .gitmodules third_party/waveshares_USBCAN_B 2>/dev/null || true rm -rf .git/modules/third_party/waveshares_USBCAN_B ``` ## GitHub CI 该仓库在 `.github/workflows/ci.yml` 下包含一个 GitHub Actions 工作流。它会针对 `main` 和 `chatgpt` 分支的推送和拉取请求执行 Linux Qt6/CMake 构建。 ## 许可 源代码采用 GPL-3.0-only 许可。请参见 `LICENSE`。 文档、协议说明和分析文本采用 CC BY-NC-SA 4.0 许可。请参见 `LICENSE.docs`。 第三方驱动、供应商 SDK、数据手册和硬件文档归其各自所有者所有,仅应在其许可允许的情况下重新分发。 ## 作者 / 鸣谢 - Jürgen Willi Sievers, JSievers@NadiSoft.de - ChatGPT 辅助的开发与分析 ### CSV 日志 `Start CSV Log` 现在仅启动内存中的捕获缓冲区。在启动时不会请求文件名。 当按下 `Stop CSV Log` 时,QtRNetAnalyzer 会询问输出文件名。建议的默认值为: ``` /R-Netlog-YYYYMMDD-HHMMSS.csv ``` 这使得短时间的测试捕获变得快捷,并避免了在丢弃捕获时创建不需要的文件。
标签:Bash脚本, C++, CAN总线, Qt6, 嵌入式系统, 数据擦除, 桌面应用, 物联网