-
-
Notifications
You must be signed in to change notification settings - Fork 459
Closed
Description
When charger uses timestamps without miliseconds "timestamp":"2026-02-04T07:51:06Z" SecurityEventNotification doesn't parse it as valid timestamp, while StatusNotification handles this format. Timestamps with miliseconds are handled by both messages "timestamp":"2026-02-04T07:51:06 .000 Z".
[INFO ] 2026-02-04 07:51:07,392 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Received: [2,"2","SecurityEventNotification",{"type":"StartupOfTheDevice","timestamp":"2026-02-04T07:51:06Z"}]
[ERROR] 2026-02-04 07:51:07,395 de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer (qtp332357514-25) - Exception occurred
tools.jackson.databind.DatabindException: Invalid format: "2026-02-04T07:51:06Z" is malformed at "Z"
at [No location information] (through reference chain: ocpp._2022._02.security.SecurityEventNotification["timestamp"])
at tools.jackson.databind.DatabindException.wrapWithPath(DatabindException.java:111)
at tools.jackson.databind.deser.bean.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1850)
at tools.jackson.databind.deser.bean.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:534)
at tools.jackson.databind.deser.bean.BeanDeserializer.deserialize(BeanDeserializer.java:200)
at tools.jackson.databind.deser.DeserializationContextExt.readRootValue(DeserializationContextExt.java:265)
at tools.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2583)
at tools.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:983)
at tools.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:1294)
at de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer.handleCall(Deserializer.java:137)
at de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer.accept(Deserializer.java:81)
at de.rwth.idsg.steve.ocpp.ws.pipeline.IncomingPipeline.accept(IncomingPipeline.java:49)
at de.rwth.idsg.steve.ocpp.ws.AbstractWebSocketEndpoint.handleTextMessage(AbstractWebSocketEndpoint.java:131)
at de.rwth.idsg.steve.ocpp.ws.AbstractWebSocketEndpoint.onMessage(AbstractWebSocketEndpoint.java:103)
at de.rwth.idsg.steve.ocpp.ws.ConcurrentWebSocketHandler.handleMessage(ConcurrentWebSocketHandler.java:50)
at org.springframework.web.socket.adapter.jetty.JettyWebSocketHandlerAdapter.onWebSocketText(JettyWebSocketHandlerAdapter.java:79)
at org.eclipse.jetty.websocket.core.util.MethodHolder.doInvoke(MethodHolder.java:85)
at org.eclipse.jetty.websocket.core.util.MethodHolder$Binding.invoke(MethodHolder.java:119)
at org.eclipse.jetty.websocket.core.messages.StringMessageSink.accept(StringMessageSink.java:66)
at org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandler.acceptFrame(JettyWebSocketFrameHandler.java:398)
at org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandler.onTextFrame(JettyWebSocketFrameHandler.java:369)
at org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandler.onFrame(JettyWebSocketFrameHandler.java:219)
at org.eclipse.jetty.websocket.core.WebSocketCoreSession$IncomingAdaptor.lambda$onFrame$0(WebSocketCoreSession.java:664)
at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1697)
at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1684)
at org.eclipse.jetty.websocket.core.server.internal.AbstractHandshaker$1.handle(AbstractHandshaker.java:178)
at org.eclipse.jetty.websocket.core.WebSocketCoreSession$IncomingAdaptor.onFrame(WebSocketCoreSession.java:664)
at org.eclipse.jetty.websocket.core.ExtensionStack.onFrame(ExtensionStack.java:114)
at org.eclipse.jetty.websocket.core.WebSocketCoreSession.onFrame(WebSocketCoreSession.java:473)
at org.eclipse.jetty.websocket.core.WebSocketConnection.onFrame(WebSocketConnection.java:296)
at org.eclipse.jetty.websocket.core.WebSocketConnection.fillAndParse(WebSocketConnection.java:499)
at org.eclipse.jetty.websocket.core.WebSocketConnection.onFillable(WebSocketConnection.java:365)
at org.eclipse.jetty.io.AbstractConnection$FillableCallback.succeeded(AbstractConnection.java:319)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:317)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.IllegalArgumentException: Invalid format: "2026-02-04T07:51:06Z" is malformed at "Z"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:953)
at tools.jackson.datatype.joda.deser.DateTimeDeserializer._fromString(DateTimeDeserializer.java:126)
at tools.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:57)
at tools.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:23)
at tools.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:120)
at tools.jackson.databind.deser.bean.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:532)
... 41 common frames omitted
[INFO ] 2026-02-04 07:51:07,407 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Sending: [4,"2","FormationViolation","The payload for action could not be deserialized",{"errorMsg":"Invalid format: \"2026-02-04T07:51:06Z\" is malformed at \"Z\"\n at [No location information] (through re..."}]
[INFO ] 2026-02-04 07:51:08,224 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Received: [2,"3","SecurityEventNotification",{"type":"ResetOrReboot","timestamp":"2026-02-04T07:51:07Z","techInfo":"reason[1] : power on"}]
[ERROR] 2026-02-04 07:51:08,225 de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer (qtp332357514-25) - Exception occurred
tools.jackson.databind.DatabindException: Invalid format: "2026-02-04T07:51:07Z" is malformed at "Z"
at [No location information] (through reference chain: ocpp._2022._02.security.SecurityEventNotification["timestamp"])
at tools.jackson.databind.DatabindException.wrapWithPath(DatabindException.java:111)
at tools.jackson.databind.deser.bean.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1850)
at tools.jackson.databind.deser.bean.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:534)
at tools.jackson.databind.deser.bean.BeanDeserializer.deserialize(BeanDeserializer.java:200)
at tools.jackson.databind.deser.DeserializationContextExt.readRootValue(DeserializationContextExt.java:265)
at tools.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2583)
at tools.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:983)
at tools.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:1294)
at de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer.handleCall(Deserializer.java:137)
at de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer.accept(Deserializer.java:81)
at de.rwth.idsg.steve.ocpp.ws.pipeline.IncomingPipeline.accept(IncomingPipeline.java:49)
at de.rwth.idsg.steve.ocpp.ws.AbstractWebSocketEndpoint.handleTextMessage(AbstractWebSocketEndpoint.java:131)
at de.rwth.idsg.steve.ocpp.ws.AbstractWebSocketEndpoint.onMessage(AbstractWebSocketEndpoint.java:103)
at de.rwth.idsg.steve.ocpp.ws.ConcurrentWebSocketHandler.handleMessage(ConcurrentWebSocketHandler.java:50)
at org.springframework.web.socket.adapter.jetty.JettyWebSocketHandlerAdapter.onWebSocketText(JettyWebSocketHandlerAdapter.java:79)
at org.eclipse.jetty.websocket.core.util.MethodHolder.doInvoke(MethodHolder.java:85)
at org.eclipse.jetty.websocket.core.util.MethodHolder$Binding.invoke(MethodHolder.java:119)
at org.eclipse.jetty.websocket.core.messages.StringMessageSink.accept(StringMessageSink.java:66)
at org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandler.acceptFrame(JettyWebSocketFrameHandler.java:398)
at org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandler.onTextFrame(JettyWebSocketFrameHandler.java:369)
at org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandler.onFrame(JettyWebSocketFrameHandler.java:219)
at org.eclipse.jetty.websocket.core.WebSocketCoreSession$IncomingAdaptor.lambda$onFrame$0(WebSocketCoreSession.java:664)
at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1697)
at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1684)
at org.eclipse.jetty.websocket.core.server.internal.AbstractHandshaker$1.handle(AbstractHandshaker.java:178)
at org.eclipse.jetty.websocket.core.WebSocketCoreSession$IncomingAdaptor.onFrame(WebSocketCoreSession.java:664)
at org.eclipse.jetty.websocket.core.ExtensionStack.onFrame(ExtensionStack.java:114)
at org.eclipse.jetty.websocket.core.WebSocketCoreSession.onFrame(WebSocketCoreSession.java:473)
at org.eclipse.jetty.websocket.core.WebSocketConnection.onFrame(WebSocketConnection.java:296)
at org.eclipse.jetty.websocket.core.WebSocketConnection.fillAndParse(WebSocketConnection.java:499)
at org.eclipse.jetty.websocket.core.WebSocketConnection.onFillable(WebSocketConnection.java:365)
at org.eclipse.jetty.io.AbstractConnection$FillableCallback.succeeded(AbstractConnection.java:319)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:317)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.IllegalArgumentException: Invalid format: "2026-02-04T07:51:07Z" is malformed at "Z"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:953)
at tools.jackson.datatype.joda.deser.DateTimeDeserializer._fromString(DateTimeDeserializer.java:126)
at tools.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:57)
at tools.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:23)
at tools.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:120)
at tools.jackson.databind.deser.bean.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:532)
... 41 common frames omitted
[INFO ] 2026-02-04 07:51:08,226 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Sending: [4,"3","FormationViolation","The payload for action could not be deserialized",{"errorMsg":"Invalid format: \"2026-02-04T07:51:07Z\" is malformed at \"Z\"\n at [No location information] (through re..."}]
[INFO ] 2026-02-04 07:51:09,020 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Received: [2,"4","StatusNotification",{"connectorId":0,"errorCode":"NoError","status":"Available","timestamp":"2026-02-04T07:51:06Z"}]
[INFO ] 2026-02-04 07:51:09,028 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Sending: [3,"4",{}]
[INFO ] 2026-02-04 07:51:09,784 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Received: [2,"5","StatusNotification",{"connectorId":1,"errorCode":"NoError","status":"Available","timestamp":"2026-02-04T07:51:06Z"}]
[INFO ] 2026-02-04 07:51:09,790 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=2b449b97-11ac-2fa9-c3a6-67faeb725a3a] Sending: [3,"5",{}]
When using "timestamp":"2026-02-04T07:37:05.000Z" format both messages are handled.
[INFO ] 2026-02-04 07:37:17,323 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-31) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Received: [2,"2","SecurityEventNotification",{"type":"StartupOfTheDevice","timestamp":"2026-02-04T07:37:05.000Z"}]
[INFO ] 2026-02-04 07:37:17,348 de.rwth.idsg.steve.repository.impl.EventRepositoryImpl (qtp332357514-31) - Security event 'StartupOfTheDevice' recorded for chargeBox '1234'
[INFO ] 2026-02-04 07:37:17,349 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-31) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Sending: [3,"2",{}]
[INFO ] 2026-02-04 07:37:18,120 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Received: [2,"3","SecurityEventNotification",{"type":"ResetOrReboot","timestamp":"2026-02-04T07:37:05.000Z","techInfo":"reason[3] : by software"}]
[INFO ] 2026-02-04 07:37:18,125 de.rwth.idsg.steve.repository.impl.EventRepositoryImpl (qtp332357514-25) - Security event 'ResetOrReboot' recorded for chargeBox '1234'
[INFO ] 2026-02-04 07:37:18,126 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-25) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Sending: [3,"3",{}]
[INFO ] 2026-02-04 07:37:18,884 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-31) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Received: [2,"4","StatusNotification",{"connectorId":0,"errorCode":"NoError","status":"Available","timestamp":"2026-02-04T07:37:16.000Z"}]
[INFO ] 2026-02-04 07:37:18,892 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-31) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Sending: [3,"4",{}]
[INFO ] 2026-02-04 07:37:19,644 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-31) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Received: [2,"5","StatusNotification",{"connectorId":1,"errorCode":"NoError","status":"Available","timestamp":"2026-02-04T07:37:16.000Z"}]
[INFO ] 2026-02-04 07:37:19,655 de.rwth.idsg.steve.ocpp.ws.WebSocketLogger (qtp332357514-31) - [chargeBoxId=1234, sessionId=401192a9-2a67-6a63-e985-581b821ed7e7] Sending: [3,"5",{}]
Shoudn't SteVe handle timestamp format without miliseconds in SecurityEventNotification the same it handles this format in StatusNotification?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels