Эх сурвалжийг харах

add meg format check
add websokcer close reason to db

Robert 1 жил өмнө
parent
commit
30013909d2

+ 48 - 2
EVCB_OCPP.WSServer/Service/WsService/WsClientData.cs

@@ -75,6 +75,8 @@ namespace EVCB_OCPP.WSServer.Service.WsService
 
         public event EventHandler<string> m_ReceiveData;
 
+        private string stringBuffer = string.Empty;
+
 
         public WsClientData()
         {
@@ -93,9 +95,53 @@ namespace EVCB_OCPP.WSServer.Service.WsService
             Send(data, offset, length);
         }
 
-        internal override void HandleReceivedData(string msg)
+        internal override void HandleReceivedData(string data)
+        {
+            stringBuffer += data;
+            while (TryGetOCPPMsg(ref stringBuffer, out var msg))
+            {
+                m_ReceiveData?.Invoke(this, msg);
+            }
+        }
+
+        private bool TryGetOCPPMsg(ref string buffer, out string msg)
         {
-            m_ReceiveData?.Invoke(this, msg);
+            msg = string.Empty;
+            int? startIndex = null;
+            int? stopIndex = null;
+            uint cnt = 0;
+
+            for (int index = 0; index < buffer.Length; index++)
+            {
+                if (buffer[index] == '[')
+                {
+                    cnt++;
+                    if (startIndex == null)
+                    {
+                        startIndex = index;
+                    }
+                }
+
+                if (startIndex != null && buffer[index] == ']')
+                {
+                    cnt--;
+                }
+
+                if (startIndex != null && cnt == 0)
+                {
+                    stopIndex = index;
+                    break;
+                }
+            }
+
+            if (startIndex is not null && stopIndex is not null)
+            {
+                msg = buffer.Substring(startIndex.Value, stopIndex.Value - startIndex.Value);
+                buffer = buffer.Substring(stopIndex.Value);
+                return true;
+            }
+
+            return false;
         }
     }
 }

+ 9 - 15
EVCB_OCPP.WSServer/Service/WsService/WsSession.cs

@@ -93,27 +93,21 @@ namespace EVCB_OCPP.WSServer.Service.WsService
             ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: disconnectCancellationTokenSource.Token);
         }
 
-        internal async Task Close()
+        internal Task Close()
         {
-            string closeReason = "ServerShutdown";
-            try
-            {
-                await _WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, closeReason, default);
-            }
-            finally
-            {
-                _WebSocket.Dispose();
-            }
-            disconnectCancellationTokenSource.Cancel();
-            SessionClosed?.Invoke(this, closeReason.ToString());
-            EndConnSemaphore.Release();
+            return InternalClose(WebSocketCloseStatus.NormalClosure, "ServerShutdown");
+        }
+
+        private  Task InternalClose(WebSocketCloseStatus closeStatus)
+        {
+            return InternalClose(closeStatus , null);
         }
 
-        private async Task InternalClose(WebSocketCloseStatus closeStatus)
+        private async Task InternalClose(WebSocketCloseStatus closeStatus, string description)
         {
             try
             {
-                await _WebSocket.CloseAsync(closeStatus, null , default);
+                await _WebSocket.CloseAsync(closeStatus, description, default);
             }
             finally
             {