# Client(客户端代理) ## 设计思想 `csm-client` 是部署在医院终端设备上的 Windows 代理程序,设计为: 1. **无人值守运行** — 支持控制台模式(开发调试)和 Windows 服务模式(生产部署) 2. **自动重连** — 指数退避策略(1s → 60s),断线后 drain stale frames 3. **插件化采集** — 每个插件独立 task,通过 `watch` channel 接收配置,通过 `mpsc` channel 上报数据 4. **单入口 data channel** — 所有插件共享一个 `mpsc::channel::(1024)`,network 模块统一发送 关键设计决策: - **watch + mpsc 双通道** — `watch` 用于服务器推送配置到插件(多消费者最新值),`mpsc` 用于插件上报数据到网络层(多生产者有序队列) - **device_uid 持久化** — UUID 首次生成后写入 `device_uid.txt`,与可执行文件同目录 - **device_secret 持久化** — 注册成功后写入 `device_secret.txt`,重启后自动认证 ## 代码逻辑 ### 启动流程 ``` main() → load device_uid → load device_secret → create ClientState → create data channel (mpsc 1024) → create watch channels for each plugin config → spawn core tasks (monitor, asset, usb) → spawn plugin tasks (11 plugins) → reconnect loop: connect_and_run() with exponential backoff ``` ### 网络层 (`network/mod.rs`) - `connect_and_run()` — TCP 连接、注册/认证、双工读写循环 - `handle_server_message()` — 根据 MessageType 分发服务器下发的帧到对应 watch channel - `PluginChannels` — 持有所有插件的 `watch::Sender`,用于接收服务器推送的配置 - 注册流程:发送 Register → 收到 RegisterResponse(含 device_secret)→ 持久化 secret - 认证流程:已有 device_secret 时,心跳帧携带 HMAC-SHA256 签名 ### 插件统一模板 每个插件遵循相同模式: ```rust pub async fn start( mut config_rx: watch::Receiver, data_tx: mpsc::Sender, device_uid: String, ) { loop { tokio::select! { result = config_rx.changed() => { /* 更新 config */ } _ = interval.tick() => { if !config.enabled { continue; } // 采集数据 → Frame::new_json() → data_tx.send() } } } } ``` ### 双模式运行 - **控制台模式**: 直接 `cargo run -p csm-client`,Ctrl+C 优雅退出 - **服务模式**: `--install` 注册 Windows 服务、`--service` 以服务方式运行、`--uninstall` 卸载 ## 关联模块 - [[protocol]] — 使用 Frame 构造上报帧,解析服务器下发帧 - [[server]] — TCP 连接的对端,接收帧并处理 - [[plugins]] — 每个插件的具体实现逻辑 ## 关键文件 | 文件 | 职责 | |------|------| | `crates/client/src/main.rs` | 启动入口、插件 channel 创建、task spawn、重连循环 | | `crates/client/src/network/mod.rs` | TCP 连接、注册认证、双工读写、服务器消息分发 | | `crates/client/src/service.rs` | Windows 服务安装/卸载/运行(`#[cfg(target_os = "windows")]`) | | `crates/client/src/monitor/mod.rs` | 核心设备状态采集(CPU/内存/进程) | | `crates/client/src/asset/mod.rs` | 硬件/软件资产采集 | | `crates/client/src/usb/mod.rs` | USB 设备插拔监控 | | `crates/client/src/web_filter/mod.rs` | 上网拦截插件 | | `crates/client/src/usage_timer/mod.rs` | 使用时长记录插件 | | `crates/client/src/software_blocker/mod.rs` | 软件禁止安装插件 | | `crates/client/src/popup_blocker/mod.rs` | 弹窗拦截插件 | | `crates/client/src/usb_audit/mod.rs` | U盘文件操作审计插件 | | `crates/client/src/watermark/mod.rs` | 屏幕水印插件 | | `crates/client/src/disk_encryption/mod.rs` | 磁盘加密检测插件 | | `crates/client/src/print_audit/mod.rs` | 打印审计插件 | | `crates/client/src/clipboard_control/mod.rs` | 剪贴板管控插件 | | `crates/client/src/patch/mod.rs` | 补丁管理插件 |