使用Spring Boot对接欧州OCPP1.6充电桩:解决WebSocket连接自动断开问题
使用Spring Boot对接欧州OCPP1.6充电桩:解决WebSocket连接自动断开问题
在使用Spring Boot搭建的WebSocket服务对接欧州标准OCPP1.6协议充电桩时,常见问题是:设备连接后握手成功,但连接很快自动断开,无法进行正常通信。本文结合排查经验,重点讲解为何Spring WebSocket握手处理不适合该场景,并推荐实用的解决方案。
1. 问题描述
1.1 现象
- 设备发送WebSocket握手请求,服务器返回
101 Switching Protocols
响应。 - 连接立刻断开,客户端收到关闭码1006(异常关闭)。
- 抓包显示握手响应头部与设备预期格式不完全匹配。
1.2 典型握手请求(设备端)
GET /ks0117100000008 HTTP/1.1
Host: 120.197.150.156:58849
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: KKqqD06idoE8DJ0iS0D3Bg==
Sec-WebSocket-Protocol: ocpp1.6
Sec-WebSocket-Version: 13
1.3 Spring WebSocket握手响应示例
HTTP/1.1 101
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: o0ClK53RCGue65eCLeBHMn9aeSY=
Sec-WebSocket-Protocol: ocpp1.6
Date: Tue, 12 Aug 2025 07:50:27 GMT
如下图:
1.4 Java-WebSocket库握手响应示例(设备可用)
HTTP/1.1 101 Web Socket Protocol Handshake
Connection: Upgrade
Date: Tue, 12 Aug 2025 08:05:09 GMT
Sec-WebSocket-Accept: 3az0B0hatKokkQOryZvUqCiGXo8=
Sec-WebSocket-Protocol: ocpp1.6
Server: TooTallNate Java-WebSocket
Upgrade: websocket
如下图:
2. 核心问题分析
2.1 Spring WebSocket握手限制
Spring WebSocket的握手处理依赖于Servlet容器,存在如下问题:
- 无法自定义HTTP状态行中的状态码文本,如
"101 Switching Protocols"
变成仅"101"
. - 响应头顺序和部分内容不可控,缺少
Server
字段。 - 设备对握手响应格式敏感,导致连接建立后马上断开。
2.2 设备协议严格性
部分充电桩厂商实现严格按照RFC6455标准及特定厂商服务器格式,Spring默认握手响应不符合预期,从而触发客户端断开。
3. 推荐解决方案:使用org.java_websocket
独立服务器
3.1 为什么选择org.java_websocket
- 纯Java实现,可完全控制握手请求和响应。
- 可以模