Explorar el Código

1.server 內部指令 若沒收到回覆retry maxlimit 3 times , 每分鐘重送一次
2.底層message處理 ,從電樁Queue裡面沒有看到Request訊息 則回覆明確訊息 can't find request

Jessica Tseng hace 2 años
padre
commit
8683d1c41a

+ 2 - 0
EVCB_OCPP.WSServer/Message/NeedConfirmMessage.cs

@@ -44,5 +44,7 @@ namespace EVCB_OCPP.WSServer.Message
         /// </summary>
         public string RequestId { set; get; }
 
+        public string CreatedBy { set; get; }
+
     }
 }

+ 6 - 0
EVCB_OCPP.WSServer/Message/OCPP16MessageHandler.cs

@@ -292,6 +292,12 @@ namespace EVCB_OCPP.WSServer.Message
             {
                 i = -1 ;
                 IRequest request = requestQueue.RestoreRequest(uniqueId);
+
+                if (request == null)
+                {
+                    result.Exception = new Exception("Can't find request");
+                    return result;
+                }
                 i = 2;
                 Feature feature = null;
                 foreach (var profile in profiles)

+ 1 - 1
EVCB_OCPP.WSServer/Properties/AssemblyInfo.cs

@@ -35,4 +35,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyVersion("1.0.5.0")]
 [assembly: AssemblyFileVersion("1.0.5.0")]
 
-[assembly: AssemblyInformationalVersion("f59930c")]
+[assembly: AssemblyInformationalVersion("6961d91")]

+ 42 - 11
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -1342,7 +1342,22 @@ namespace EVCB_OCPP.WSServer
                         {
                             // Console.WriteLine(string.Format("Now:{0} commandList Count:{1} ", DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss"), commandList.Count));
                         }
+                        var resendList = GetResendMessage();
+                        foreach (var resendItem in resendList)
+                        {
+                            ClientData session;
+                            if (clientDic.TryGetValue(resendItem.ChargePointSerialNumber, out session))
+                            {
+                                if (DateTime.UtcNow.Subtract(resendItem.SentOn).TotalSeconds > 1)
+                                {
+                                    resendItem.SentTimes--;
+                                    resendItem.SentOn = DateTime.UtcNow;
+                                    Send(session, resendItem.SentMessage, string.Format("{0} {1}", resendItem.SentAction, "Request"), "");
+                                }
 
+                            }
+
+                        }
                         foreach (var charger_SN in cmdMachineList)
                         {
                             ClientData session;
@@ -1353,6 +1368,8 @@ namespace EVCB_OCPP.WSServer
 
                                 if (session.IsCheckIn && !session.ISOCPP20)
                                 {
+                                    string rawRequest = string.Empty;
+
                                     var cmdList = commandList.Where(c => c.ChargeBoxId == charger_SN).ToList();
 
                                     foreach (var item in cmdList)
@@ -1377,7 +1394,7 @@ namespace EVCB_OCPP.WSServer
                                         {
                                             request = JsonConvert.DeserializeObject(item.OutRequest, _RequestType) as IRequest;
                                             uuid = session.queue.store(request);
-                                            string rawRequest = BasicMessageHandler.GenerateRequest(uuid, item.OutAction, request);
+                                            rawRequest = BasicMessageHandler.GenerateRequest(uuid, item.OutAction, request);
                                             Send(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
                                         }
 
@@ -1389,20 +1406,20 @@ namespace EVCB_OCPP.WSServer
                                             {
                                                 request = Activator.CreateInstance(_RequestType) as IRequest;
                                                 uuid = session.queue.store(request);
-                                                string rawRequest = BasicMessageHandler.GenerateDestroyRequest(uuid, item.OutAction, item.OutRequest);
+                                                rawRequest = BasicMessageHandler.GenerateDestroyRequest(uuid, item.OutAction, item.OutRequest);
                                                 Send(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
 
                                             }
                                             else
                                             {
 
-                                                string rawRequest = BasicMessageHandler.GenerateDestroyRequest(Guid.NewGuid().ToString(), item.OutAction, item.OutRequest);
+                                                rawRequest = BasicMessageHandler.GenerateDestroyRequest(Guid.NewGuid().ToString(), item.OutAction, item.OutRequest);
                                                 Send(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
 
                                             }
                                         }
 
-                                        AddConfirmMessage(charger_SN, item.Id, item.SerialNo, item.OutAction, uuid);
+                                        AddConfirmMessage(charger_SN, item.Id, item.SerialNo, item.OutAction, uuid, item.CreatedBy, rawRequest);
 
                                         #region 更新資料表單一欄位
                                         var _UpdatedItem = new ServerMessage() { Id = item.Id, UpdatedOn = DateTime.UtcNow };
@@ -1414,9 +1431,10 @@ namespace EVCB_OCPP.WSServer
                                         db.Entry(_UpdatedItem).Property(x => x.UpdatedOn).IsModified = true;// 可以直接使用這方式強制某欄位要更新,只是查詢集合耗效能而己
 
                                         db.SaveChanges();
-                                        await Task.Delay(100);
+
                                         #endregion
 
+                                        await Task.Delay(100);
 
                                     }
 
@@ -1905,16 +1923,30 @@ namespace EVCB_OCPP.WSServer
         }
 
 
-        private void AddConfirmMessage(string chargePointSerialNumber, int table_id, string requestId, string action, string msg_id)
+        private List<NeedConfirmMessage> GetResendMessage()
+        {
+            List<NeedConfirmMessage> sendMessages = new List<NeedConfirmMessage>();
+            lock (_lockConfirmPacketList)
+            {
+                sendMessages = needConfirmPacketList.Where(x => x.SentTimes > 1 && x.CreatedBy == "Server").ToList();
+
+            }
+
+            return sendMessages;
+        }
+
+        private void AddConfirmMessage(string chargePointSerialNumber, int table_id, string requestId, string action, string msg_id, string createdBy, string sendMessage)
         {
             NeedConfirmMessage _needConfirmMsg = new NeedConfirmMessage();
             _needConfirmMsg.Id = table_id;
             _needConfirmMsg.SentAction = action;
             _needConfirmMsg.SentOn = DateTime.UtcNow;
-            _needConfirmMsg.SentTimes = 1;
+            _needConfirmMsg.SentTimes = 4;
             _needConfirmMsg.ChargePointSerialNumber = chargePointSerialNumber;
             _needConfirmMsg.RequestId = requestId;
             _needConfirmMsg.SentUniqueId = msg_id;
+            _needConfirmMsg.CreatedBy = createdBy;
+            _needConfirmMsg.SentMessage = sendMessage;
 
             if (needConfirmActions.Contains(action))
             {
@@ -1928,15 +1960,14 @@ namespace EVCB_OCPP.WSServer
 
         private void RemoveConfirmMessage()
         {
-
-            var before_3mins = DateTime.UtcNow.AddMinutes(-3);
+            var before10Mins = DateTime.UtcNow.AddMinutes(-10);
             lock (_lockConfirmPacketList)
             {
-                var removeList = needConfirmPacketList.Where(x => x.SentTimes == 0 || x.SentOn < before_3mins).ToList();
+                var removeList = needConfirmPacketList.Where(x => x.SentTimes == 0 || x.SentOn < before10Mins).ToList();
                 foreach (var item in removeList)
                 {
                     needConfirmPacketList.Remove(item);
-                }
+                }               
             }
         }