Bladeren bron

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

Jessica Tseng 2 jaren geleden
bovenliggende
commit
c652666ccb

+ 27 - 1
EVCB_OCPP.WSServer/EVCB_OCPP.WSServer.csproj

@@ -12,6 +12,21 @@
     <FileAlignment>512</FileAlignment>
     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
     <Deterministic>true</Deterministic>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -212,7 +227,18 @@
       <Name>SuperWebSocket.NET45</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.7.1">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4.7.1 %28x86 和 x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PreBuildEvent>GitVersion.exe $(ProjectDir) /updateassemblyinfo</PreBuildEvent>

+ 18 - 9
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -102,7 +102,7 @@ namespace EVCB_OCPP.WSServer.Message
                                         TotalCost = creditDeductResult.amount,
 
                                     };
-                               
+
                                     var response = await httpClient.Post(GlobalConfig.TCC_API_URL + "prepare_issue_invoice", new Dictionary<string, string>()
                                         {
                                             { "PartnerId",session.CustomerId.ToString()}
@@ -141,6 +141,7 @@ namespace EVCB_OCPP.WSServer.Message
 
 
                                     confirm.status = DataTransferStatus.Accepted;
+                                    confirm.data = JsonConvert.SerializeObject(new { msgId = "ID_ReaderStatus", ConnectorId = preauth_status.ConnectorId });
                                 }
                             }
                             result.Message = confirm;
@@ -482,11 +483,11 @@ namespace EVCB_OCPP.WSServer.Message
                                         MeterStart = _request.meterStart,
                                         CustomerId = _CustomerId,
                                         StartTime = _request.timestamp.ToUniversalTime(),
-                                        ReservationId = _request.reservationId.HasValue ? _request.reservationId.Value : 0,                                    
+                                        ReservationId = _request.reservationId.HasValue ? _request.reservationId.Value : 0,
                                     };
 
                                     _newTransaction.Fee = !session.IsBilling ? string.Empty : session.BillingMethod == 1 ? JsonConvert.SerializeObject(session.ChargingPrices) : session.ChargingFeebyHour.ToString();
-                                    _newTransaction.Fee += !session.IsBilling ? string.Empty :"|+" + accountBalance + "+" + "&" + session.ParkingFee + "&|" + session.Currency;
+                                    _newTransaction.Fee += !session.IsBilling ? string.Empty : "|+" + accountBalance + "+" + "&" + session.ParkingFee + "&|" + session.Currency;
                                     db.TransactionRecord.Add(_newTransaction);
 
                                     db.SaveChanges();
@@ -558,6 +559,19 @@ namespace EVCB_OCPP.WSServer.Message
 
                                 if (transaction != null)
                                 {
+                                    var confirm = new StopTransactionConfirmation()
+                                    {
+                                        idTagInfo = _idTagInfo
+
+                                    };
+                                    //Avoid rewrite transaction data
+                                    if (transaction.StopTime != GlobalConfig.DefaultNullTime)
+                                    {
+                                        result.Message = confirm;
+                                        result.Success = true;
+                                        return result;
+                                    }
+
                                     _ConnectorId = transaction.ConnectorId;
                                     transaction.MeterStop = _request.meterStop;
                                     transaction.StopTime = _request.timestamp.ToUniversalTime();
@@ -566,13 +580,8 @@ namespace EVCB_OCPP.WSServer.Message
                                     transaction.Receipt = string.Empty;
                                     transaction.Cost = session.IsBilling ? -1 : 0;
 
-
                                     await db.SaveChangesAsync();
-                                    var confirm = new StopTransactionConfirmation()
-                                    {
-                                        idTagInfo = _idTagInfo
 
-                                    };
 
 
                                     if (session.IsBilling)
@@ -828,7 +837,7 @@ namespace EVCB_OCPP.WSServer.Message
 
                                         // 計算停車費
                                         var parkingFee = decimal.Parse(feedto.Fee.Split('&')[1]);
-                                        var stoptime = feedto.StopTime==GlobalConfig.DefaultNullTime ? DateTime.Parse(DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm")) : DateTime.Parse(feedto.StopTime.ToString("yyyy/MM/dd HH:mm"));
+                                        var stoptime = feedto.StopTime == GlobalConfig.DefaultNullTime ? DateTime.Parse(DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm")) : DateTime.Parse(feedto.StopTime.ToString("yyyy/MM/dd HH:mm"));
                                         var starttime = DateTime.Parse(feedto.StartTime.ToString("yyyy/MM/dd HH:mm"));
                                         var totalHours = stoptime.Subtract(starttime).TotalHours;
                                         var parkingCost = Decimal.Multiply((decimal)totalHours, parkingFee);

+ 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; }
+
     }
 }

+ 8 - 2
EVCB_OCPP.WSServer/Message/OCPP16MessageHandler.cs

@@ -290,8 +290,14 @@ namespace EVCB_OCPP.WSServer.Message
             BasicMessageResult result = new BasicMessageResult();
             try
             {
-                i = -1 ;
+                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)
@@ -319,7 +325,7 @@ namespace EVCB_OCPP.WSServer.Message
             catch (Exception ex)
             {
                 result.Exception = ex;
-                logger.Error(string.Format(i+"UnPackPayloadbyCallResult Data:[{0},{1}] Ex: {2}", uniqueId, payload, ex.ToString()), "UnPack");
+                logger.Error(string.Format(i + "UnPackPayloadbyCallResult Data:[{0},{1}] Ex: {2}", uniqueId, payload, ex.ToString()), "UnPack");
 
             }
             return result;

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

@@ -31,8 +31,8 @@ using System.Runtime.InteropServices;
 //
 // 您可以指定所有的值,或將組建編號或修訂編號設為預設值
 // 指定為預設值: 
-// [assembly: AssemblyVersion("1.0.4.0")]
-[assembly: AssemblyVersion("1.0.4.0")]
-[assembly: AssemblyFileVersion("1.0.4.0")]
+// [assembly: AssemblyVersion("1.0.5.0")]
+[assembly: AssemblyVersion("1.0.5.0")]
+[assembly: AssemblyFileVersion("1.0.5.0")]
 
-[assembly: AssemblyInformationalVersion("499dc33")]
+[assembly: AssemblyInformationalVersion("f8bef6e")]

+ 92 - 59
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -104,10 +104,6 @@ namespace EVCB_OCPP.WSServer
         {
             _ct = _cts.Token;
             WarmUpLog();
-
-
-
-
         }
 
 
@@ -296,7 +292,7 @@ namespace EVCB_OCPP.WSServer
                     SerialNo = Guid.NewGuid().ToString(),
                     InMessage = string.Empty
 
-                });
+                });              
 
                 db.SaveChanges();
             }
@@ -756,9 +752,7 @@ namespace EVCB_OCPP.WSServer
                                 {
                                     if (((BootNotificationConfirmation)replyResult.Message).status == Packet.Messages.SubTypes.RegistrationStatus.Accepted)
                                     {
-                                        session.IsCheckIn = true;
-
-                                      
+                                        session.IsCheckIn = true;                                      
                                         CheckVersion(session.ChargeBoxId);
                                         CheckEVSEConfigure(session.ChargeBoxId);
 
@@ -1330,8 +1324,7 @@ namespace EVCB_OCPP.WSServer
 
                 try
                 {
-                    RemoveConfirmMessage();
-
+                    RemoveConfirmMessage();                   
                     BasicMessageHandler msgAnalyser = new BasicMessageHandler();
                     using (var db = new MainDBContext())
                     {
@@ -1347,7 +1340,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;
@@ -1358,8 +1366,10 @@ 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)
                                     {
                                         IRequest request = null;
@@ -1382,7 +1392,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"), "");
                                         }
 
@@ -1394,20 +1404,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 };
@@ -1419,12 +1429,12 @@ namespace EVCB_OCPP.WSServer
                                         db.Entry(_UpdatedItem).Property(x => x.UpdatedOn).IsModified = true;// 可以直接使用這方式強制某欄位要更新,只是查詢集合耗效能而己
 
                                         db.SaveChanges();
-                                        await Task.Delay(100);
+
                                         #endregion
 
+                                        await Task.Delay(100);
 
                                     }
-
                                 }
                             }
                         }
@@ -1821,53 +1831,62 @@ namespace EVCB_OCPP.WSServer
 
             using (SqlConnection conn = new SqlConnection(webConnectionString))
             {
-                var parameters = new DynamicParameters();
-                parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input);
-                string displayPricestrSql = "";
-                string strSql = "";
-               
-                if (client.IsAC)
+                try
                 {
-                    displayPricestrSql = "   SELECT  [AC_BillingMethod] as BillingMethod,[AC_FeeName] as FeeName,[AC_Fee] as ChargingFeebyHour" +
-                "  ,[AC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
-                "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
 
-                    strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
-                   " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=1; ";
-                }
-                else
-                {
-                    displayPricestrSql = "   SELECT  [DC_BillingMethod] as BillingMethod,[DC_FeeName] as FeeName,[DC_Fee] as ChargingFeebyHour" +
-               "  ,[DC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
-               "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
 
-                    strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
-                   " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=0; ";
+                    var parameters = new DynamicParameters();
+                    parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input);
+                    string displayPricestrSql = "";
+                    string strSql = "";
+
+                    if (client.IsAC)
+                    {
+                        displayPricestrSql = "   SELECT  [AC_BillingMethod] as BillingMethod,[AC_FeeName] as FeeName,[AC_Fee] as ChargingFeebyHour" +
+                    "  ,[AC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
+                    "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
+
+                        strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
+                       " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=1; ";
+                    }
+                    else
+                    {
+                        displayPricestrSql = "   SELECT  [DC_BillingMethod] as BillingMethod,[DC_FeeName] as FeeName,[DC_Fee] as ChargingFeebyHour" +
+                   "  ,[DC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
+                   "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
+
+                        strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
+                       " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=0; ";
+
+                    }
+                    var result = await conn.QueryAsync<StationFee>(displayPricestrSql, parameters);
+                    if (result.Count() == 0)
+                    {
+                        return string.Empty;
+                    }
+                    var stationPrice = result.First();
+
+                    if (stationPrice.BillingMethod == 1)
+                    {
+                        var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(strSql, parameters);
+                        client.ChargingPrices = chargingPriceResult.ToList();
+                        if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime))
+                        {
+                            client.ChargingPrices = new List<ChargingPrice>();
+                        }
+                    }
 
+                    displayPriceText = stationPrice.FeeName;
+                    client.BillingMethod = stationPrice.BillingMethod;
+                    client.Currency = stationPrice.Currency;
+                    client.ChargingFeebyHour = stationPrice.ChargingFeebyHour;
+                    client.ParkingFee = stationPrice.ParkingFee;
+                    client.IsBilling = true;
                 }
-                var result = await conn.QueryAsync<StationFee>(displayPricestrSql, parameters);
-                if (result.Count() == 0)
+                catch (Exception ex)
                 {
-                    return string.Empty;
+                    logger.Error(ex.ToString());
                 }
-                var stationPrice = result.First();
-              
-                if (stationPrice.BillingMethod == 1)
-                {
-                    var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(strSql, parameters);
-                    client.ChargingPrices = chargingPriceResult.ToList();
-                    if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime))
-                    {
-                        client.ChargingPrices = new List<ChargingPrice>();
-                    }
-                }               
-
-                displayPriceText = stationPrice.FeeName;
-                client.BillingMethod = stationPrice.BillingMethod;
-                client.Currency = stationPrice.Currency;
-                client.ChargingFeebyHour = stationPrice.ChargingFeebyHour;
-                client.ParkingFee = stationPrice.ParkingFee;
-                client.IsBilling = true;             
             }
 
             return displayPriceText;
@@ -1910,16 +1929,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 > 0 && 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 = 3;
             _needConfirmMsg.ChargePointSerialNumber = chargePointSerialNumber;
             _needConfirmMsg.RequestId = requestId;
             _needConfirmMsg.SentUniqueId = msg_id;
+            _needConfirmMsg.CreatedBy = createdBy;
+            _needConfirmMsg.SentMessage = sendMessage;
 
             if (needConfirmActions.Contains(action))
             {

BIN
SuperWebSocket/bin/Debug/SuperWebSocket.dll


BIN
SuperWebSocket/bin/Debug/SuperWebSocket.pdb