网关GateWay——连接不同网络的关键设备
网关(Gateway)
网关(Gateway)是网络通信中的关键组件,常被用于不同网络之间的数据交换和协议转换。特别是应用在物联网(IoT)、嵌入式系统、智能电表系统(如DCU)等场景中。
一、什么是网关(Gateway)?
网关(Gateway)是一种网络设备或软件模块,用于连接不同网络、协议或系统之间的通信桥梁。它不仅能完成数据的转发,还能进行协议转换、数据处理、安全控制和设备管理等工作。
举例:
- 路由器是连接家庭局域网和互联网的网关。
- 在电力系统中,DCU(数据集中器)就是智能电表与主站系统之间的网关。
- 在IoT系统中,网关负责将传感器数据从Zigbee、蓝牙、Modbus等协议转为MQTT/HTTP并上传云平台。
二、网关的分类
分类方式 | 类型 | 说明 |
---|---|---|
按功能 | 数据网关 | 实现数据传输、收集、聚合和缓存 |
协议网关 | 实现不同协议间的转换,如Modbus转MQTT | |
应用网关 | 实现应用层解析、安全控制、认证等功能 | |
按部署位置 | 网络层网关 | 位于不同子网或网络间 |
应用层网关 | 位于边缘计算节点、终端设备或服务端 |
三、网关的核心功能
-
协议转换
- 如:DLMS → JSON、Modbus RTU → MQTT
- 支持多协议互通是工业网关的重要能力
-
数据转发与聚合
- 汇聚多个终端的数据,打包上传到云平台或主站系统
-
本地缓存与断点续传
- 临时存储数据,断网后自动补传,确保数据可靠性
-
安全认证
- 提供设备认证、数据加密、防火墙等能力
-
远程管理与升级
- 支持OTA(Over The Air)升级、日志收集、远程配置
-
边缘计算
- 在本地执行一定的规则、预处理、告警判断等逻辑
四、典型网关架构图
[设备1] [设备2] [设备3]| | |---协议A--- ---协议B--- ---协议C---\ | /[多协议网关 Gateway]| ↓协议统一(MQTT/HTTP)↓[云平台 / 主站系统]
五、常见应用场景
1. 工业网关
- 工业现场使用多种协议(如Modbus、CAN、PROFIBUS),网关可将其转为统一协议上传
2. 电力系统
- DCU作为网关连接智能电表(DLMS协议)与HES主站(通过MQTT或HTTP)
3. 智能家居
- 将Zigbee/BLE设备接入WiFi并连接到家庭控制系统或云端
4. 医疗物联网
- 网关收集医疗设备数据并同步到医院服务器或云平台
六、学习指南与建议
Ⅰ阶段:理解网关基础
-
了解网络通信基础(IP、端口、TCP/IP协议栈)
-
学习常见协议(MQTT、HTTP、Modbus、DLMS等)
-
推荐学习资源:
- 《计算机网络》谢希仁
- HiveMQ MQTT 教程:https://www.hivemq.com/mqtt/
Ⅱ阶段:搭建/使用网关
-
使用开源网关项目,如:
- EMQX(MQTT 网关)
- Node-RED(低代码数据流工具)
-
搭建本地网关系统,连接传感器并上传数据至云
Ⅲ阶段:开发与调优
- 学习多线程与异步编程(如C++、Java、Go)
- 实现协议转换模块
- 优化数据传输效率和缓存机制
- 研究安全机制(如TLS、证书认证)
七、常用网关设备/平台推荐
名称 | 用途 | 特点 |
---|---|---|
EMQX | MQTT网关 | 支持百万级并发、可部署在边缘或云端 |
ThingsBoard Gateway | 工业设备接入 | 支持Modbus、OPC UA等协议 |
DCU | 电力集中器 | 支持DLMS/COSEM、主站通信 |
网关是信息流动的桥梁,也是边缘计算的核心节点。掌握网关技术不仅能提升系统集成能力,也是深入物联网、工业互联网和电力系统的重要基础。
你提到的 DLMS 网关 和 Modbus 转 MQTT 网关,是两类非常实用且具有代表性的协议转换网关,广泛应用于电力系统和工业自动化场景中。下面我将分别对这两种网关进行详解,并提供学习和实现建议。
DLMS 网关与Modbus 转 MQTT 网关
一、DLMS 网关
1. 作用
DLMS 网关主要用于在智能电表(Meter)和主站系统(HES、MDMS)之间实现协议桥接和数据转发。通常部署在 DCU(Data Concentrator Unit) 中,也可以作为独立设备部署。
2. 工作流程
智能电表 <—DLMS协议—> DLMS网关(DCU) <—MQTT/HTTP—> 主站系统
3. 核心功能
功能 | 说明 |
---|---|
协议解析 | 解析 DLMS/COSEM 消息(如 AARQ/AARE、GET、SET、ACTION) |
会话管理 | 建立、维护 DLMS 会话,管理设备连接状态 |
安全认证 | 支持 DLMS 安全等级(L0、L1、L2、L5) |
数据缓存 | 缓存抄表数据、事件,断网续传 |
MQTT 通信 | 将采集数据发布到主站系统订阅的主题 |
4. 关键模块
- DLMS Stack(协议栈):如 Gurux.DLMS、OpenDLMS
- 任务调度模块:管理批量抄读任务
- 数据缓存模块:Redis/SQLite 实现临时存储
- MQTT 客户端模块:使用 Eclipse Paho、mosquitto 等库
5. 推荐资料
- Gurux DLMS 代码:https://github.com/Gurux
- IEC 62056 DLMS 协议文档
- DLMS Green Book(规范)
- MQTT 平台:EMQX、Mosquitto
二、Modbus 转 MQTT 网关
1. 作用
Modbus 转 MQTT 网关用于在工业设备(如PLC、传感器)与云端系统之间进行协议转换,常用于老旧设备改造,边缘计算等场景。
Modbus设备 <—Modbus RTU/TCP—> 网关 <—MQTT—> 云平台
2. 支持协议
协议 | 用途 |
---|---|
Modbus RTU | 串口通信(RS485) |
Modbus TCP | 网络通信 |
MQTT | 云平台通信协议 |
3. 工作机制
-
轮询读取 Modbus 设备寄存器(Holding/Input)
-
将读取结果打包成 JSON 数据
-
发布到 MQTT Broker 的指定主题,如:
/factory/device01/temperature
4. 开源项目/工具推荐
名称 | 描述 |
---|---|
ThingsBoard Gateway | 支持 Modbus/MQTT 双协议,图形配置 |
Node-RED | 适合快速原型开发 |
ModbusPal + EMQX | 测试环境搭建 |
Python-pymodbus + paho-mqtt | 可快速实现自定义网关逻辑 |
5. 样例代码(Python简易实现)
import pymodbus.client.sync
import paho.mqtt.client as mqtt
import json# 连接Modbus设备
modbus_client = pymodbus.client.sync.ModbusSerialClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=1)
modbus_client.connect()# MQTT连接
mqtt_client = mqtt.Client()
mqtt_client.connect("broker.emqx.io", 1883, 60)# 读取寄存器并上传
rr = modbus_client.read_holding_registers(0x00, 2, unit=1)
temperature = rr.registers[0] / 10.0payload = json.dumps({"temperature": temperature})
mqtt_client.publish("factory/device01/temperature", payload)
三、DLMS 与 Modbus 转 MQTT 网关对比
项目 | DLMS 网关 | Modbus 转 MQTT 网关 |
---|---|---|
应用场景 | 电力系统(智能电表) | 工业设备(PLC、仪表) |
协议复杂度 | 较高,基于对象模型 | 简单,基于寄存器地址 |
安全机制 | 支持多级安全认证 | 通常无加密,需自行扩展 |
实现难度 | 较高(DLMS协议栈、会话) | 中等(轮询 + MQTT) |
Modbus → MQTT 网关架构设计示例
1. 项目背景
在工业自动化和物联网系统中,大量设备仍使用 Modbus 协议(RTU/TCP)。为实现设备接入云平台并进行数据可视化、远程监控,需要将 Modbus 协议转换为 MQTT 协议。该网关作为桥梁,实现数据格式与传输协议的转换。
2. 系统目标
- 支持 Modbus RTU 和 Modbus TCP 协议的设备接入
- 定时或事件驱动读取设备寄存器
- 转换为 JSON 格式的 MQTT 消息并发布
- 支持断线重连、数据缓冲、重试机制
- 支持设备配置管理和远程升级(可选)
3. 系统架构概览
+--------------------------+| 云平台(MQTT Broker)|+-----------↑--------------+|MQTT over TCP|
+-----------+ +--------+--------+ +-----------+
| Modbus RTU|<-->| Modbus→MQTT |<---> | Modbus TCP|
| 设备A | | 网关核心程序 | | 设备B |
+-----------+ +----------------+ +-----------+[嵌入式 Linux / 边缘计算设备]
4. 模块划分
4.1 协议适配层(Protocol Adapter)
模块名 | 功能描述 |
---|---|
Modbus RTU 驱动 | 串口读取(RS-485),使用 libmodbus 或 pymodbus |
Modbus TCP 驱动 | 网络读取,连接 PLC 等设备 |
寄存器映射配置 | 读取位、字、浮点等数据,并关联为 JSON Key |
4.2 数据转换层(Data Processor)
- 将读取的数据转换为 JSON 格式:
{"device_id": "plc001","timestamp": "2025-05-17T10:00:00Z","temperature": 36.5,"pressure": 101.3
}
- 支持数据精度处理(如寄存器值/10)
- 支持简单规则引擎(如阈值判断告警)
4.3 通信层(MQTT Client)
功能 | 描述 |
---|---|
MQTT 连接管理 | 自动连接、断线重连、SSL 支持 |
QoS 支持 | 支持 QoS 0/1/2 |
发布机制 | 定时发布 / 变更触发发布 |
主题结构 | /factory/plc001/temperature ,或 /device/{id}/data |
4.4 缓存与重试机制(Buffer & Retry)
- 使用内存队列/数据库(如 SQLite)缓存未发送数据
- 支持网络异常时缓存、恢复后自动发布
- 消息队列控制并发发送
4.5 配置与管理模块(可选)
项目 | 功能 |
---|---|
本地配置文件 | YAML/JSON 结构描述 Modbus 设备、地址、发布频率等 |
Web 配置界面 | 通过浏览器配置寄存器映射 |
OTA | 云端触发网关远程升级(需 Bootloader 支持) |
5. 配置示例
devices:- id: plc001type: modbus_tcpip: 192.168.1.10port: 502interval: 5 # 每5秒轮询registers:- name: temperatureaddress: 0x0001type: holdinglength: 1scale: 0.1- name: pressureaddress: 0x0002type: holdinglength: 1scale: 0.1mqtt:broker: mqtt://broker.emqx.iotopic_prefix: /factoryqos: 1retain: false
6. 通信流程(时序图)
Modbus设备 网关核心 MQTT Broker| | ||<--轮询寄存器-- | ||--返回值------->| || |--发布JSON消息--->|| | |
7. 技术选型建议
功能模块 | 推荐库/技术栈 |
---|---|
Modbus | libmodbus ©、pymodbus (Python) |
MQTT | paho-mqtt (Python)、mosquitto (嵌入式) |
配置管理 | yaml-cpp (C++), PyYAML |
嵌入式平台 | OpenWRT, Yocto, Ubuntu Core |
消息缓冲 | SQLite、内存队列 |
8. 异常处理机制
异常 | 处理策略 |
---|---|
MQTT 连接中断 | 缓存数据,定时重连 |
Modbus 超时 | 重试3次,记录日志 |
配置文件异常 | 加载默认配置或退出启动 |
设备掉线 | MQTT状态上报设备为“离线” |
9. 安全性设计(可选)
- MQTT over TLS,使用 CA 证书
- 客户端证书认证(双向TLS)
- 禁止远程配置写入(或需认证)
- 审计日志机制记录访问与变更行为
10. 部署与维护建议
项目 | 建议 |
---|---|
开机自启 | 注册为 systemd 服务或 init 脚本 |
远程调试 | 支持日志上传、Telnet/SSH |
升级方式 | 支持增量OTA或整包烧录 |
容错策略 | 数据掉电保存,异常重启恢复任务 |
11. 扩展方向
- 支持 WebSocket 或 HTTP 推送
- 支持批量设备自动发现(Modbus scan)
- 接入边缘计算平台(如 EdgeX Foundry、KubeEdge)
- 提供 API 接口与第三方平台集成
附录:参考实现项目(推荐)
-
ThingsBoard Gateway
- https://thingsboard.io/docs/iot-gateway/
-
Open Gateway Framework (OGF)
- https://github.com/OpenIoTFY/open-gateway
-
自定义开发参考仓库(Python)
- https://github.com/riptideio/pymodbus
- https://github.com/eclipse/paho.mqtt.python
好的,以下是你提到的几个路由器常见功能的详细解释,适合用于理解路由器在网络环境下的工作原理,尤其适合嵌入式开发、物联网部署、工业网关等应用场景。
NAT(网络地址转换),端口映射,无线接入点(AP)
✅ 一、NAT(网络地址转换)
📌 概念
NAT(Network Address Translation)是将私有 IP 地址转换为公网 IP 地址的一种技术,常用于多个设备共用一个公网地址上网。
🧠 为什么需要 NAT?
因为 IPv4 地址不够用,大多数家庭或公司网络使用 私有地址段(如 192.168.x.x
、10.x.x.x
、172.16.x.x
),这些地址在公网中无法直接访问。
所以路由器使用 NAT 技术:
- 将多个私有 IP 的请求统一转换成一个公网 IP 发出
- 回包时再根据端口等信息路由回内部设备
🔄 举例说明(源 NAT / SNAT)
内网设备 IP | 请求目标地址 | 转换后公网地址 | 对应端口 |
---|---|---|---|
192.168.1.100 | www.baidu.com:80 | 120.1.2.3:34001 | 自动分配 |
192.168.1.101 | www.baidu.com:80 | 120.1.2.3:34002 | 自动分配 |
👉 路由器行为:
- 为每个内网请求分配一个外部端口号
- 建立连接映射表
- 返回包回来时,查表转发给对应的内网 IP 和端口
✅ 二、端口映射(Port Forwarding)
📌 概念
端口映射是在 NAT 基础上将外部特定端口的数据包转发给内网中某台设备的对应端口。
🎯 用途
- 搭建本地 Web 服务或 MQTT 服务被外部访问
- 支持远程 SSH、摄像头 RTSP、FTP 访问
🔄 示例:访问内网 MQTT 服务器
假设内网 IP 为 192.168.1.10
,该设备运行 MQTT 服务在 1883 端口。
外部请求地址 | 路由器行为 | 内部设备转发地址 |
---|---|---|
120.1.2.3:18830(公网) | 路由器转发到 192.168.1.10:1883 | /usr/bin/mosquitto |
设置方式(路由器 Web 页面):
外部端口:18830
内部 IP:192.168.1.10
内部端口:1883
协议类型:TCP
⚠️ 需开启 DMZ 或端口转发功能,有的运营商需打电话申请公网 IP(否则是 NAT 内网)
✅ 三、无线接入点(Access Point / AP 模式)
📌 概念
AP 模式下的路由器作为一个 无线接入设备,让其他无线终端(手机、笔记本、IoT 设备)连接到已有网络。
📶 特点
- 不做 NAT,不提供 DHCP
- 不控制网络路由,仅提供无线接入能力
- 类似于“交换机+无线”
使用场景:
- 公司或大户型住宅中,需要多个无缝 WiFi 覆盖区域
- 工业场景中,多个网关/PLC通过无线连接 AP 上传数据
🔁 举例:家用 AP 接入主路由器
角色 | IP 规划 | 功能 |
---|---|---|
主路由器 | 192.168.1.1 | NAT、DHCP、网关 |
AP路由器 | 192.168.1.2 | 仅作为无线 AP 使用 |
终端设备 | 自动分配 | 通过 DHCP 获取 IP |
配置方法:
- 关闭路由器的 DHCP 服务
- 修改 LAN IP(避免冲突)
- 关闭防火墙/NAT
- 启用无线并设置相同 SSID(或不同 SSID)
- 网线连接至主路由器 LAN 口(非 WAN 口)
✅ 总结对比表
功能 | 功能说明 | 作用场景 |
---|---|---|
NAT | 内网转公网,IP 映射 | 多设备共享公网地址 |
端口映射 | 将公网端口转发给内网某设备 | 外部访问内网服务,如MQTT、SSH |
无线接入点 AP | 提供无线连接能力,不参与 IP 分配或 NAT | 扩展无线网络,部署 IoT 接入点 |