# 分布式光纤测温系统 **Repository Path**: wesouler/dts ## Basic Information - **Project Name**: 分布式光纤测温系统 - **Description**: 分布式光纤测温系统,的tui界面 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-20 - **Last Updated**: 2026-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tcpClient - 分布式光纤温度监测系统 TUI 客户端 [![Rust](https://img.shields.io/badge/rust-1.73+-orange.svg)](https://www.rust-lang.org) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20Windows%20x64-blue)](https://github.com/kevin-sung/tcpClient) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) 一款高性能的终端用户界面 (TUI) 客户端,用于监控分布式光纤温度传感系统。通过 TCP 连接实时接收光纤温度传感器的温度数据、断纤报警和温度异常警报。 **作者**: kevin_sung@foxmail.com --- ## 🌟 功能特性 ### 实时监控 - **TCP 数据流**: 通过 TCP/IP 连接光纤温度传感器 - **多通道支持**: 同时监控多达 256 个通道 - **高速采样**: 支持 200 MHz 采样率(0.5 米空间分辨率) - **数据包统计**: 实时跟踪接收的数据包数量和字节数 ### 多种视图模式 - **详情视图**: 检查单个温度数据包,带颜色编码的读数 - 温度数据带视觉阈值(蓝色 < 0°C,绿色 0-40°C,黄色 40-60°C,红色 > 60°C) - 通道信息和位置映射 - 可滚动的详细统计 - **曲线视图**: 可视化沿光纤长度的温度趋势 - 多通道叠加(最多 4 个通道) - 带布莱叶点的交互式图表 - 基于温度范围的自动 Y 轴缩放 - X 轴显示距离(米) ### 报警处理 - **🔥 定温报警**: 绝对温度超过阈值时触发 - **⚡ 温升速率报警**: 温度快速变化时触发 (dT/dt) - **💔 断纤报警**: 光纤电缆损坏的即时通知 - 精确的断点位置(米) - 通道识别 ### 跨平台 - **Linux 原生**: 一流的原生支持 - **Windows x64**: 完整的 MinGW 交叉编译支持 - **优化二进制**: LTO 优化后约 1.5-2 MB 的发布版本 - **无运行时依赖**: 静态链接便于部署 --- ## 📦 安装 ### 前置要求 - **Rust**: 1.73 或更高版本 ([通过 rustup 安装](https://rustup.rs/)) - **Linux**: 无需额外依赖 - **Windows 交叉编译** (从 Linux): ```bash sudo apt install mingw-w64 rustup target add x86_64-pc-windows-gnu ``` ### 从源码构建 ```bash # 克隆仓库 git clone https://github.com/kevin-sung/tcpClient.git cd tcpClient # 调试构建 cargo build # 优化的发布构建(推荐) cargo build --release ``` ### Windows x64 交叉编译 ```bash # 方法 1: 直接构建(需要 mingw-w64) cargo build --release --target x86_64-pc-windows-gnu # 方法 2: 使用提供的脚本 ./build-windows-cross.sh # 方法 3: Docker 构建(无需安装 mingw) ./docker-build-windows.sh ``` **输出位置**: - Linux: `target/release/tcpClient` - Windows: `target/x86_64-pc-windows-gnu/release/tcpClient.exe` --- ## 🚀 使用方法 ### 基本用法 ```bash # 连接到 TCP 服务器 ./tcpClient <端口> # 示例:连接到本地传感器,端口 5000 ./tcpClient 192.168.1.100 5000 # 示例:连接到远程监控站 ./tcpClient 10.0.0.50 8080 ``` ### 命令行参数 | 参数 | 说明 | 约束 | |------|------|------| | `IP 地址` | TCP 服务器 IP 地址 | 有效的 IPv4 或 IPv6 | | `端口` | TCP 服务器端口 | 1-65535 | **错误处理**: - 缺少参数 → 程序退出并显示错误信息 - IP 无效 → "InvalidIpAddress" 错误 - 端口超出范围 → "PortOutOfRange" 错误 - 端口格式无效 → "InvalidPortNumber" 错误 --- ## 🎮 键盘控制 ### 导航(详情视图) | 按键 | 操作 | |------|------| | `↑` / `k` | 向上选择 | | `↓` / `j` | 向下选择 | | `PageUp` | 向上跳转 5 个数据包 | | `PageDown` | 向下跳转 5 个数据包 | | `j` (详情中) | 向下滚动详情内容 5 行 | | `k` (详情中) | 向上滚动详情内容 5 行 | ### 视图模式 | 按键 | 操作 | |------|------| | `C` / `c` | 切换到**曲线视图**(温度图表) | | `V` / `v` | 切换到**详情视图**(数据包检查) | ### 通用 | 按键 | 操作 | |------|------| | `q` / `Esc` | 退出程序 | --- ## 📊 用户界面 ### 屏幕布局 ``` ┌─────────────────────────────────────────────────────────────┐ │ 🌡️ 光纤温度 | ● 在线 | 数据包:123 | 字节:45678 │ <- 状态栏 ├─────────────────────────────────────────────────────────────┤ │ 数据包 [ 12/123 ] ↑↓ │ │ 🌡️ ID:1 通道:1/8 [ 0- 50 米] 100 点 │ │ 💔断纤 ID:2 通道:3 位置:125.5 米 │ <- 数据包列表 │ 🔥定温 ID:3 5 个报警 │ │ ⚡温升 ID:4 3 个报警 │ ├─────────────────────────────────────────────────────────────┤ │ 温度数据 │ │ ID:1 | 通道:1/8 | 位置:0.0 米 -> 50.0 米 | 点数:100 │ │ 序号 温度 序号 温度 ... │ <- 详情面板 │ 0 25.3 1 26.1 │ │ 2 24.8 3 25.9 │ ├─────────────────────────────────────────────────────────────┤ │ ↑/↓=导航 C=曲线 V=详情 q=退出 │ <- 页脚 └─────────────────────────────────────────────────────────────┘ ``` ### 曲线视图 ``` ┌─────────────────────────────────────────────────────────────┐ │ 温度曲线 (4 个通道) - 'V'=详情 │ │ │ │ 温度 (°C) │ │ 80 ┤ ╭╮ │ │ 60 ┤ ╭──╮╯╰╮ │ │ 40 ┤ ╭────╯ ╰──╮ │ │ 20 ┤──────╮╭────╯ ╰─── │ │ 0 ┼──────╯╰───────────────────────── │ │ 0 米 50 米 100 米 │ │ 位置 (m) │ │ │ │ 图例:通道 1 (绿) 通道 2 (青) 通道 3 (黄) 通道 4 (洋红) │ └─────────────────────────────────────────────────────────────┘ ``` ### 颜色编码 | 温度范围 | 颜色 | 含义 | |----------|------|------| | < 0°C | 蓝色 | 冰点以下 | | 0-40°C | 绿色 | 正常工作范围 | | 40-60°C | 黄色 | 高温警告 | | > 60°C | 红色 | 严重高温 | --- ## 🔧 协议规格 ### 二进制协议概述 客户端通过 TCP 使用自定义二进制协议与光纤温度传感器通信。 #### 魔数字节 所有数据包以头部开始:`7B 07 AF EC 66 48 C5`(7 字节) #### 数据包类型 | 起始字节 | 类型 | 说明 | |----------|------|------| | `0xAA` | 温度数据 | 常规温度读数 | | `0xBC` | 断纤 | 光纤电缆断纤报警 | | `0xA6` | 定温报警 | 绝对温度阈值超限 | | `0xA5` | 温升速率报警 | 温度上升速率超限 | #### 数据包结构 ``` 温度数据包 (0xAA): ┌─────────┬─────────────┬──────────┬──────────────────────────┐ | 头部 | 数据包信息 | 通道信息 | 温度点... | | 8 字节 | 14 字节 | | (N × 2 字节) │ └─────────┴─────────────┴──────────┴──────────────────────────┘ 断纤数据包 (0xBC): ┌─────────┬─────────────┬──────────┬──────────┐ | 头部 | 数据包信息 | 通道 | 位置 │ | 8 字节 | 6 字节 | 1 字节 | 2 字节 │ └─────────┴─────────────┴──────────┴──────────┘ ``` #### 温度计算 原始温度值编码为 16 位整数: ``` 温度 (°C) = (原始值 - 20000) / 100.0 ``` 示例: - 原始值:`0x4E20` (20000) → 0.0°C - 原始值:`0x5208` (21000) → 10.0°C - 原始值:`0x4A30` (19000) → -10.0°C #### 位置计算 位置值以 0.5 米为单位: ``` 位置 (米) = 位置值 × 0.5 ``` 示例: - 值:`100` → 50.0 米 - 值:`250` → 125.0 米 --- ## 🛠️ 开发 ### 项目结构 ``` tcpClient/ ├── Cargo.toml # 项目清单和依赖 ├── Cargo.lock # 锁定的依赖 ├── src/ │ ├── main.rs # TUI 应用程序入口 │ └── lib.rs # 协议解析器库 ├── .cargo/ │ └── config.toml # Cargo 配置(链接器设置) ├── build-windows.bat # Windows 原生构建脚本 ├── build-windows-cross.sh # Linux 交叉编译脚本 ├── docker-build-windows.sh # 基于 Docker 的 Windows 构建 └── cross-compile.sh # 通用交叉编译脚本 ``` ### 依赖项 | 库 | 版本 | 用途 | |----|------|------| | `ratatui` | 0.26 | 终端 UI 框架 | | `crossterm` | 0.27 | 跨平台终端操作 | ### 构建优化 项目使用激进的发布优化: ```toml [profile.release] opt-level = 3 # 最大优化 lto = "fat" # 链接时优化 codegen-units = 1 # 单个代码生成单元 panic = "abort" # panic 时中止(更小的二进制) strip = true # 移除调试符号 ``` ### 运行测试 ```bash # 运行所有测试 cargo test # 带输出运行 cargo test -- --nocapture # 运行特定测试 cargo test format_hex_hello_world ``` ### 代码风格 ```bash # 格式化代码 cargo fmt # 检查代码风格 cargo fmt --check # 运行 Clippy 检查器 cargo clippy --all-targets ``` --- ## 📝 示例 ### 监控温度趋势 ```bash # 连接到传感器并观看实时数据 ./tcpClient 192.168.20.9 5000 # 按 'C' 切换到曲线视图查看温度分布 # 按 'V' 返回详情视图 ``` ### 调试协议 ```bash # 在一个终端中,运行发送测试数据的 TCP 服务器 nc -l -p 5000 # 在另一个终端中,运行 tcpClient ./tcpClient 127.0.0.1 5000 # 从 netcat 发送测试数据包 echo -ne '\xAA\x7B\x07\xAF\xEC\x66\x48\xC5\x01\x10\x00\x00\x00\x01\x00\x00\x00\x64\x00\x08\x01\x4E\x20' | nc localhost 5000 ``` ### 会话统计 退出后,显示会话摘要: ``` Session: 45678 bytes, 123 packets 会话:45678 字节,123 个数据包 ``` --- ## 🐛 故障排除 ### 常见问题 #### 连接被拒绝 ``` Error: Connection refused (os error 111) 错误:连接被拒绝(操作系统错误 111) ``` **解决方案**: 验证 TCP 服务器是否正在运行,IP/端口是否正确。 #### 未收到数据 ``` Packets: 0 Bytes: 0 数据包:0 字节:0 ``` **解决方案**: 检查网络连接和防火墙规则。确保服务器正在发送数据。 #### TUI 显示问题 **解决方案**: 确保终端支持 UTF-8 并有足够大小(最小 80×24)。 #### Windows: 中文字符显示不正确 ```cmd # 运行前设置 UTF-8 代码页 chcp 65001 tcpClient.exe 192.168.20.9 5000 ``` #### 交叉编译:找不到链接器 ``` error: linker `x86_64-w64-mingw32-gcc` not found 错误:找不到链接器 `x86_64-w64-mingw32-gcc` ``` **解决方案**: ```bash sudo apt install mingw-w64 # 或使用 Docker 构建方法 ``` ### 性能调优 - **高 CPU 使用率**: 降低 `main.rs` 中的刷新率(当前 50ms) - **内存使用**: 保留数据包历史;长时间会话请重启客户端 - **网络延迟**: 确保局域网连接以进行实时监控 --- ## 📋 路线图 - [ ] 导出温度数据到 CSV - [ ] 可配置的报警阈值 - [ ] 多服务器连接(标签页) - [ ] 历史数据回放 - [ ] WebSocket 支持 - [ ] 移动响应式 TUI - [ ] Docker 容器化 --- ## 📄 许可证 本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。 --- ## 🤝 贡献 1. Fork 仓库 2. 创建功能分支 (`git checkout -b feature/amazing-feature`) 3. 提交更改 (`git commit -m 'Add amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 创建 Pull Request ### 贡献指南 - 遵循 Rust 命名约定 - 为新功能添加测试 - 更新文档 - 确保 `cargo clippy` 通过 --- ## 📧 联系方式 **作者**: kevin_sung@foxmail.com 如有问题、错误报告或功能请求,请在 GitHub 上创建 issue 或直接联系作者。 --- ## 🙏 致谢 - [ratatui](https://github.com/ratatui-org/ratatui) - 优秀的 Rust TUI 库 - [crossterm](https://github.com/crossterm-rs/crossterm) - 跨平台终端操作库 - [Rust 编程语言](https://www.rust-lang.org/) - 重新定义系统编程 --- *使用 Rust 构建 ❤️*