一、一个真实的开发困境
去年接一个物联网网关项目,客户要求对接西门子S7、三菱MC、Modbus TCP、GB28181国标摄像头四种协议。问题是我手边一台真实设备都没有:
-
西门子S7-1200 PLC 市场价 3000+
-
海康威视摄像头支持GB28181的 500+
-
三菱FX5U PLC 2500+
-
还有各种传感器、CNC数控机床...
等采购流程走完,项目 deadline 早就过了。最后只能硬着头皮写代码,拿到客户现场再调试——结果可想而知,现场联调了整整3天,问题一堆。
这不是个例。做工业物联网开发的同行,80%的时间都花在"等硬件"和"现场联调"上。
核心矛盾:工业协议调试需要"真实的协议交互过程",而不仅仅是"看起来正确的数据"。
二、ProtoForge 的技术方案
基于这个痛点,我开发了一个开源的物联网协议仿真平台,核心理念是"一台电脑 = 整个工业现场"。
2.1 全链路仿真
传统模拟只关注"数据对不对",比如Modbus读寄存器返回一个固定值。但真实工业场景中,协议交互是一个完整的过程:
客户端连接 -> 握手认证 -> 请求数据 -> 服务端响应 -> 异常处理 -> 断开连接
以GB28181国标协议为例,交互流程包括:
1. SIP REGISTER --> 上级平台(设备主动注册,支持Digest认证)
2. <-- MESSAGE Catalog(平台查询设备目录,设备响应NVR通道列表)
3. <-- INVITE(平台请求实时视频,携带SDP媒体描述)
4. --> 200 OK + SDP(设备确认并协商媒体参数)
5. <-- ACK(平台确认,建立RTP通道)
6. ==============>> RTP/PS 视频流(设备持续推流,25fps,CIF分辨率)
7. <-- BYE(平台停止视频,设备释放资源)
如果只模拟"返回一个视频流地址",无法验证平台端的SIP解析、SDP协商、RTP接收逻辑是否正确。必须完整实现SIP协议栈和RTP推流能力。
2.2 架构设计
采用前后端分离设计:
+-----------------------------------------+
| Vue3 前端界面 |
| 仪表盘 | 设备管理 | 协议服务 | 场景编排 |
+-----------------------------------------+
|
v
+-----------------------------------------+
| FastAPI 后端服务 |
| +---------+ +---------+ +---------+ |
| | 协议引擎 | | 设备实例 | | 场景调度 | |
| | 17种协议| | 90+模板 | | 规则引擎| |
| +---------+ +---------+ +---------+ |
| +---------+ +---------+ +---------+ |
| | 测试框架 | | 录制回放 | | 数据转发 | |
| | 14种断言| | 加密存储 | | 多目标 | |
| +---------+ +---------+ +---------+ |
+-----------------------------------------+
|
v
+-----------------------------------------+
| SQLite / PostgreSQL |
+-----------------------------------------+
每种工业协议独立为一个模块,遵循统一的接口规范,按需加载。基础安装包含13种核心协议,额外4种(OPC-UA、MQTT、BACnet、S7)通过可选依赖安装。
2.3 设备模板系统
工业设备虽然品牌型号繁多,但底层协议行为可以抽象为模板:
{
"name": "西门子S7-1200",
"protocol": "s7",
"points": [
{"name": "温度", "type": "float", "address": "DB1.DBD0", "generator": "sine"},
{"name": "压力", "type": "int", "address": "DB1.DBW4", "generator": "random"},
{"name": "运行状态", "type": "bool", "address": "DB1.DBX6.0", "generator": "toggle"}
]}
模板定义了协议类型、测点列表(数据类型、内存地址、生成策略)和场景规则。目前整理了90+模板,覆盖PLC、传感器、CNC、摄像头、HVAC、伺服驱动器等。
2.4 数据生成策略
仿真数据不能是随机数,要符合物理规律:
| 生成器 |
适用场景 |
示例 |
sine |
周期性波动(温度、压力) |
value = base + amplitude * sin(2*pi*t/period) |
random_walk |
随机游走(液位、流量) |
每次在上一值基础上加减随机步长 |
toggle |
开关状态(运行/停止) |
按概率或定时切换布尔值 |
step |
阶梯变化(产量计数) |
固定间隔递增整数值 |
script |
复杂逻辑(自定义公式) |
安全沙箱内执行Python表达式 |
三、核心功能
3.1 协议服务 — 17种工业协议一键启停
支持Modbus TCP/RTU、OPC-UA、MQTT、HTTP、GB28181、BACnet、Siemens S7、Mitsubishi MC、Omron FINS、Rockwell AB、OPC-DA、FANUC FOCAS、MTConnect、Mettler-Toledo、PROFINET IO、EtherCAT。
每种协议独立配置端口和高级参数,全部支持一键启动/停止。
3.2 可视化场景编排
单一设备仿真只能验证"点对点"通信,但真实工厂是多设备协同的。采用拖拽式拓扑编辑:
-
左侧设备面板拖拽设备到画布
-
自动显示设备间连线(基于协议类型匹配)
-
点击设备配置测点和规则
-
一键启停整个场景
支持4种规则类型(threshold、value_change、timer、script),规则动作包括设定目标值、切换布尔值、递增、递减,支持冷却机制防止频繁触发。
3.3 实时调试日志
工业调试最痛苦的是"不知道数据发出去没有"。WebSocket实时推送协议报文:
[15:47:01] [系统] [modbus_tcp] server_start Modbus TCP服务启动 0.0.0.0:5020
[15:47:02] [接收] [modbus_tcp] 01 03 00 00 00 0A C5 CD <- 客户端读保持寄存器
[15:47:02] [发送] [modbus_tcp] 01 03 14 00 01 00 02 ... -> 响应10个寄存器值
支持按协议筛选、按方向筛选(收/发/系统)、关键词搜索、暂停、导出JSON。
3.4 自动化测试框架
内置14种断言类型(equals、contains、regex_match、json_path、status_code等),支持变量提取和链式调用,输出HTML报告。
四、典型使用场景
场景1:Modbus上位机开发
# 30秒启动docker run -d --name protoforge -p 8000:8000 suoten/protoforge:latest
打开浏览器 -> 协议服务 -> 启动Modbus TCP -> 模板市场 -> 选择"西门子S7-1200"模板 -> 一键创建。上位机代码直接连接localhost:5020,像连接真实PLC一样读写寄存器。
节省:1台PLC采购周期(2-4周)+ 现场调试时间(2-3天)
场景2:GB28181国标平台联调
传统方式:买摄像头 -> 配置SIP服务器 -> 调试注册 -> 调试推流。
ProtoForge方式:启动GB28181协议 -> 创建摄像头设备 -> 自动完成SIP注册 -> 自动响应目录查询 -> 收到INVITE后自动推RTP视频流。
节省:摄像头采购成本 + 现场部署时间
场景3:网关压力测试
模板市场 -> 批量创建 -> 选择数量100 -> 一键生成。所有设备同时在线,不同协议混合接入,真实模拟工厂现场。配合Prometheus指标端点,直接对接Grafana看性能曲线。
场景4:给客户演示
以前出差要带PLC + 传感器 + 网线 + 电源 + 转接头。现在一个笔记本搞定,现场连WiFi,客户直接看Web界面,设备在线、数据跳动、日志实时刷新。
五、部署方式
| 方式 |
适用场景 |
启动时间 |
| Docker |
快速体验、开发测试 |
30秒 |
| 源码部署 |
深度定制、二次开发 |
10分钟 |
| K8s Helm |
生产环境、高可用 |
5分钟 |
Docker镜像支持amd64/arm64多架构,内置SQLite开箱即用,生产环境可切换PostgreSQL。
性能基准:Modbus TCP并发约200连接,MQTT约500连接,OPC-UA约50连接,GB28181 RTP推流约10路。空载内存约150MB,100设备约500MB。
六、安全设计
工业场景对安全敏感:
-
JWT + RBAC:admin/operator/user/viewer四种角色,100% API权限覆盖
-
bcrypt密码存储:自动加盐,抵抗彩虹表攻击
-
登录保护:连续5次失败锁定5分钟,API限流防暴力破解
-
协议安全:OPC-UA证书自动生成、MQTT TLS加密、GB28181 SRTP、录制报文加密
七、生态对接
支持与EdgeLite Gateway(轻量级边缘计算物联网网关)无缝对接。创建设备时填写网关地址,模拟设备自动注册到网关,完成注册->连接->采集->验证->监控的完整联调链路。
这和GB28181填"上级SIP服务器地址"的体验完全一致——配置一个URL,剩下的事系统自动搞定。
八、写在最后
做工业物联网开发,硬件成本和时间成本是最大的两座山。协议仿真平台的目标就是把这两座山铲平——让开发者专注在业务逻辑上,而不是等快递、接网线、调设备。
V1.0.0是里程碑,但不是终点。接下来计划更多协议覆盖(EtherNet/IP、CANopen、LoRaWAN)、插件化架构、数字孪生可视化。
如果你也在做物联网开发,遇到过类似的硬件调试困境,欢迎交流。
如果这个项目帮你节省了硬件采购成本或联调时间,欢迎Star支持持续开发。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050062/viewspace-3171771/
,如需转载,请注明出处,否则将追究法律责任。