用一台“高性能物联网数据路由器”,管理好物联网数据流:麦恩 IoT Gateway介绍

发布于:2025-08-18 ⋅ 阅读:(9) ⋅ 点赞:(0)

麦恩 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+(可用内置模式)

  1. 克隆与构建
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
  1. 前端构建
cd web/frontend
npm install && npm run build
  1. 配置文件
cp config.yaml config.yaml
# 编辑各项端口、NATS、适配器、Sink、规则目录等
  1. 启动服务
./bin/gateway -config config.yaml
# Dev 模式
# go run cmd/gateway/main.go -config config.yaml

访问管理界面:http://localhost:8081

  1. 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运行时统计

🔌 插件管理 - 适配器与接收器

在这里插入图片描述

管理南向适配器和北向接收器,支持动态配置和状态监控

⚙️ 规则引擎 - 数据处理规则

在这里插入图片描述

可视化创建和管理数据处理规则,支持复杂条件和多种动作类型

🚨 告警管理 - 实时告警监控

在这里插入图片描述

实时监控系统告警,支持告警统计、分类管理和处理跟踪

🌐 网络状态 - 连接监控

在这里插入图片描述

监控网络连接状态、数据吞吐量和规则引擎性能指标

📡 连接监控 - 实时数据流

在这里插入图片描述

实时显示数据流量图表、错误率统计和设备数据分布

📊 数据统计 - 设备数据详情

在这里插入图片描述

详细的设备数据统计,包括传感器数据、处理频率和数据质量指标

⚙️ 系统设置 - 配置管理

在这里插入图片描述

系统配置管理,包括基本信息、资源使用情况、健康检查和规则引擎设置



网站公告

今日签到

点亮在社区的每一天
去签到