麦恩 IoT Gateway 是一套以 NATS 高速消息总线 为核心、可插件化扩展的物联网数据网关。它把“采集—处理—路由—存储—可视化”整条链路拆得足够清晰、又拼得足够高效,适合从十几台到百万级设备的工业与商业场景。
项目主页: Github | Gitee
为什么使用麦恩 IoT Gateway?
做过 IoT 的人都懂:设备协议五花八门、采集链路易碎、处理逻辑难统一、北向对接经常对接不好造成业务中断。麦恩 IoT Gateway 的设计目标很直接:
- 性能优先:Go 实现 + NATS 作“数据高速公路”,追求毫秒级处理延迟与高吞吐;
- 架构清晰:南向适配器采集、规则引擎处理、北向 Sink 投递,各司其职;
- 可演化:适配器、规则动作、聚合函数、前端模块全部插件化/可扩展;
- 可运营:配好看板、告警、审计与权限,工程化落地更省心。
核心亮点
- 高并发:原生 Go + NATS,支持百万级连接与毫秒级处理链路
- 多协议适配:Modbus/MQTT/HTTP/WebSocket,支持自动发现、健康检查与数据校验
- 实时规则引擎:28 类聚合/统计/异常检测,复杂类型(数组、向量、GPS、颜色)原生支持
- 弹性数据输出:InfluxDB、Redis、MQTT、WebSocket、Console 等多路投递与容错
- 插件化:适配器、动作处理器、前端组件均可热插拔扩展
- 可视化与运维:现代化 Web UI、性能面板、告警中心、权限/审计全齐活
架构一图流
关键设计:规则数据必须通过 nats_subscriber
路由
很多系统里,大家习惯让 Sink 直接“订主题”。这会让北向能力与消息中间件强绑定、难统一。麦恩 IoT Gateway 刻意把订阅能力集中到一个特殊 Sink——nats_subscriber
:
错误做法(不可行)
规则引擎 → iot.rules.* → InfluxDB Sink(直接订阅) ✖
推荐做法(正确)
规则引擎 → iot.rules.* → nats_subscriber → InfluxDB/Redis/WebSocket …
这样带来三个好处:统一订阅管理、简化配置、路由更灵活(同一规则数据可同时扇出到多种北向目标)。
示例配置:
northbound:
sinks:
- name: "rule_data_router"
type: "nats_subscriber"
params:
subscriptions:
- subject: "iot.rules.*"
data_type: "rule"
- subject: "iot.alerts.*"
data_type: "alert"
target_sinks:
- name: "storage"
type: "influxdb"
- name: "cache"
type: "redis"
- name: "dashboard"
type: "websocket"
快速上手(5 步跑起来)
环境要求:Go 1.24+、Node.js 18+、NATS 2.9+(可用内置模式)
- 克隆与构建
git clone https://github.com/y001j/IoT_Gateway.git
cd IoT_Gateway
go mod download
go build -o bin/gateway cmd/gateway/main.go
# 可选:Web/Server
go build -o bin/server cmd/server/main.go
- 前端构建
cd web/frontend
npm install && npm run build
- 配置文件
cp config.yaml config.yaml
# 编辑各项端口、NATS、适配器、Sink、规则目录等
- 启动服务
./bin/gateway -config config.yaml
# Dev 模式
# go run cmd/gateway/main.go -config config.yaml
访问管理界面:http://localhost:8081
- Docker 一键
docker build -t iot-gateway .
docker run -d --name iot-gateway \
-p 8080:8080 -p 8081:8081 \
-v $(pwd)/config.yaml:/app/config.yaml iot-gateway
配置最小闭环:从温度到告警
基础(节选)
gateway:
name: "IoT Gateway"
http_port: 8080
nats_url: "embedded" # 或 "nats://localhost:4222"
southbound:
adapters:
- name: "modbus_devices"
type: "modbus"
config:
host: "192.168.1.100"
port: 502
rule_engine:
enabled: true
rules_dir: "./rules"
规则(温度高于 40℃ 报警)
{
"id": "temperature_alert",
"name": "温度告警规则",
"enabled": true,
"conditions": {
"type": "and",
"and": [
{"field": "key", "operator": "eq", "value": "temperature"},
{"field": "value", "operator": "gt", "value": 40}
]
},
"actions": [
{
"type": "alert",
"config": {"level": "warning","message": "设备{{.DeviceID}}温度过高: {{.Value}}°C"}
}
]
}
规则数据的北向路由(关键)
northbound:
sinks:
- name: "rule_data_router"
type: "nats_subscriber"
params:
subscriptions:
- subject: "iot.rules.*"
data_type: "rule"
- subject: "iot.alerts.*"
data_type: "alert"
target_sinks:
- name: "influx"
type: "influxdb"
config:
url: "http://localhost:8086"
database: "iot_data"
- name: "ws"
type: "websocket"
可扩展:两段代码接入你的自定义能力
写一个南向适配器
type MyAdapter struct { /* ... */ }
func (a *MyAdapter) Start() error { return nil }
func (a *MyAdapter) Stop() error { return nil }
func (a *MyAdapter) GetData() <-chan model.Point { return a.dataChan }
func init() {
southbound.RegisterAdapter("my_adapter", func() southbound.Adapter { return &MyAdapter{} })
}
新增一个规则动作
type MyActionHandler struct{}
func (h *MyActionHandler) Name() string { return "my_action" }
func (h *MyActionHandler) Execute(ctx context.Context, p model.Point, r *rules.Rule, cfg map[string]interface{}) (*rules.ActionResult, error) {
// do something...
return &rules.ActionResult{Type: "my_action", Success: true}, nil
}
func init() {
rules.RegisterActionHandler("my_action", &MyActionHandler{})
}
28 种聚合/统计,覆盖从“看见数据”到“理解数据”
- 基础统计:count、sum、avg、min、max、stddev、variance、median
- 百分位:p25、p50、p75、p90、p95、p99
- 数据质量:null_rate、completeness、outlier_count
- 变化检测:change、change_rate、volatility、cv
- 阈值监控:above_count、below_count、in_range_count
配合复杂数据类型(数组、向量、GPS、颜色),能很自然地描述工业/车联网/智慧园区场景下的指标与告警。
性能与运维:几个落地建议
NATS 与网关
gateway:
nats_url: "nats://localhost:4222"
nats_options:
max_payload: 1048576
max_pending: 65536
规则引擎并发/缓冲
rule_engine:
worker_pool_size: 10
buffer_size: 10000
batch_size: 100
内存与 GC
gateway:
gc_percent: 100
memory_limit: "2GB"
监控重点
- 系统:CPU/内存/磁盘 IO
- 数据链路:处理速率、端到端延迟、错误率
- 连接:设备在线数、NATS 主题吞吐、消费者积压
仪表盘与明细面板已内置在 Web UI 中,开箱即用。
典型落地场景
- 工厂与产线:PLC/Modbus 汇聚,温压流与能耗监控,异常追溯与良率分析
- 园区与楼宇:多协议抄表、HVAC 调度、告警联动与能管平台对接
- 边缘计算:就地聚合、降采样、去敏脱敏,北向仅上报“价值数据”
- SaaS/平台方:利用
nats_subscriber
做多租户路由与多存储后端扇出
上线清单(Checklist)
- 南向适配器设备清单/心跳机制
- 规则目录与版本化策略(灰度发布/回滚)
-
nats_subscriber
主题规则与路由表 - InfluxDB/Redis/MQTT 等北向镜像/重试参数
- 告警策略(等级/抑制/聚合/通知渠道)
- 权限/审计与运维可观测性(日志、指标、追踪)
结语:把数据流理顺,你的业务才会顺
麦恩 IoT Gateway 不追求“大而全”,而是把“高性能数据总线 + 清晰的数据职责边界 + 工程化可运营”做到位。你可以从一个小型 PoC 开始,把南向接入、规则处理、北向路由一条线打通;等量上来,再逐步扩容与扩展插件。
如果这套工具对你有启发,欢迎 Star、Fork 与 PR。下一版,就从你的场景开始更好用。
📸 界面截图
📊 主控制台 - 实时监控仪表板
实时显示系统运行状态、设备连接数、数据处理统计和最近告警信息
📈 系统监控 - 性能指标
详细的系统资源使用情况,包括CPU、内存、磁盘使用率和Go运行时统计
🔌 插件管理 - 适配器与接收器
管理南向适配器和北向接收器,支持动态配置和状态监控
⚙️ 规则引擎 - 数据处理规则
可视化创建和管理数据处理规则,支持复杂条件和多种动作类型
🚨 告警管理 - 实时告警监控
实时监控系统告警,支持告警统计、分类管理和处理跟踪
🌐 网络状态 - 连接监控
监控网络连接状态、数据吞吐量和规则引擎性能指标
📡 连接监控 - 实时数据流
实时显示数据流量图表、错误率统计和设备数据分布
📊 数据统计 - 设备数据详情
详细的设备数据统计,包括传感器数据、处理频率和数据质量指标
⚙️ 系统设置 - 配置管理
系统配置管理,包括基本信息、资源使用情况、健康检查和规则引擎设置