项目介绍
实时采集 Netgear R7000 路由器运行数据,上传至 InfluxDB,使用 Grafana 可视化展示
核心特性
- SSH 持久连接:基于 russh(纯 Rust SSH),建立一次会话后复用,支持自动重连(指数退避 1/2/4/8/16/32/60s)和 KeepAlive 探活
- 9 个采集器:CPU、内存、负载、温度、网络流量、WiFi 客户端数、连接跟踪、进程、运行时间
- 单文件分发:配置模板通过 include_str! 内嵌到二进制,首次启动自动生成 config.toml,无需额外文件
- 配置热加载:修改 config.toml 保存后 30 秒内自动生效,无需重启
- 断线恢复:InfluxDB 写入失败时自动缓存到本地磁盘,恢复后回放
- 跨平台:Windows / Linux 原生支持,rustls-tls 替代 OpenSSL 依赖
效果图




架构图
flowchart LR
Router["Netgear R7000"] -->|"SSH 持久连接"| SSH["SSH Session"]
SSH --> Collector["Collector × 9"]
Collector --> Parser["Parser"]
Parser --> Metric["Metric"]
Metric --> Channel["Channel"]
Channel --> Writer["Writer"]
Writer --> InfluxDB["InfluxDB"]
InfluxDB --> Grafana["Grafana"]
技术栈
| 组件 | 技术 | 说明 |
|---|---|---|
| 语言 | Rust | 零成本抽象,内存安全 |
| 异步运行时 | Tokio 1.40 | full feature |
| SSH 客户端 | russh 0.50 | 纯 Rust,跨平台,无系统 SSH 依赖 |
| HTTP 客户端 | reqwest 0.12 + rustls-tls | 纯 Rust TLS,不依赖系统 OpenSSL |
| 时序数据库 | InfluxDB 2.7.10 | 数据批量写入 + Gzip 压缩 |
| 可视化 | Grafana 13.x | Schema V2,Flux 查询语言 |
| 配置 | TOML | 编译期内嵌 + 运行时热加载 |
| 日志 | tracing + tracing-subscriber | 结构化日志,支持文件滚动 |
采集器
| 采集器 | 数据源 | Measurement | 字段 |
|---|---|---|---|
| CPU | cat /proc/stat | cpu | usage, user system, idle iowait |
| 内存 | cat /proc/meminfo | memory | total, used free, available buffers, cached swap_total, swap_free used_percent |
| 负载 | cat /proc/loadavg | loadavg | load1, load5, load15 running_processes total_processes |
| 温度 | /proc/dmu/temperature wl phy_tempsense | temperature | celsius tag zone: cpu/wifi_2g/wifi_5g |
| 网络流量 | cat /proc/net/dev | network | rx_bytes_per_sec tx_bytes_per_sec rx_packets_per_sec tx_packets_per_sec tag interface: ppp0/vlan1/vlan2/eth0/eth1/eth2/br0 |
| WiFi 客户端数 | wl -i ethX assoclist | wifi_clients | count tag band: 2.4G/5G |
| 连接跟踪 | /proc/sys/net/netfilter/nf_conntrack_count max | conntrack | count max usage_percent |
| 进程 | cat /proc/loadavg | process | running, total |
| 时间 | cat /proc/uptime | uptime | uptime_sec uptime_days |
接口映射
| 接口 | 用途 | 说明 |
|---|---|---|
| ppp0 | WAN 外网(PPPoE 拨号) | 承载互联网上下行流量 |
| vlan1 | 局域网(LAN 1-4) | 对应 4 个物理 LAN 端口 |
| vlan2 | WAN VLAN(通常未使用) | 在 Asuswrt-Merlin 上 PPPoE不经过它 |
| eth0 | 交换机内部接口 | CPU 与 BCM53011 交换芯片 之间的内部链路 |
| eth1 | 2.4GHz WiFi | 2.4G 无线 AP 接口 |
| eth2 | 5GHz WiFi | 5G 无线 AP 接口 |
| br0 | LAN 桥接(含 WiFi) | 软件桥接:vlan1 + eth1 + eth2 |
快速开始
1. 下载项目
不提供对应平台的单文件二进制,参考 scripts/build.ps1(Windows)或 scripts/build.sh(Linux)自行构建
git clone https://git.sg7z.top/sg7z/NetgearR7000-RouterCollector.git
2. 编译项目
首次运行会在同目录自动生成 config.toml 配置模板
# 下载依赖并编译(快速)
# 文件生成在 target\release\NetgearR7000-RouterCollector.exe
cargo build --release
# Windows Pack(推荐)
scripts\build.ps1
# Linux / WSL Pack(推荐)
chmod +x scripts/build.sh && ./scripts/build.sh
启动项目
建议使用 screen 挂载后台运行
首次启动时会在当前根目录生成 config.toml 文件。不想启动后生成文件,可复制项目的 config/config.example.toml 文件到 dist 目录,并重命名为 config.toml
# Windows
./dist/NetgearR7000-RouterCollector-Windows-x64.exe
# Linux / WSL
./dist/NetgearR7000-RouterCollector-Linux-x64
# 创建新会话
# 示例:screen -S Netgear-R7000
screen -S 会话名
# 列出所有会话
screen -ls
# 重新连接会话
# 示例:screen -r 366543
screen -r 会话名或PID
# 分离会话
# 断开你与这个会话的连接
# 但会话和里面运行的程序继续留在后台
# 用 screen -r 会话名或PID 重新连回去
Ctrl+A → D
# 关闭会话
# 先进会话,在会话里输入 exit 即可销毁
screen -r 会话名或PID
exit
编辑配置
保存后程序在 30 秒内自动热加载,或重启立即生效
打开生成或复制的 config.toml,根据注释填入实际参数。重点 router、influxdb 参数需填写,其他内容根据需求自行修改。
[log]
level = "info"
[router]
host = "192.168.50.1"
port = 22
username = ""
password = ""
# private_key = "~/.ssh/id_rsa"
# known_hosts = "known_hosts"
# strict_host_key_checking = true
keepalive_sec = 15
connect_timeout_sec = 10
[sampling]
cpu = 30
memory = 30
loadavg = 30
temperature = 30
network = 30
wifi = 30
conntrack = 30
process = 30
uptime = 30
[collectors]
cpu = true
memory = true
loadavg = true
temperature = true
wifi = true
network = true
conntrack = true
process = true
uptime = true
[collectors.temperature_detail]
cpu = true
wifi_2g = true
wifi_5g = true
[collectors.wifi_detail]
band_2g = true
band_5g = true
[influxdb]
url = ""
bucket = "NetgearR7000"
organization = "influxdb"
token = ""
batch_size = 5000
batch_interval_sec = 5
timeout_sec = 10
gzip = true
max_retries = 3
buffer_dir = "./buffer"
buffer_capacity = 100000Grafana
导入 grafana.json 或 grafana.yaml 到 Grafana 13.x,选择 InfluxDB 数据源(Flux 语言),即可查看完整监控面板:
- CPU 使用率(总览 + 各核心)
- 内存分配(可用 + 已用)/ 系统缓存(缓冲 + 缓存)
- 运行负载(Load Average)
- CPU / WiFi 温度
- 网络流量(ppp0 / vlan1 / vlan2 / eth0 / eth1 / eth2 / br0,每个接口下载与上传在同一图表)
- WiFi 客户端数
- Conntrack 使用率 / 进程数 / Uptime
配置参考
完整配置项见 config/config.example.toml
| 参数 | 说明 |
|---|---|
| [log] | 日志级别 |
| [router] | SSH 连接参数 |
| [sampling] | 各采集器采样间隔(秒),默认全部 30s |
| [collectors] | 采集器启用/禁用开关(默认全部启用) |
| [influxdb] | InfluxDB v2 连接参数 |
配置文件查找顺序
程序启动时按以下优先级查找 config.toml:
- 环境变量 ROUTER_COLLECTOR_CONFIG 指定的路径(空/空白视为未设置;目录路径自动拼接 config.toml)
- 运行目录下的 ./config.toml(生产环境)
- 项目内的 ./config/config.toml(开发环境)
- 以上都不存在 → 回退到 ./config.toml(启动自动生成模板)
flowchart TD
A[程序启动] --> B{./config.toml 存在?}
B -- 是 --> C[使用 ./config.toml<br/>生产环境配置]
B -- 否 --> D{./config/config.toml 存在?}
D -- 是 --> E[使用 ./config/config.toml<br/>开发环境配置]
D -- 否 --> F[自动生成 ./config.toml<br/>首次启动兜底]
style C fill:#2ea043,stroke:#2ea043,color:#fff
style E fill:#1f6feb,stroke:#1f6feb,color:#fff
style F fill:#d29922,stroke:#d29922,color:#fff| 优先级 | 配置文件 | 场景 | 说明 |
|---|---|---|---|
| 1 | ./config.toml | 生产环境 | 运行目录下存在即使用,部署时生成 |
| 2 | ./config/config.toml | 开发环境 | 项目内配置,仅开发时使用 |
| 3 | 自动生成模板 | 首次启动 | 以上均不存在时,生成默认模板并启动 |
SSH 连接可靠性
| 机制 | 说明 |
|---|---|
| 初始连接 | 同步建立,3 次重试(1/2/4s 退避),确保 SSH 就绪后再启动采集器 |
| 密钥校验 | 默认 TOFU 模式:首次连接自动信任并记录到 known_hosts 可设置 strict_host_key_checking = true 启用严格模式 未知密钥拒绝连接并输出指纹 |
| KeepAlive | 后台单独 Task 周期执行 echo ok,不干扰采集器 |
| 自动重连 | AtomicBool CAS 选举唯一重连,Notify 广播唤醒所有等待采集器 |
| 命令重试 | SSH 命令失败时触发一次重连并重试 |
| 异常检测 | 未收到 ExitStatus 的通道异常关闭返回 Err 触发重连,防止空输出被误认为正常 |
项目结构
NetgearR7000-RouterCollector
├── .cargo/
│ └── config.toml # 静态链接配置
├── config/
│ ├── config.example.toml # 配置模板(编译时内嵌到二进制)
│ └── config.toml # 实际配置(开发环境使用)
├── scripts/
│ ├── build.ps1 # Windows 打包脚本
│ └── build.sh # Linux 打包脚本
├── src/
│ ├── main.rs # 程序主入口
│ ├── config/ # 配置定义与加载
│ ├── ssh/ # SSH 客户端
│ ├── collector/ # 九个采集器
│ ├── parser/ # 纯函数解析器
│ ├── metrics/ # 统一指标模型
│ ├── models/ # 路由器模型
│ ├── scheduler/ # 采集任务调度
│ ├── writer/ # InfluxDB
│ └── utils/ # 日志初始化
├── Cargo.toml # 项目依赖
├── LICENSE # 许可证
└── README.md # 项目文档参考资料
Netgear R7000: Block Diagram / Network Architecture
相关文章
许可证
请查看 LICENSE 文件以获取 MIT 许可信息

