Переглянути джерело

2020/06/18 Jessica
1. Domain DLL 版本號 45063
2. 加入電樁上線詢問版本號
3. Heartbeat改成統一Thread 更新
4.Machine 如果被軟刪除 即不允許連線

Jessica.Tseng 4 роки тому
батько
коміт
93cbdb8500

BIN
EVCB_OCPP.WSServer/DLL/EVCB_OCPP.Domain.dll


+ 54 - 28
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -40,8 +40,8 @@ namespace EVCB_OCPP.WSServer.Message
                 {
                     case Actions.DataTransfer:
                         {
-                          
-                            var confirm = new DataTransferConfirmation() { status= DataTransferStatus.Rejected };
+
+                            var confirm = new DataTransferConfirmation() { status = DataTransferStatus.Rejected };
 
                             result.Message = confirm;
                             result.Success = true;
@@ -176,25 +176,30 @@ namespace EVCB_OCPP.WSServer.Message
                         break;
                     case Actions.Heartbeat:
                         {
-                            using (var db = new MainDBContext())
-                            {
-                                //  var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
-                                var machine = new Machine() { Id = session.MachineId };
-                                if (machine != null)
-                                {
-                                    db.Configuration.AutoDetectChangesEnabled = false;
-                                    db.Configuration.ValidateOnSaveEnabled = false;
-                                    db.Machine.Attach(machine);
-                                    machine.HeartbeatUpdatedOn = DateTime.Now;
-                                    machine.ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1;
-                                    db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
-                                    db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
-                                    await db.SaveChangesAsync();
-                                }
-                                var confirm = new HeartbeatConfirmation() { currentTime = DateTime.Now };
-                                result.Message = confirm;
-                                result.Success = true;
-                            }
+                            //Task updateBeatTask = Task.Run(async () =>
+                            // {
+                            //     using (var db = new MainDBContext())
+                            //     {
+                            //         var machine = new Machine() { Id = session.MachineId };
+                            //         if (machine != null)
+                            //         {
+                            //             db.Configuration.AutoDetectChangesEnabled = false;
+                            //             db.Configuration.ValidateOnSaveEnabled = false;
+                            //             db.Machine.Attach(machine);
+                            //             machine.HeartbeatUpdatedOn = DateTime.Now;
+                            //             machine.ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1;
+                            //             db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
+                            //             db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
+                            //             await db.SaveChangesAsync();
+                            //         }
+
+                            //     }
+
+                            // });
+
+                            var confirm = new HeartbeatConfirmation() { currentTime = DateTime.Now };
+                            result.Message = confirm;
+                            result.Success = true;
                         }
                         break;
                     case Actions.MeterValues:
@@ -249,7 +254,7 @@ namespace EVCB_OCPP.WSServer.Message
                         break;
                     case Actions.StartTransaction:
                         {
-                           
+
                             StartTransactionRequest _request = request as StartTransactionRequest;
                             IdTagInfo _idTagInfo = new IdTagInfo()
                             {
@@ -429,13 +434,13 @@ namespace EVCB_OCPP.WSServer.Message
                         break;
                     default:
                         {
-                            Console.WriteLine(string.Format("Not Implement {0} Logic", request.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
+                            Console.WriteLine(string.Format("Not Implement {0} Logic(ExecuteCoreRequest)", request.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
                         }
                         break;
                 }
             }
             catch (Exception ex)
-            {               
+            {
                 logger.Fatal(string.Format("chargeBoxId:{0} {1}", session.ChargeBoxId, action));
                 logger.Fatal(string.Format("Data {0}", request.ToString()));
                 logger.Fatal(string.Format("Error {0}", ex.ToString()));
@@ -464,10 +469,25 @@ namespace EVCB_OCPP.WSServer.Message
                                 operation.FinishedOn = DateTime.Now;
                                 operation.Status = 1;//電樁有回覆
                                 operation.EVSE_Status = (int)_confirm.status;
-                                operation.EVSE_Value = _confirm.data;
+                                operation.EVSE_Value = string.IsNullOrEmpty(_confirm.data) ? "" : _confirm.data;
                                 db.SaveChanges();
                             }
-                        }                      
+
+                            if (_request.messageId == "ID_FirmwareVersion")
+                            {
+                                var machine = new Machine() { Id = session.MachineId };
+                                if (machine != null)
+                                {
+                                    db.Configuration.AutoDetectChangesEnabled = false;
+                                    db.Configuration.ValidateOnSaveEnabled = false;
+                                    db.Machine.Attach(machine);
+                                    machine.BoardVersions = _confirm.data;
+                                    db.Entry(machine).Property(x => x.BoardVersions).IsModified = true;
+                                    db.SaveChanges();
+                                }
+
+                            }
+                        }
                     }
                     break;
                 case Actions.ChangeAvailability:
@@ -718,7 +738,7 @@ namespace EVCB_OCPP.WSServer.Message
                     break;
                 default:
                     {
-                        Console.WriteLine(string.Format("Not Implement {0} Logic", confirm.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
+                        Console.WriteLine(string.Format("Not Implement {0} Logic(ExecuteCoreConfirm)", confirm.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
                     }
                     break;
             }
@@ -740,7 +760,13 @@ namespace EVCB_OCPP.WSServer.Message
                 case Actions.Reset:
                 case Actions.GetConfiguration:
                 case Actions.UnlockConnector:
+                case Actions.DataTransfer:
                     {
+                        if (action == Actions.DataTransfer)
+                        {
+                            logger.Debug(string.Format("DataTransfer Error {0}: {1}", session.ChargeBoxId, requestId));
+                        }
+
                         using (var db = new MainDBContext())
                         {
                             var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
@@ -761,7 +787,7 @@ namespace EVCB_OCPP.WSServer.Message
 
                 default:
                     {
-                        Console.WriteLine(string.Format("Not Implement {0} Logic", action));
+                        Console.WriteLine(string.Format("Not Implement {0} Logic(ReceivedCoreError)", action));
                     }
                     break;
             }

+ 105 - 11
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -33,6 +33,8 @@ using System.Security.Cryptography.X509Certificates;
 using EVCB_OCPP.WSServer.Service;
 using EVCB_OCPP.Packet.Messages.SmartCharging;
 using System.Security.Authentication;
+using NLog.Fluent;
+using System.Diagnostics;
 
 namespace EVCB_OCPP.WSServer
 {
@@ -69,12 +71,6 @@ namespace EVCB_OCPP.WSServer
              "GetCompositeSchedule",
              "ReserveNow",
              "CancelReservation",
-
-
-
-
-
-
         };
         private List<Profile> profiles = new List<Profile>()
         {
@@ -115,7 +111,10 @@ namespace EVCB_OCPP.WSServer
             serverUpdateTask.Start();
 
 
-            Task serverHealthTask = new Task(HealthAlarmTrigger, _ct);
+            Task serverBeatTask = new Task(HeartBeatCheckTrigger, _ct);
+            serverBeatTask.Start();
+
+            Task serverHealthTask = new Task(HealthCheckTrigger, _ct);
             serverHealthTask.Start();
 
             while (true)
@@ -229,8 +228,38 @@ namespace EVCB_OCPP.WSServer
             }
         }
 
+        private void CheckVersion(string chargeBoxId)
+        {
+            if (string.IsNullOrEmpty(chargeBoxId)) return;
+            using (var db = new MainDBContext())
+            {
+                db.ServerMessage.Add(new ServerMessage()
+                {
+                    ChargeBoxId = chargeBoxId,
+                    CreatedBy = "Server",
+                    CreatedOn = DateTime.Now,
+                    OutAction = Actions.DataTransfer.ToString(),
+                    OutRequest = JsonConvert.SerializeObject(
+                          new DataTransferRequest()
+                          {
+                              messageId = "ID_FirmwareVersion",
+                              vendorId = "Phihong Technology"
+
+                          },
+                          new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                    SerialNo = Guid.NewGuid().ToString(),
+                    InMessage = string.Empty
+
+                });
+
+                db.SaveChanges();
+            }
+
+        }
+
         private void CheckEVSEConfigure(string chargeBoxId)
         {
+            if (string.IsNullOrEmpty(chargeBoxId)) return;
             int skipCount = 0;
             int takeCount = 8;
             using (var db = new MainDBContext())
@@ -366,6 +395,8 @@ namespace EVCB_OCPP.WSServer
                         return;
                     }
                     ClientData _removeClient = null;
+
+
                     clientDic.TryGetValue(session.ChargeBoxId, out _removeClient);
                     if (_removeClient != null)
                     {
@@ -391,7 +422,7 @@ namespace EVCB_OCPP.WSServer
                         }
                     }
 
-
+                    CheckVersion(session.ChargeBoxId);
                     CheckEVSEConfigure(session.ChargeBoxId);
                 }
             }
@@ -1035,8 +1066,71 @@ namespace EVCB_OCPP.WSServer
             }
         }
 
+        DateTime lastcheckdt = new DateTime();
+        async private void HeartBeatCheckTrigger()
+        {
+            for (; ; )
+            {
+                if (_ct.IsCancellationRequested)
+                {
+                    break;
+                }
+
+                try
+                {          
+
+                    if (DateTime.Now.Subtract(lastcheckdt).TotalSeconds > 20)
+                    {
+                        Stopwatch watch = new Stopwatch();
+                        Dictionary<string, ClientData> _copyClientDic = null;
+                        lock (_lockClientDic)
+                        {
+                            _copyClientDic = new Dictionary<string, ClientData>(clientDic);
+                        }
+
+                        var clients = _copyClientDic.Where(x => x.Value.LastActiveTime > DateTime.Now.AddSeconds(-60)).Select(x => x.Value).ToList();
+
+                        watch.Start();
+                        foreach (var session in clients)
+                        {
+
+                            using (var db = new MainDBContext())
+                            {
+                                var machine = new Machine() { Id = session.MachineId };
+                                if (machine != null)
+                                {
+                                    db.Configuration.AutoDetectChangesEnabled = false;
+                                    db.Configuration.ValidateOnSaveEnabled = false;
+                                    db.Machine.Attach(machine);
+                                    machine.HeartbeatUpdatedOn = DateTime.Now;
+                                    machine.ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1;
+                                    db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
+                                    db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
+                                    await db.SaveChangesAsync();
+                                }
+
+                            }
+                        }
+                        watch.Stop();
+                        if (watch.ElapsedMilliseconds/1000 > 5)
+                        {
+                            logger.Fatal("Update HeartBeatCheckTrigger cost " + watch.ElapsedMilliseconds / 1000 + " seconds.");
+                        }
+                    }
+                    lastcheckdt = DateTime.Now;
+
+                    await Task.Delay(60000);
+                }
+                catch (Exception ex)
+                {
+                    logger.Error(string.Format("HealthAlarmTrigger  Ex:{0}", ex.ToString()));
+                }
+
+            }
+        }
+
 
-        async private void HealthAlarmTrigger()
+        async private void HealthCheckTrigger()
         {
             for (; ; )
             {
@@ -1235,9 +1329,9 @@ namespace EVCB_OCPP.WSServer
 
                 if (clientData == null || string.IsNullOrEmpty(data)) return;
 
-                if(clientData.ChargeBoxId==null)
+                if (clientData.ChargeBoxId == null)
                 {
-                    logger.Fatal("********************session ChargeBoxId null sessionId="+clientData.SessionID);
+                    logger.Fatal(clientData.Path + "]********************session ChargeBoxId null sessionId=" + clientData.SessionID);
                 }
                 using (var db = new ConnectionLogDBContext())
                 {

+ 3 - 3
EVCB_OCPP.WSServer/SuperSocket.Protocol/OCPPWSServer.cs

@@ -54,7 +54,7 @@ namespace OCPPServer.Protocol
 
         protected override bool ValidateClientCertificate(ClientData session, object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
         {
-          //  Console.WriteLine(string.Format("{0} :{1}", session.ChargeBoxId + " ValidateClientCertificate", sslPolicyErrors));
+            //  Console.WriteLine(string.Format("{0} :{1}", session.ChargeBoxId + " ValidateClientCertificate", sslPolicyErrors));
             return true;
             // return base.ValidateClientCertificate(session, sender, certificate, chain, sslPolicyErrors);
         }
@@ -62,14 +62,14 @@ namespace OCPPServer.Protocol
         protected override bool ValidateHandshake(ClientData session, string origin)
         {
 
-       
+
             string[] words = session.Path.Split('/');
             session.ChargeBoxId = words.Last();
             Console.WriteLine(string.Format("{0} :ValidateHandshake: {1}", DateTime.Now.ToString("yy/MM/dd HH:mm:ss.fff"), session.Path));
             bool isExistedSN = false;
             using (var db = new MainDBContext())
             {
-                var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
+                var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.IsDelete == false).FirstOrDefault();
                 session.CustomerId = machine == null ? Guid.Empty : machine.CustomerId;
                 session.MachineId = machine == null ? String.Empty : machine.Id;
                 isExistedSN = machine == null ? false : true;

BIN
TestTool.RemoteTriggerAPP/DLL/EVCB_OCPP.Domain.dll


+ 1 - 1
TestTool.RemoteTriggerAPP/MainWindow.xaml

@@ -5,7 +5,7 @@
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:TestTool.RemoteTriggerAPP"      
         mc:Ignorable="d"
-        Title="下發測試用工具(公司內網) V1.1.19 (20200612)" Height="481" Width="639">
+        Title="下發測試用工具(公司內網) V1.1.21 (20200618)" Height="481" Width="639">
     <Viewbox>
         <Grid Margin="0,2,2,0">
             <Grid.ColumnDefinitions>