从整体架构、关键技术、客户端实现、数据触发机制、安全和可靠性等角度,分模块详细介绍“电子秤作为 WebSocket 客户端向 MES 系统推送数据,点击秤上键盘触发发送”的内容与技术方案。
一、系统架构概览
电子秤端
硬件:内置称重传感器、主控 CPU(或 MCU)、以太网/Wi-Fi 通信模块、按键扫描电路、LCD/LED 显示屏。
软件:嵌入式操作系统(如 Linux、RTOS),运行 WebSocket 客户端模块、键盘扫描和业务逻辑程序。
网络层
电子秤通过有线以太网或 Wi-Fi 与 MES 服务器网络交换机互联。
使用 TCP/IP 协议栈承载 WebSocket(基于 TCP)。
MES 系统端
提供 WebSocket 服务端接口,接收各电子秤客户端的连接与消息。
负责校验数据、持久化、下发后续指令或反馈。
运维及监控
网络监控:设备连通性、带宽、丢包。
应用监控:WebSocket 连接状态、心跳、消息异常统计。
┌───────────┐ WebSocket ┌───────────┐
│ 电子秤A │ ───────────────►│ MES │
│ (Client) │◄─────────────── │ (Server) │
└───────────┘ 双向通道 └───────────┘
↑ ↑
│ └──– 键盘触发“发送”按钮
└──– 称重传感器采样
二、关键技术选型
模块 | 技术/协议 | 说明 |
---|---|---|
操作系统 | Embedded Linux / RTOS | 支持 TCP/IP、线程调度 |
编程语言 | C/C++ / Python / JavaScript (Node.js on Linux) | 嵌入式性能 vs. 开发效率 |
通信协议 | WebSocket (RFC 6455) | 持久双向通道、低延迟 |
数据格式 | JSON / Protobuf / CBOR | 可读性 vs. 传输效率 |
按键扫描 | GPIO 中断 / 扫描矩阵 | 硬件中断触发按键事件 |
安全 | WSS(TLS 加密) | 保证传输机密性与完整性 |
心跳与重连机制 | 自定义 Ping/Pong | 检测断线并自动重连 |
三、WebSocket 客户端实现
连接建立
在秤启动或网络恢复后,启动 WebSocket 客户端,向 MES 提供的 URI 发起握手:
ws://mes.example.com:8080/scale // 若启用加密: wss://mes.example.com:8443/scale
握手成功后,保持长连接。
心跳维护与重连
定期(如每 30s)发送 ping 帧,等待 server 的 pong,若超过超时未收到,则认定连接断开。
断开后按照指数退避策略(1s→2s→4s…)重连,直到成功。
消息发送接口
提供一个线程安全的消息队列,将待发消息入队。
WebSocket 发送线程从队列取出,调用底层 send API 输出二进制或文本帧。
接收与处理
若 MES 需要下发配置或确认指令,可监听 onmessage 回调,解析并执行。
四、数据推送触发机制
按键扫描
键盘采用矩阵或单按键 GPIO 方式扫描,典型流程:
轮询或中断检测到“发送”键按下。
消抖处理(10–30ms),确认后触发应用层事件。
称重采样
平时不断采集传感器原始数据,做滤波(如卡尔曼或均值滤波),获得稳定重量读数。
点击发送时,读取最近一次稳定值作为此次数据。
数据封装
建议使用 JSON,例如:
{ "scaleId": "SCALE-001", "timestamp": "2025-08-05T14:30:22+09:00", "weight": 12.345, "unit": "kg", "operator": "OP-1001" }
若带宽或处理性能受限,可改用 Protobuf 或 CBOR 二进制协议。
发送流程(伪码)
onKeyPress(“SEND”): weight = getLatestWeight() msg = formatMessage(scaleId, timestamp(), weight, unit) wsClient.send(msg)
五、MES 系统接口及验签
连接 URI
wss://mes.example.com/scale/{scaleId}
,可将 scaleId 放在路径中,便于路由。
认证与授权
在 WebSocket 握手时,通过 HTTP Header 或 query string 传递 token。
后端校验 JWT 或 HMAC 签名,确保数据来源可信。
消息确认
MES 在收到数据后,可发送 ACK:
{ "code": 200, "message": "OK", "receivedId": "UUID-xxx" }
客户端可收到 ACK 后,在本地日志标记为“已送达”;若超时未收到,再次入队重发。
六、异常处理与日志
发送失败
当
send()
调用抛出异常或回调返回错误,需将消息重入待发队列,并记录错误原因。
连接断开
清理旧连接,按照心跳机制自动重连。连接过程中临时缓存待发送消息(可设置大小上限,防止内存暴涨)。
日志管理
本地存储:轮询保存关键事件(连接建/断、发送异常、重连次数)到循环日志文件。
可选:定时将日志推送到集中日志系统(如 ELK)。
七、安全与性能优化
TLS 加密
使用 WSS,将证书部署到秤设备:
可使用 Let’s Encrypt 或企业内部 CA。
定期自动更新证书。
带宽与延迟
JSON 文本可压缩(gzip),兼容 WebSocket permessage-deflate 扩展。
对重量数据做合批:若短时间内多次按键发送,合并 N 条一起发。
资源占用
控制心跳频率与重连次数,防止 CPU/网络抖动。
对高并发秤端(数百台)可统一走负载均衡,分布到多台 MES 实例。
通过上述方案,电子秤端以 WebSocket 客户端角色,依托“按键触发→重量采样→消息封装→长连接双向通道→数据推送与 ACK→心跳重连”这一闭环,实现对 MES 系统的实时、高可靠数据传输。