From 216a8e118d7d4a32d79b7d6bd3b4fa21026f38ac Mon Sep 17 00:00:00 2001 From: Timothy Yin Date: Sun, 15 Mar 2026 03:41:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(ocpp):=20=E6=B7=BB=E5=8A=A0=E5=AF=B9WebSoc?= =?UTF-8?q?ket=E5=AD=90=E5=8D=8F=E8=AE=AE=E7=9A=84=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=92=8C=E7=BC=BA=E5=A4=B1=E5=8F=82=E6=95=B0=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/csms/src/index.ts | 6 +++- apps/csms/src/ocpp/handler.ts | 32 ++++++++++++++++--- .../firmware/lib/mongoose/mongoose_config.h | 1 + 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/apps/csms/src/index.ts b/apps/csms/src/index.ts index 870aee0..b6b03ac 100644 --- a/apps/csms/src/index.ts +++ b/apps/csms/src/index.ts @@ -85,8 +85,12 @@ app.get( '/ocpp/:chargePointId', upgradeWebSocket((c) => { const chargePointId = c.req.param('chargePointId') + if (!chargePointId) { + throw new Error('Missing chargePointId route param') + } const connInfo = getConnInfo(c) - return createOcppHandler(chargePointId, connInfo.remote.address) + const requestedProtocol = c.req.header('sec-websocket-protocol') + return createOcppHandler(chargePointId, connInfo.remote.address, requestedProtocol) }), ) diff --git a/apps/csms/src/ocpp/handler.ts b/apps/csms/src/ocpp/handler.ts index dfe2988..5a96980 100644 --- a/apps/csms/src/ocpp/handler.ts +++ b/apps/csms/src/ocpp/handler.ts @@ -92,6 +92,26 @@ function sendCallError( ) } +function pickOcppSubprotocol( + negotiatedProtocol?: string | null, + requestedHeader?: string | null, +) { + if (negotiatedProtocol && isSupportedOCPP(negotiatedProtocol)) { + return negotiatedProtocol + } + + if (!requestedHeader) { + return null + } + + const requestedProtocols = requestedHeader + .split(',') + .map((value) => value.trim()) + .filter(Boolean) + + return requestedProtocols.find((protocol) => isSupportedOCPP(protocol)) ?? null +} + /** * Factory that produces a hono-ws event handler object for a single * OCPP WebSocket connection. @@ -99,7 +119,11 @@ function sendCallError( * Usage in route: * upgradeWebSocket((c) => createOcppHandler(c.req.param('chargePointId'), remoteAddr)) */ -export function createOcppHandler(chargePointIdentifier: string, remoteAddr?: string) { +export function createOcppHandler( + chargePointIdentifier: string, + remoteAddr?: string, + requestedProtocolHeader?: string, +) { const ctx: OcppConnectionContext = { chargePointIdentifier, isRegistered: false, @@ -107,14 +131,14 @@ export function createOcppHandler(chargePointIdentifier: string, remoteAddr?: st return { onOpen(_evt: Event, ws: WSContext) { - const subProtocol = ws.protocol ?? 'unknown' - if (!isSupportedOCPP(subProtocol)) { + const subProtocol = pickOcppSubprotocol(ws.protocol, requestedProtocolHeader) + if (!subProtocol) { ws.close(1002, 'Unsupported subprotocol') return } ocppConnections.set(chargePointIdentifier, ws) console.log( - `[OCPP] ${chargePointIdentifier} connected` + + `[OCPP] ${chargePointIdentifier} connected (${subProtocol})` + (remoteAddr ? ` from ${remoteAddr}` : ''), ) }, diff --git a/hardware/firmware/lib/mongoose/mongoose_config.h b/hardware/firmware/lib/mongoose/mongoose_config.h index 910630d..e540434 100644 --- a/hardware/firmware/lib/mongoose/mongoose_config.h +++ b/hardware/firmware/lib/mongoose/mongoose_config.h @@ -1 +1,2 @@ #define MG_ARCH MG_ARCH_ESP32 +#define MG_TLS MG_TLS_MBED // Use ESP-IDF built-in mbedTLS for WSS support