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, 嵌入式系统, 数据擦除, 桌面应用, 物联网