Explorar o código

1.加入StopTransaction 處理遇到Exception 不回電樁訊息,讓電樁重送Request

Jessica Tseng %!s(int64=2) %!d(string=hai) anos
pai
achega
b50e3eeff9

+ 87 - 76
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -518,109 +518,110 @@ namespace EVCB_OCPP.WSServer.Message
                                 _idTagInfo = new IdTagInfo() { expiryDate = DateTime.UtcNow.AddDays(1), status = AuthorizationStatus.Accepted };
                             }
 
-
-
-                            using (var db = new MainDBContext())
+                            try
                             {
-                                var transaction = db.TransactionRecord.Where(x => x.Id == _request.transactionId
-                                 && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
-
-                                //遠傳太久以前的停止充電 直接拒絕 避免電樁持續重送~~~~~~~
-                                if (_request.timestamp < new DateTime(2021, 11, 1))
+                                using (var db = new MainDBContext())
                                 {
-                                    var confirm = new StopTransactionConfirmation()
+                                    var transaction = db.TransactionRecord.Where(x => x.Id == _request.transactionId
+                                     && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
+
+                                   // throw new Exception("123");
+                                    //遠傳太久以前的停止充電 直接拒絕 避免電樁持續重送~~~~~~~
+                                    if (_request.timestamp < new DateTime(2021, 11, 1))
                                     {
-                                        idTagInfo = new IdTagInfo()
+                                        var confirm = new StopTransactionConfirmation()
                                         {
-                                            status = AuthorizationStatus.Invalid
-                                        }
-
-                                    };
-
-                                    result.Message = confirm;
-                                    result.Success = true;
-                                    return result;
-                                }
-
+                                            idTagInfo = new IdTagInfo()
+                                            {
+                                                status = AuthorizationStatus.Invalid
+                                            }
 
-                                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();
-                                    transaction.StopReasonId = _request.reason.HasValue ? (int)_request.reason.Value : 0;
-                                    transaction.StopIdTag = _request.idTag;
-                                    transaction.Receipt = string.Empty;
-                                    transaction.Cost = session.IsBilling ? -1 : 0;
 
-                                    await db.SaveChangesAsync();
+                                    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();
+                                        transaction.StopReasonId = _request.reason.HasValue ? (int)_request.reason.Value : 0;
+                                        transaction.StopIdTag = _request.idTag;
+                                        transaction.Receipt = string.Empty;
+                                        transaction.Cost = session.IsBilling ? -1 : 0;
+
+                                        await db.SaveChangesAsync();
 
 
 
-                                    if (session.IsBilling)
-                                    {
-                                        db.ServerMessage.Add(new ServerMessage()
+                                        if (session.IsBilling)
                                         {
-                                            ChargeBoxId = session.ChargeBoxId,
-                                            CreatedBy = "Server",
-                                            CreatedOn = DateTime.UtcNow,
-                                            OutAction = Actions.DataTransfer.ToString(),
-                                            OutRequest = JsonConvert.SerializeObject(
-                                                       new DataTransferRequest()
-                                                       {
-                                                           messageId = "ID_TxEnergy",
-                                                           vendorId = "Phihong Technology",
-                                                           data = JsonConvert.SerializeObject(new { txId = _request.transactionId, ConnectorId = transaction.ConnectorId })
-                                                       },
-                                                       new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
-                                            SerialNo = Guid.NewGuid().ToString(),
-                                            InMessage = string.Empty
+                                            db.ServerMessage.Add(new ServerMessage()
+                                            {
+                                                ChargeBoxId = session.ChargeBoxId,
+                                                CreatedBy = "Server",
+                                                CreatedOn = DateTime.UtcNow,
+                                                OutAction = Actions.DataTransfer.ToString(),
+                                                OutRequest = JsonConvert.SerializeObject(
+                                                           new DataTransferRequest()
+                                                           {
+                                                               messageId = "ID_TxEnergy",
+                                                               vendorId = "Phihong Technology",
+                                                               data = JsonConvert.SerializeObject(new { txId = _request.transactionId, ConnectorId = transaction.ConnectorId })
+                                                           },
+                                                           new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                                                SerialNo = Guid.NewGuid().ToString(),
+                                                InMessage = string.Empty
 
-                                        });
+                                            });
 
-                                        db.SaveChanges();
-                                    }
+                                            db.SaveChanges();
+                                        }
 
-                                    result.Message = confirm;
-                                    result.Success = true;
-                                }
-                                else
-                                {
+                                        result.Message = confirm;
+                                        result.Success = true;
+                                    }
+                                    else
+                                    {
 
-                                    result.Exception = new Exception("Can't find transactionId " + _request.transactionId);
+                                        result.Exception = new Exception("Can't find transactionId " + _request.transactionId);
 
+                                    }
                                 }
-                            }
 
-                            if (_request.transactionData != null)
-                            {
-                                if (_request.transactionData.Count > 0)
+                                if (_request.transactionData != null)
                                 {
-                                    using (var _meterDb = new MeterValueDBContext())
+                                    if (_request.transactionData.Count > 0)
                                     {
-                                        foreach (var item in _request.transactionData)
+                                        using (var _meterDb = new MeterValueDBContext())
                                         {
-                                            foreach (var sampleVaule in item.sampledValue)
+                                            foreach (var item in _request.transactionData)
                                             {
-                                                decimal value = Convert.ToDecimal(sampleVaule.value);
+                                                foreach (var sampleVaule in item.sampledValue)
+                                                {
+                                                    decimal value = Convert.ToDecimal(sampleVaule.value);
 
-                                                string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
-                             "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
+                                                    string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
+                                 "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
 
-                                                List<SqlParameter> parameter = new List<SqlParameter>
+                                                    List<SqlParameter> parameter = new List<SqlParameter>
                                         {
                                               new SqlParameter("ChargeBoxId",session.ChargeBoxId),
                                               new SqlParameter("ConnectorId",  (byte)_ConnectorId),
@@ -636,14 +637,24 @@ namespace EVCB_OCPP.WSServer.Message
                                           };
 
 
-                                                _meterDb.Database.ExecuteSqlCommand(sp, parameter.ToArray());
+                                                    _meterDb.Database.ExecuteSqlCommand(sp, parameter.ToArray());
+                                                }
                                             }
                                         }
-                                    }
 
 
+                                    }
                                 }
                             }
+                            catch(Exception ex)
+                            {
+                                result.Exception = new Exception("TransactionId " + _request.transactionId+" "+ ex.Message);
+                                result.CallErrorMsg = "Reject Response Message";
+                                result.Success = false;
+                               // return result;
+                            }
+
+                           
 
 
                         }

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

@@ -35,4 +35,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyVersion("0.1.0.0")]
 [assembly: AssemblyFileVersion("0.1.0.0")]
 
-[assembly: AssemblyInformationalVersion("86d7446")]
+[assembly: AssemblyInformationalVersion("f66cfe6")]

+ 13 - 4
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -908,10 +908,19 @@ namespace EVCB_OCPP.WSServer
                             }
                             else
                             {
-                                string response = BasicMessageHandler.GenerateCallError(analysisResult.UUID, OCPPErrorCodes.InternalError, OCPPErrorDescription.InternalError);
-                                string errorMsg = replyResult.Exception != null ? replyResult.Exception.ToString() : string.Empty;
 
-                                Send(session, response, string.Format("{0} {1}", analysisResult.Action, "Error"), errorMsg);
+                                if (action == Actions.StopTransaction && replyResult.CallErrorMsg == "Reject Response Message")
+                                {
+                                    //do nothing 
+                                }
+                                else
+                                {
+                                    string response = BasicMessageHandler.GenerateCallError(analysisResult.UUID, OCPPErrorCodes.InternalError, OCPPErrorDescription.InternalError);
+                                    string errorMsg = replyResult.Exception != null ? replyResult.Exception.ToString() : string.Empty;
+
+                                    Send(session, response, string.Format("{0} {1}", analysisResult.Action, "Error"), errorMsg);
+                                }
+
                             }
 
                             if (action == Actions.StartTransaction)
@@ -1967,7 +1976,7 @@ namespace EVCB_OCPP.WSServer
                 foreach (var item in removeList)
                 {
                     needConfirmPacketList.Remove(item);
-                }               
+                }
             }
         }