|
|
3 giorni fa | |
|---|---|---|
| assets | 1 mese fa | |
| mppt_monitor | 4 giorni fa | |
| mppt_monitor_android | 3 giorni fa | |
| .coze | 2 mesi fa | |
| .gitignore | 4 giorni fa | |
| LICENSE | 5 giorni fa | |
| MPPTMonitor-v1.0.0.apk | 3 giorni fa | |
| README.md | 4 giorni fa |
基于 C 语言的 MPPT(最大功率点跟踪)太阳能充电控制器实时监控与数据采集系统。通过 Modbus TCP 采集设备运行数据,使用 Mongoose 提供 Web 仪表盘与 REST API,并将历史数据持久化到 SQLite3,支持多设备监控与远程参数下发。
┌──────────────────────────────────────────────────────────┐
│ mppt_monitor 进程 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Modbus 轮询 │ │ 数据存储 │ │ 信号处理 │ │
│ │ 线程 │ │ 线程 │ │ SIGINT/TERM │ │
│ │ (2 秒/次) │ │ (10 秒/次) │ │ 优雅退出 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────────────────┐ ┌──────────────┐ │
│ │ 共享数据 + sock_mutex │ │ SQLite3 DB │ │
│ └────────────────────────────────┘ │ (WAL 模式) │ │
│ ▲ └──────────────┘ │
│ │ sock_mutex │
│ ┌──────┴───────────────────────────────────────────┐ │
│ │ Mongoose HTTP 服务器(自愈线程) │ │
│ │ REST API / 静态文件 www/index.html │ │
│ └──────────────────────────────────────────────────┘ │
└───────────────────────────┬──────────────────────────────┘
│ Modbus TCP (RTU over TCP)
▼
discover.zhonjin.com:40635
(MPPT 设备网关)
│
┌───────────────┼───────────────┐
▼ ▼ ▼
MPPT #1 MPPT #2 ... MPPT #16
三个工作线程与一个 HTTP 事件循环:
| 线程 | 职责 | 周期 |
|---|---|---|
| Modbus 轮询线程 | 连接/重连设备、读取 Input/Output 寄存器、更新共享数据 | 2 秒(可配置) |
| 数据存储线程 | 将最新数据批量写入 SQLite,清理过期数据 | 10 秒(可配置) |
| HTTP 事件循环 | 处理 REST 请求与静态页面,异常自动重启 | 事件驱动 |
| 主线程 | 周期打印摘要、等待退出信号 | 10 秒 |
mppt_monitor/
├── src/ # 应用源代码
│ ├── main.c # 主程序:线程、信号处理、启动编排
│ ├── modbus_client.h/.c # Modbus TCP 客户端(CRC、读写、参数校验)
│ ├── web_server.h/.c # Mongoose HTTP 服务与 REST API
│ ├── config.h/.c # INI 配置文件解析
│ └── db.h/.c # SQLite3 历史数据存储与查询
├── www/
│ └── index.html # Web 仪表盘(Chart.js,单文件)
├── lib/ # 第三方库(随仓库提供,无需联网下载)
│ ├── cJSON-1.7.19/ # cJSON 1.7.19
│ └── mongoose-7.23/ # Mongoose 7.23
├── config.ini # 运行时配置文件
├── Makefile # 构建脚本
├── INSTALL.md # 快速安装指南
├── CHANGELOG.md # 变更日志(持续更新)
├── TECHNICAL.md # 技术方案文档(持续更新)
└── FAQ.md # 问答归档(持续更新)
说明:本仓库根目录的
README.md、LICENSE、.gitignore为仓库级文件;实际工程位于mppt_monitor/子目录。
Ubuntu 24.04:
sudo apt-get update
sudo apt-get install -y build-essential make libsqlite3-dev pkg-config
# 可选 OpenSSL
sudo apt-get install -y libssl-dev
树莓派 5(Raspberry Pi OS 64 位):
sudo apt-get update
sudo apt-get install -y build-essential make libsqlite3-dev pkg-config libssl-dev
git clone https://git.zhonjin.com:40717/steven_roc/mppt_monitor.git
cd mppt_monitor/mppt_monitor # 工程目录
make
构建产物为 build/mppt_monitor。第三方库(cJSON、Mongoose)已随仓库提供,无需联网下载。
常用构建命令:
make # 编译
make clean # 清理构建产物
make run # 编译并运行
make debug # 带调试符号与 AddressSanitizer
按需编辑 config.ini(主要确认设备地址、网关地址、Web 端口)。默认配置:
discover.zhonjin.com:4063518085./build/mppt_monitor
启动后浏览器访问:
http://<主机IP>:8085
若设置了环境变量
DEPLOY_RUN_PORT,Web 端口会以该变量为准(用于沙箱/容器部署)。
配置文件 config.ini 采用 INI 格式,分节如下:
[modbus]
host = discover.zhonjin.com # 设备网关域名或 IP
port = 40635 # 网关端口
timeout_sec = 10 # 连接 / 读写超时(秒)
poll_interval_sec = 2 # 轮询间隔(秒)
[storage]
db_path = mppt_data.db # SQLite 数据库文件路径
interval_sec = 10 # 历史数据存储间隔(秒)
retention_days = 365 # 数据保留天数(超过自动清理,0 表示永久)
[server]
port = 8085 # Web 服务端口(DEPLOY_RUN_PORT 优先)
page_size = 20 # 历史查询默认每页条数
[devices]
device_addrs = 1 # 设备地址列表,逗号分隔,如 1,2,3
修改配置后需重启程序生效。
浏览器访问 http://<主机IP>:8085,包含三个标签页:
所有接口返回 application/json,并支持 CORS(跨域访问)。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health |
健康检查(服务存活、连接状态) |
| GET | /api/status |
系统运行状态汇总 |
| GET | /api/data |
所有设备最新实时数据 |
| GET | /api/devices |
已配置设备列表 |
| GET | /api/settings?device_addr=¶m= |
查询指定设备指定参数当前值 |
| POST | /api/settings |
下发设备参数 |
| GET | /api/history |
历史数据分页查询 |
| GET | /api/history/stats |
历史数据统计信息 |
GET /api/history?device_addr=1&start=<unix秒>&end=<unix秒>&page=1&page_size=20
curl -X POST http://<主机IP>:8085/api/settings \
-H 'Content-Type: application/json' \
-d '{"device_addr": 1, "param": "battery_type", "value": 4}'
请求字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
device_addr |
number | 是 | 设备地址(1~247) |
param |
string | 是 | 参数标识(见协议寄存器映射) |
value |
number | 是 | 目标值 |
成功响应:
{"success": true, "device_addr": 1, "param": "battery_type", "value": 4}
失败响应:
{"success": false, "error": "错误原因"}
| 功能码 | 用途 |
|---|---|
| 0x04 | 读 Input Register(运行数据,只读) |
| 0x03 | 读 Holding/Output Register(可设置参数) |
| 0x06 | 写单个 Holding Register(单参数下发,优先使用) |
| 0x10 | 写多个 Holding Register(设备不支持 0x06 时回退) |
示例(读 10 个 Input 寄存器,设备地址 1):
请求:01 04 00 00 00 0A 70 0D
响应:01 04 14 01 0C 01 81 00 10 00 07 00 2E 00 14 00 60 00 02 00 01 00 3C E9 F1
完整寄存器地址表、读写格式、异常码与参数取值范围详见 TECHNICAL.md 与协议文档。
写寄存器双通道自适应策略:
sock_mutex 串行化,避免帧交错。mppt_data.db)retention_days 自动清理过期数据历史记录表按"设备地址 + 时间戳"存储每次采集的全部参数,供趋势图与分页查询使用。详细表结构见 TECHNICAL.md。
生产环境建议用 systemd 管理进程,实现开机自启与异常自动重启。
创建服务文件 /etc/systemd/system/mppt-monitor.service:
[Unit]
Description=MPPT Solar Charge Controller Monitor
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/mppt_monitor
ExecStart=/opt/mppt_monitor/build/mppt_monitor
Restart=always
RestartSec=5
Environment=DEPLOY_RUN_PORT=8085
[Install]
WantedBy=multi-user.target
部署并启用:
sudo cp -r . /opt/mppt_monitor
sudo systemctl daemon-reload
sudo systemctl enable --now mppt-monitor
sudo systemctl status mppt-monitor
journalctl -u mppt-monitor -f # 查看日志
树莓派部署的完整步骤(含系统烧录、网络、防火墙、时区配置)见 TECHNICAL.md 树莓派章节。
工程目录 mppt_monitor/ 下提供以下持续更新文档:
| 文档 | 内容 |
|---|---|
| INSTALL.md | 快速安装与运行指南 |
| CHANGELOG.md | 版本变更与每次 bug 修复详细说明 |
| TECHNICAL.md | 完整技术方案:架构、协议、API、数据库、编译配置、Ubuntu/树莓派/Docker 部署、故障排查 |
| FAQ.md | 历史问题与排查结论归档,按分类累计追加 |
Content-Type: application/json;新版本含 body 解析回退机制。nc -vz discover.zhonjin.com 40635 检测端口;若 TCP 能连但秒断,多为访问授权限制。sqlite3.h: No such file:安装开发包 sudo apt-get install libsqlite3-dev。更多排查步骤见 FAQ.md。
详见 LICENSE。
第三方组件版权归各自所有者: