English | 简体中文
iot-gateway 是一个开箱即用的工业物联网数据采集网关:定时轮询 PLC / 工业设备,将采集数据推送至 MQTT、TDEngine、InfluxDB 等下游通道,并提供内嵌的 Web 管理控制台。整体以 单二进制 形式部署到网关设备或工控机,无需外部数据库。
功能特性
- 多协议采集:内置 Modbus、西门子 S7、三菱 MC、欧姆龙 FINS/CIP、罗克韦尔 CIP、OPC UA 等 12 种协议/传输驱动,支持寄存器批量读取、字节序/字序配置。
- 动态表单驱动:协议参数以 JSON Schema 动态表单存储于数据库,新增协议无需改前端代码。
- 采集引擎:Worker 并发池调度轮询任务;后台 watcher 检测配置变更,零中断热加载。
- 推送引擎:设备级分组批量分发;通道配置热加载;断网时数据写入 本地 outbox 持久缓存,恢复后自动补发,不丢数据。
- 断联报警:设备采集失败与推送通道断连自动检测(去抖 + 状态机),离线/恢复边沿落库,统一报警中心查询。
- Web 管理控制台:首页大盘、设备对象、地址标签、协议管理、通道管理、报警管理、日志查看、密钥管理,中英双语界面。
- 开放接口:
/openApi/*只读查询接口,X-Api-Key密钥鉴权,供 MES / ERP 等外部系统对接。 - 单二进制部署:前端经
go:embed内嵌,SQLite 纯 Go 实现(免 CGO),一个可执行文件即完整系统;支持注册为 Windows 服务 / Linux systemd 服务,开机自启、崩溃自动拉起。
系统架构
┌────────────────────── 单二进制 iot-gateway ──────────────────────┐
│ │
PLC / 设备 ───▶│ collector 采集引擎 ──▶ driver 协议驱动层 │
│ (Worker池/热加载) (Modbus/S7/MC/FINS/CIP/OPC UA ...) │
│ │ │
│ ▼ RecordSink │
│ push 推送引擎 ────┬──▶ MQTT Broker │
│ (通道热加载) ├──▶ TDEngine v3 │
│ │ └──▶ InfluxDB v3 │
│ │ 断网 │
│ ▼ │
│ SQLite outbox 本地缓存(补发) │
│ │
│ alarm 断联报警 · Web 控制台(/admin) · Open API(/openApi) │
└──────────────────────────────────────────────────────────────────┘
支持协议
| 协议 | 传输方式 | 典型设备 |
|---|---|---|
| ModBus.RTU / ModBus.TCP | 串口 / 以太网 | 各类支持 Modbus 的 PLC、仪表、变频器 |
| Siemens.S7 | 以太网 | 西门子 S7 系列 PLC |
| Mitsubishi.MC.TCP / MC.Serial | 以太网 / 串口 | 三菱 MC 协议 PLC |
| Omron.FINS.UDP / FINS.TCP / FINS.Serial / FINS.HostLinkTCP | UDP / TCP / 串口 | 欧姆龙 FINS 协议 PLC |
| Omron.CIP | EtherNet/IP | 欧姆龙 CIP 设备 |
| Rockwell.CIP | EtherNet/IP | 罗克韦尔(AB)ControlLogix / CompactLogix |
| OPC.UA | 以太网 | 支持 OPC UA 的设备与网关 |
各协议可承载的设备/点位容量与调优建议,见采集容量压测报告。
支持推送通道
| 通道 | 说明 |
|---|---|
mqtt |
Eclipse Paho MQTT 客户端,支持 QoS、TLS、遗嘱等 |
tdengine-v3 |
TDEngine 3.x,官方 driver-go WebSocket 驱动(免 CGO,经 taosAdapter 连接) |
influxdb-v3 |
InfluxDB 3.x,自研 Line Protocol over HTTP 直连(不引入官方重依赖客户端) |
推送通道与协议驱动均为注册表 + 接口的插件式设计,新增协议/通道无需改动引擎代码。
快速开始
环境要求
- Go ≥ 1.26、Node.js ≥ 22(仅开发/构建时需要;生产运行只需产物二进制)
1. 开发模式(前后端分离,热更新)
# 终端 1:后端(端口 9081)
cd backend && go run .
# 终端 2:前端(端口 4000)
cd frontend && npm install && npm run dev
或使用 VS Code:终端 → 运行任务 → dev,一键并行启动前后端。
访问 http://localhost:4000,请求经 Vite 代理转发至后端 9081。
2. 生产构建(单二进制)
build.bat # Windows 上构建 Linux + Windows 双平台产物
build.bat windows # 仅构建 Windows
产物为 backend/iot-gateway(.exe)(内���前端),拷贝到目标设备直接运行:
./iot-gateway # 管理控制台: http://<主机IP>:9081/admin
3. 服务化部署(开机自启)
| 平台 | 安装 | 卸载 |
|---|---|---|
| Windows | 管理员运行 install.bat |
管理员运行 uninstall.bat [--purge] |
| Linux | sudo ./install.sh |
sudo ./uninstall.sh [--purge] |
- Windows 经
sc注册为服务(内置原生服务支持,无需 NSSM),崩溃自动重启。 - 默认安装目录:Windows
%ProgramFiles%\iot-gateway、Linux/opt/iot-gateway(环境变量IOT_GATEWAY_HOME/INSTALL_DIR可覆盖)。 - 服务以安装目录为工作目录,
data/(SQLite)与log/(日志)写入该目录;--purge卸载时连数据一并删除,默认保留。
4. Docker Compose 部署(容器化)
无需本地安装 Go / Node.js,在项目根目录执行即可(多阶段构建:前端构建 → Go 编译 → 运行镜像):
docker compose up -d --build # 构建镜像并后台启动
docker compose logs -f # 跟踪日志
docker compose ps # 查看状态(含健康检查)
docker compose down # 停止并移除容器
- 管理控制台:
http://<主机IP>:9081/admin(宿主机端口9081)。 ./data(SQLite)与./log(日志)挂载至容器内/app/data、/app/log,容器重建后数据不丢。- 内置健康检查(
/health),配合restart: unless-stopped异常自动拉起。
默认账号
首次启动自动初始化两个账号:admin、hand,初始密码 hand@123。
⚠️ 安全提醒:默认密码仅用于首次登录,生产部署后请立即修改所有默认账号密码;管理控制台(
/admin)不建议直接暴露公网。其他加固建议(JWT 密钥配置、网络隔离等)见 SECURITY.md。
管理控制台
| 页面 | 说明 |
|---|---|
| 首页大盘 | 设备在线状态、采集与推送概览 |
| 设备对象 / 地址标签 | 按网关分组管理设备,维护采集点位与数据类型 |
| 协议管理 | 协议参数动态表单配置(支持自定义表单 JSON) |
| 通道管理 | MQTT / TDEngine / InfluxDB 推送通道配置与状态监控 |
| 报警管理 | 设备断联报警、通道断联报警,历史记录查询 |
| 日志查看 | 在线浏览与下载网关运行日志 |
| 密钥管理 | 生成 / 启停 Open API 访问密钥(admin) |
开放接口
外部系统凭密钥调用(密钥在控制台「密钥管理」生成),请求头携带 X-Api-Key:
GET /openApi/device/page # 设备分页查询
GET /openApi/deviceAddress/page # 设备地址分页查询(按设备 ID)
推���数据格式
推送到 MQTT / TDEngine / InfluxDB 的每条点位数据的字段语义(value、kind、quality 等)与自描述解析约定,见推送载荷契约。下游消费端(MES / 时序库分析)应据此解析,不依赖网关内部实现。
配置说明
配置文件为 backend/default.yaml,可用 APP_ENV=dev|prod 切换 dev.yaml / prod.yaml 覆盖,主要配置项:
server:
port: 9081 # HTTP 服务端口
jwt:
secret: "" # JWT 签名密钥:留空则每次启动随机生成(重启后登录态失效);
# 生产环境建议固定,优先读环境变量 IOT_GATEWAY_JWT_SECRET
expireHour: 24 # 登录令牌有效期
log:
level: INFO # 日志级别
maxSizeMB: 10 # 日志滚动大小
maxDays: 30 # 日志保留天数
sqlite:
path: data/iot-gateway.db # SQLite 数据文件路径
目录结构
├── backend/ # Go 后端
│ ├── collector/ # 采集引擎(轮询调度 / 配置热加载)
│ ├── driver/ # 协议驱动注册表(modbus/s7/mitsubishi/omron/rockwell/opcua)
│ ├── push/ # 推送引擎(mqtt/tdengine-v3/influxdb-v3 + outbox)
│ ├── controller/ service/ model/ # HTTP 分层(Controller → Service → Database)
│ ├── database/sqlite/migrations/ # SQLite 迁移脚本
│ ├── router/ middleware/ # 路由与中间件(JWT / Open API 密钥 / CORS)
│ ├── web/ # 前端构建产物(go:embed 嵌入)
│ └── specs/ # 项目技术规范文档
├── frontend/ # Vue3 管理前端(Element Plus + Pinia + vue-i18n)
├── docker-compose.yml # Docker Compose 部署编排(配合 backend/Dockerfile 多阶段构建)
├── build.bat / .sh # 一键打包(前端构建 → 嵌入 → Go 交叉编译)
├── install.bat / .sh # 服务化安装(Windows / Linux)
└── uninstall.bat / .sh # 服务化卸载
技术栈
| 层次 | 选型 |
|---|---|
| 后端 | Go 1.26 + Gin + GORM + Google Wire + Viper + JWT |
| 存储 | SQLite(纯 Go 实现,免 CGO) |
| 协议库 | goburrow/modbus · robinson/gos7 · gopcua/opcua(其余协议自研实现) |
| 前端 | Vue 3 + Vite + Element Plus + Pinia + Tailwind CSS 4 + vue-i18n |
| 部署 | go:embed 单二进制 · Windows 服务 / Linux systemd |
参与贡献
欢迎报告问题、补充文档、贡献新协议驱动或推送通道,见 CONTRIBUTING.md;安全漏洞请勿公开 Issue,参见 SECURITY.md。
社区交流
- Issue / Discussion:Bug 与功能建议请提 Issue(GitHub 仓库为镜像,仅接受 PR)。
- 微信交流群:扫描下方二维码或联系
15289288565@163.com拉群。
许可证与 FAQ
本项目以 GNU AGPL-3.0 协议开源。以下 FAQ 帮助你快速判断自己的使用场景(仅为友好说明,不构成法律意见):
Q1:我在公司内部部署使用(采集自家产线数据),需要开源自己的代码吗?
不需要。AGPL 的源码开放义务只在分发软件或将其作为网络服务对外提供时触发。内部使用未修改版本,不向外部用户提供服务,无需开放任何源码。
Q2:我通过 Open API / MQTT 对接自己的系统(MES、ERP、大屏等),我的业务代码需要以 AGPL 开源吗?
不需要。你的系统经网络接口与本网关通信,属于独立程序间的数据交互,你的业务代码不是本项目的衍生作品,不受 AGPL 约束。
Q3:什么情况下我必须开放源码?
修改了本项目源码,且满足以下任一条件:① 将修改后的版本分发给他人(含打包出售、随硬件交付);② 将修改后的版本通过网络向用户提供服务(含部署���第三方使用)。此时须按 AGPL-3.0 向相应对象提供完整的对应源码。
Q4:我可以为本项目开发闭源的协议驱动 / 推送通道吗?
- 编译进本网关二进制的驱动 / 通道属于衍生作品,须随项目以 AGPL-3.0 开源。
- 以独立进程经网络与本网关交互(如独立采集程序、独立推送代理)则不受约束。
- 欢迎将自研驱动 / 通道以 AGPL-3.0 贡献回社区,见 CONTRIBUTING.md——项目采用注册表 + 接口的插件式设计,接入成本很低。
Q5:网关采集、推送的数据受 AGPL 约束吗?
不受。数据归使用者所有,AGPL 只约束软件本身及其衍生作品,不会"传染"到采集、传输、存储的数据。
Q6:我是硬件 / 网关设备厂商,想把本项目嵌入产品销售,可以吗?
可以,两条路径任选:① 按 AGPL-3.0 履行义务,向购买者提供完整对应源码;② 联系我们购买商业授权,免除 AGPL 义务,支持闭源 OEM 嵌入。
Q7:如何获得闭源商用 / OEM / 双授权?
联系 <15289288565@163.com>,说明使用场景(OEM 嵌入、SaaS、二次开发交付等),我们提供商业许可。
- 外部贡献默认按 CLA.md 授权给项目维护方,并随项目以 AGPL-3.0 许可;商业版仓库与本仓库���码相互独立。
- 开源咨询与商业授权请联系:
<15289288565@163.com>
Comments