فهرست منبع

build simple test pass

Robert 1 سال پیش
والد
کامیت
ad8f3a39ef

+ 1 - 0
EVCB_OCPP.WSServer/Program.cs

@@ -52,6 +52,7 @@ namespace EVCB_OCPP.WSServer
             var app = builder.Build();
             app.MapWsService();
             app.MapApiServce();
+            app.Urls.Add("http://*:80");
             app.Run();
         }
 

+ 28 - 19
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -141,9 +141,9 @@ namespace EVCB_OCPP.WSServer
 
         #endregion
 
-        private OCPPWSServer appServer;
-        private WebApplication appApi;
-        private WebApplication yarpApp;
+        //private OCPPWSServer appServer;
+        //private WebApplication appApi;
+        //private WebApplication yarpApp;
 
         internal Dictionary<string, WsClientData> GetClientDic()
         {
@@ -177,8 +177,8 @@ namespace EVCB_OCPP.WSServer
 
         public Task StopAsync(CancellationToken cancellationToken)
         {
-            return Stop();
-            //return Task.CompletedTask;
+            Stop();
+            return Task.CompletedTask;
         }
 
         internal void UpdateClientDisplayPrice(string key,string price)
@@ -341,13 +341,10 @@ namespace EVCB_OCPP.WSServer
             }
         }
 
-        internal Task Stop()
+        internal void Stop()
         {
-            appServer?.Stop();
-            return Task.WhenAll(new []{ 
-                appApi?.StopAsync(),
-                yarpApp?.StopAsync() 
-            });
+            //appServer?.Stop();
+            StopWsService();
         }
 
         private void StartWsService()
@@ -401,16 +398,21 @@ namespace EVCB_OCPP.WSServer
 
             websocketService.ValidateHandshake = WebsocketServiceValidateHandshake;
             websocketService.NewSessionConnected += AppServer_NewSessionConnected;
-            websocketService.SessionClosed += AppServer_SessionClosed;
 
 
             //Try to start the appServer
-            if (!appServer.Start())
-            {
-                logger.LogCritical("Failed to start!");
-                //Console.ReadKey();
-                return;
-            }
+            //if (!appServer.Start())
+            //{
+            //    logger.LogCritical("Failed to start!");
+            //    //Console.ReadKey();
+            //    return;
+            //}
+        }
+
+        private void StopWsService()
+        {
+            websocketService.ValidateHandshake = null;
+            websocketService.NewSessionConnected -= AppServer_NewSessionConnected;
         }
 
         private async Task<bool> WebsocketServiceValidateHandshake(WsClientData session)
@@ -607,6 +609,7 @@ namespace EVCB_OCPP.WSServer
 
                 TryRemoveDuplicatedSession(session);
                 clientDic[session.ChargeBoxId] = session;
+                session.SessionClosed += AppServer_SessionClosed;
 
                 session.m_ReceiveData += ReceivedMessageTimeLimited;
                 // logger.LogDebug("------------New " + (session == null ? "Oops" : session.ChargeBoxId));
@@ -621,8 +624,14 @@ namespace EVCB_OCPP.WSServer
             }
         }
 
-        private void AppServer_SessionClosed(object sender, WsClientData session)
+
+        private void AppServer_SessionClosed(object sender, EventArgs e)
         {
+            if (sender is not WsClientData session)
+            {
+                return;
+            }
+            session.SessionClosed -= AppServer_SessionClosed;
             CloseReason value = CloseReason.ServerShutdown;
             WriteMachineLog(session, string.Format("CloseReason: {0}", value), "Connection", "");
             RemoveClient(session);

+ 15 - 8
EVCB_OCPP.WSServer/Service/WebsocketService.cs

@@ -61,8 +61,6 @@ public class WebsocketService<T> : IWebsocketService where T: WsSession
 
     public event EventHandler<T> NewSessionConnected;
 
-    public event EventHandler<T> SessionClosed;
-
     public async Task AddWebSocket(WebSocket webSocket, HttpContext context)
     {
         T data = Activator.CreateInstance<T>();
@@ -70,8 +68,8 @@ public class WebsocketService<T> : IWebsocketService where T: WsSession
         data.Path = context?.Request?.Path;
         data.UriScheme = context?.Request?.Scheme;
         data.AuthHeader = context?.Request?.Headers?.Authorization;
-        data.SessionID = context.Session.Id;
-        data.Endpoint = context.GetEndpoint();
+        data.SessionID = context.TraceIdentifier;
+        data.Endpoint = null;
         data.Origin = context.Request.Headers.Origin;
 
         var validated = await ValidateHandshake(data);
@@ -100,6 +98,7 @@ public class WsSession
     public string SessionID { get; set; }
     public Endpoint Endpoint { get; internal set; }
     public StringValues Origin { get; internal set; }
+    public DateTime LastActiveTime { get; set; }
 
 
     public WebSocket _WebSocket { get; internal set; }
@@ -116,7 +115,7 @@ public class WsSession
 
     public SemaphoreSlim EndConnSemaphore { get; } = new SemaphoreSlim(0);
 
-    public event OCPPClientDataEventHandler<WsSession, String> m_ReceiveData;
+    //public event OCPPClientDataEventHandler<WsSession, String> m_ReceiveData;
 
     public event EventHandler SessionClosed;
 
@@ -124,6 +123,7 @@ public class WsSession
 
     private void Init(WebSocket webSocket)
     {
+        _WebSocket = webSocket;
         ReceiveLoopTask = StartReceivd(webSocket);
     }
 
@@ -139,19 +139,26 @@ public class WsSession
                 break;
             }
             string received = Encoding.UTF8.GetString(buffer, 0, result.Count);
-            m_ReceiveData?.Invoke(this, received);
+            //m_ReceiveData?.Invoke(this, received);
+            this.LastActiveTime = DateTime.UtcNow;
+            HandleReceivedData(received);
         }
     }
 
+    internal virtual void HandleReceivedData(string data)
+    {
+
+    }
+
     internal void Send(string dataString)
     {
         var data = Encoding.UTF8.GetBytes(dataString);
-        ClientWebSocket.SendAsync(data, WebSocketMessageType.Binary, endOfMessage: true, cancellationToken: default);
+        ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: default);
     }
 
     internal void Send(byte[] data, int offset, int length)
     {
-        ClientWebSocket.SendAsync(data, WebSocketMessageType.Binary, endOfMessage: true, cancellationToken: default);
+        ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: default);
     }
 
     internal void Close(CloseReason closeReason)

+ 4 - 13
EVCB_OCPP.WSServer/SuperSocket.Protocol/ClientData.cs

@@ -12,7 +12,7 @@ using System.Net.WebSockets;
 
 namespace OCPPServer.Protocol
 {
-    public class WsClientData : WsSession, IDisposable
+    public class WsClientData : WsSession
     { /// <summary>
       /// 根據unique id來儲存.取出OCPP Request
       /// </summary>
@@ -79,19 +79,15 @@ namespace OCPPServer.Protocol
 
         public string CustomerName { get; set; }
 
-        public DateTime LastActiveTime { get; set; }
-
         public string StationId { set; get; }
 
-        public new event ClientData.OCPPClientDataEventHandler<WsClientData, string> m_ReceiveData;
+        public event ClientData.OCPPClientDataEventHandler<WsClientData, string> m_ReceiveData;
 
 
         public WsClientData()
         {
             ChargeBoxId = SessionID;
             MachineId = SessionID;
-
-            base.m_ReceiveData += WsClientData_m_ReceiveData;
         }
 
         /// <summary>
@@ -105,14 +101,9 @@ namespace OCPPServer.Protocol
             base.Send(data, offset, length);
         }
 
-        private void WsClientData_m_ReceiveData(WsSession clientdata, string msg)
-        {
-            m_ReceiveData.Invoke(this, msg);
-        }
-
-        public void Dispose()
+        internal override void HandleReceivedData(string msg)
         {
-            base.m_ReceiveData -= WsClientData_m_ReceiveData;
+            m_ReceiveData?.Invoke(this, msg);
         }
     }