网关(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简易实现)
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.0
payload = 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 格式:
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. 配置示例
yaml
复制代码
devices:
- id: plc001
type: modbus_tcp
ip: 192.168.1.10
port: 502
interval: 5 # 每5秒轮询
registers:
- name: temperature
address: 0x0001
type: holding
length: 1
scale: 0.1
- name: pressure
address: 0x0002
type: holding
length: 1
scale: 0.1
mqtt:
broker: mqtt://broker.emqx.io
topic_prefix: /factory
qos: 1
retain: false
6. 通信流程(时序图)
text
复制代码
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 页面):
text
复制代码
外部端口: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 接入点