Browse Source

2020/05/25 Jessica
Actions:
1.Fix 多台電樁同時進入驗證、充電處理時間變成問題 -,改成非同步執行
2.調整更新流程
3.測試工具 隱藏更新測試功能
4.DomainDLL異動 版本號:b2bb0b6

Jessica.Tseng 4 năm trước cách đây
mục cha
commit
11d6f4374f

+ 11 - 11
EVCB_OCPP.WSServer/App.config

@@ -10,10 +10,10 @@
     <!--<add name="ConnectionLogDBContext" connectionString="data source=172.1.0.142\SQLEXPRESS;initial catalog=OCPP_ConnectionLogDBContext;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
     <add name="MainDBContext" connectionString="data source=172.1.0.142\SQLEXPRESS;initial catalog=OCPP_MainDBContext;;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
     <add name="MeterValueDBContext" connectionString="data source=172.1.0.142\SQLEXPRESS;initial catalog=OCPP_MeterValueDBContext;;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />-->
-   <add name="ConnectionLogDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_ConnectionLog;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
-   <add name="MainDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_Main;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
-   <add name="MeterValueDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_MeterValue;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
-   <add name="WebDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_Web;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
+   <add name="ConnectionLogDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_ConnectionLog;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework; Max Pool Size=500" providerName="System.Data.SqlClient" />
+   <add name="MainDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_Main;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework; Max Pool Size=500" providerName="System.Data.SqlClient" />
+   <add name="MeterValueDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_MeterValue;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework; Max Pool Size=500" providerName="System.Data.SqlClient" />
+   <add name="WebDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_Web;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework; Max Pool Size=500" providerName="System.Data.SqlClient" />
 
    </connectionStrings>
   <appSettings>
@@ -49,31 +49,31 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.2.0" newVersion="3.1.2.0" />
+        <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.2.0" newVersion="3.1.2.0" />
+        <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.2.0" newVersion="3.1.2.0" />
+        <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Options" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.2.0" newVersion="3.1.2.0" />
+        <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.2.0" newVersion="3.1.2.0" />
+        <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.DependencyInjection" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.2.0" newVersion="3.1.2.0" />
+        <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Logging" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.2.0" newVersion="3.1.2.0" />
+        <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />

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


+ 21 - 21
EVCB_OCPP.WSServer/EVCB_OCPP.WSServer.csproj

@@ -56,35 +56,35 @@
     <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Configuration, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Configuration.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Configuration, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Configuration.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Configuration.Abstractions.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Configuration.Abstractions.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Configuration.Binder, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Configuration.Binder.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Configuration.Binder, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Configuration.Binder.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.DependencyInjection, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.DependencyInjection.3.1.2\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.DependencyInjection, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.DependencyInjection.3.1.3\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.2\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.3\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Http, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Http.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Http.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Http, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Http.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Http.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Logging, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Logging.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Logging.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Logging, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Logging.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Logging.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Options, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Options.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Options.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Options, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Options.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Options.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Extensions.Primitives, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Extensions.Primitives.3.1.2\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
+    <Reference Include="Microsoft.Extensions.Primitives, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Primitives.3.1.3\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
     </Reference>
     <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
@@ -111,7 +111,7 @@
       <HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
     </Reference>
     <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
     </Reference>
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.ServiceModel" />

+ 7 - 1
EVCB_OCPP.WSServer/Message/BasicMessageHandler.cs

@@ -152,13 +152,14 @@ namespace EVCB_OCPP.WSServer.Message
                             break;
                         case TYPENUMBER_CALLERROR:
                             {
+                                result.Id = TYPENUMBER_CALLERROR;
                                 var sentRequest = UnPackPayloadbyCallError(client.queue, msg.Id);
 
                                 if (sentRequest != null)
                                 {
                                     IRequest request = sentRequest as IRequest;
                                     result.Action = request.Action;
-                                    result.Id = TYPENUMBER_CALLERROR;
+                                  
                                     result.Message = sentRequest;
                                     result.ReceivedErrorCode = string.Format("ErrorMsg {0}:{1}", ((CallErrorMessage)msg).ErrorCode, ((CallErrorMessage)msg).ErrorDescription);
                                 }
@@ -193,6 +194,11 @@ namespace EVCB_OCPP.WSServer.Message
         {
             try
             {
+                if(message.StartsWith("[4,\""))
+                {
+                    message= message.Replace('{', '"');
+                    message = message.Replace('}', '"');
+                }
                 var array = JsonConvert.DeserializeObject<JArray>(message);
                 BaseMessage msg = null;
                 switch ((int)array[INDEX_MESSAGEID])

+ 74 - 31
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -16,6 +16,8 @@ using EVCB_OCPP.WSServer.Dto;
 using Newtonsoft.Json;
 using OCPPPackage.Profiles;
 using OCPPServer.Protocol;
+using System.Configuration;
+using System.Transactions;
 
 namespace EVCB_OCPP.WSServer.Message
 {
@@ -23,8 +25,8 @@ namespace EVCB_OCPP.WSServer.Message
     internal partial class ProfileHandler
     {
 
-        int counnter = 0;
-        internal MessageResult ExecuteCoreRequest(Actions action, ClientData session, IRequest request)
+
+        async internal Task<MessageResult> ExecuteCoreRequest(Actions action, ClientData session, IRequest request)
         {
             MessageResult result = new MessageResult() { Success = false };
 
@@ -117,23 +119,22 @@ namespace EVCB_OCPP.WSServer.Message
                                     Id = Guid.NewGuid().ToString()
                                 };
                                 db.ConnectorStatus.Add(_currentStatus);
-
-
-                                if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted)
+                                
+                            }
+                            if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted)
+                            {
+                                db.MachineError.Add(new MachineError()
                                 {
-                                    db.MachineError.Add(new MachineError()
-                                    {
-                                        ConnectorId = (byte)_request.connectorId,
-                                        CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now,
-                                        Status = (int)_request.status,
-                                        ChargeBoxId = session.ChargeBoxId,
-                                        ErrorCodeId = (int)_request.errorCode,
-                                        ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info,
-                                        PreStatus = _oldStatus == null ? -1 : preStatus,
-                                        VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode,
-                                        VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId
-                                    });
-                                }
+                                    ConnectorId = (byte)_request.connectorId,
+                                    CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now,
+                                    Status = (int)_request.status,
+                                    ChargeBoxId = session.ChargeBoxId,
+                                    ErrorCodeId = (int)_request.errorCode,
+                                    ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info,
+                                    PreStatus = _oldStatus == null ? -1 : preStatus,
+                                    VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode,
+                                    VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId
+                                });
                             }
                             db.SaveChanges();
                         }
@@ -142,7 +143,7 @@ namespace EVCB_OCPP.WSServer.Message
                         if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted)
                         {
                             var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
-                            businessService.NotifyFaultStatus(new ErrorDetails()
+                           await businessService.NotifyFaultStatus(new ErrorDetails()
                             {
                                 ChargeBoxId = session.ChargeBoxId,
                                 ConnectorId = _request.connectorId,
@@ -173,7 +174,7 @@ namespace EVCB_OCPP.WSServer.Message
                                 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;
-                                db.SaveChanges();
+                                await db.SaveChangesAsync();
                             }
                             var confirm = new HeartbeatConfirmation() { currentTime = DateTime.Now };
                             result.Message = confirm;
@@ -193,12 +194,13 @@ namespace EVCB_OCPP.WSServer.Message
                                 {
                                     foreach (var sampleVaule in item.sampledValue)
                                     {
-                                        decimal value = Convert.ToDecimal(sampleVaule.value);
+                                        
+                                            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)_request.connectorId),
@@ -214,8 +216,13 @@ namespace EVCB_OCPP.WSServer.Message
                                           };
 
 
-                                        db.Database.ExecuteSqlCommand(sp, parameter.ToArray());
+                                            db.Database.ExecuteSqlCommand(sp, parameter.ToArray());
+                                       
+
+
+                                       
                                     }
+
                                 }
                             }
                         }
@@ -228,13 +235,19 @@ namespace EVCB_OCPP.WSServer.Message
                 case Actions.StartTransaction:
                     {
                         StartTransactionRequest _request = request as StartTransactionRequest;
-                        IdTagInfo _idTagInfo = new IdTagInfo() { status = AuthorizationStatus.Accepted };
+                        IdTagInfo _idTagInfo = new IdTagInfo()
+                        {
+                            expiryDate = DateTime.UtcNow.AddDays(1),
+                            parentIdTag = "Supervisor",
+                            status = AuthorizationStatus.Accepted
+
+                        };
 
                         int _transactionId = -1;
                         if (DateTime.Compare(DateTime.UtcNow.AddSeconds(-10), _request.timestamp.ToUniversalTime()) >= 0)
                         {
                             var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
-                            _idTagInfo = businessService.Authorize(session.ChargeBoxId, _request.idTag);
+                            _idTagInfo = await businessService.Authorize(session.ChargeBoxId, _request.idTag);
 
                         }
 
@@ -298,8 +311,16 @@ namespace EVCB_OCPP.WSServer.Message
                         List<TransactionDataRecord> _TransactionDatas = new List<TransactionDataRecord>();
                         int _ConnectorId = 0;
 
-                        var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
-                        var _idTagInfo = businessService.Authorize(session.ChargeBoxId, _request.idTag);
+                        //  var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
+                        // var _idTagInfo = businessService.Authorize(session.ChargeBoxId, _request.idTag);
+
+                        var _idTagInfo = new IdTagInfo()
+                        {
+                            expiryDate = DateTime.UtcNow.AddDays(1),
+                            parentIdTag = "Supervisor",
+                            status = AuthorizationStatus.Accepted
+
+                        };
 
                         using (var db = new MainDBContext())
                         {
@@ -319,7 +340,7 @@ namespace EVCB_OCPP.WSServer.Message
                                     _TransactionDatas.ForEach(x => x.ConnectorId = (byte)transaction.ConnectorId);
                                 }
 
-                                db.SaveChanges();
+                                await db.SaveChangesAsync();
                                 var confirm = new StopTransactionConfirmation()
                                 {
                                     idTagInfo = _idTagInfo
@@ -384,7 +405,7 @@ namespace EVCB_OCPP.WSServer.Message
                         var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
                         var confirm = new AuthorizeConfirmation()
                         {
-                            idTagInfo = businessService.Authorize(session.ChargeBoxId, _request.idTag)
+                            idTagInfo = await businessService.Authorize(session.ChargeBoxId, _request.idTag)
                         };
                         result.Message = confirm;
                         result.Success = true;
@@ -630,6 +651,27 @@ namespace EVCB_OCPP.WSServer.Message
                         }
                     }
                     break;
+                case Actions.UnlockConnector:
+                    {
+                        UnlockConnectorConfirmation _confirm = confirm as UnlockConnectorConfirmation;
+                        UnlockConnectorRequest _request = _confirm.GetRequest() as UnlockConnectorRequest;
+
+                        using (var db = new MainDBContext())
+                        {
+                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            if (operation != null)
+                            {
+                                operation.FinishedOn = DateTime.Now;
+                                operation.Status = 1;//電樁有回覆
+                                operation.EVSE_Status = (int)_confirm.status;
+                                operation.EVSE_Value = _confirm.status.ToString();
+                                db.SaveChanges();
+                            }
+
+                        }
+                    }
+                    break;
                 default:
                     {
                         Console.WriteLine(string.Format("Not Implement {0} Logic", confirm.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
@@ -653,6 +695,7 @@ namespace EVCB_OCPP.WSServer.Message
                 case Actions.RemoteStopTransaction:
                 case Actions.Reset:
                 case Actions.GetConfiguration:
+                case Actions.UnlockConnector:
                     {
                         using (var db = new MainDBContext())
                         {

+ 7 - 9
EVCB_OCPP.WSServer/Message/FirmwareManagementProfileHandler.cs

@@ -32,18 +32,16 @@ namespace EVCB_OCPP.WSServer.Message
                             string requestId = Guid.NewGuid().ToString();
                             using (var db = new MainDBContext())
                             {
-                                var machine = db.Machine.Where(x => x.FW_AssignedMachineVersionId.HasValue == true &&
-                                    x.FW_AssignedMachineVersionId != x.FW_VersionReport && x.ChargeBoxId == session.ChargeBoxId)
-                                    .Select(x => new { x.Id, x.FW_AssignedMachineVersionId }).AsNoTracking().FirstOrDefault();
+                                var machine = db.Machine.Where(x => x.FW_AssignedVersion.HasValue == true &&
+                                    x.FW_AssignedVersion != x.FW_VersionReport && x.ChargeBoxId == session.ChargeBoxId)
+                                    .Select(x => new { x.Id, x.FW_AssignedVersion }).AsNoTracking().FirstOrDefault();
 
                                 if (machine != null)
                                 {
-                                    var mv = db.MachineVersion.Include(c => c.PublishVersion)
-                                     .Include(c => c.PublishVersion.PublishVersionFiles)
-                                     .Include(c => c.PublishVersion.PublishVersionFiles.Select(z => z.UploadFile))
-                                     .Where(c => c.Id == machine.FW_AssignedMachineVersionId.Value).First();
+                                    var mv = db.MachineVersionFile.Include(c => c.UploadFile)                                   
+                                     .Where(c => c.Id == machine.FW_AssignedVersion.Value).First();
 
-                                    string downloadUrl = mv.PublishVersion.PublishVersionFiles.FirstOrDefault().UploadFile.FileUrl;
+                                    string downloadUrl = mv.UploadFile.FileUrl;
 
                                     var _updateFWrequest = new UpdateFirmwareRequest()
                                     {
@@ -59,7 +57,7 @@ namespace EVCB_OCPP.WSServer.Message
                                         SerialNo = requestId,
                                         RequestContent = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
                                         EVSE_Status = 0,
-                                        EVSE_Value = "Fw Version:" + machine.FW_AssignedMachineVersionId,
+                                        EVSE_Value = "Fw Version:" + machine.FW_AssignedVersion,
                                         Status = 0,
                                         RequestType = 0,
 

+ 1 - 0
EVCB_OCPP.WSServer/Program.cs

@@ -10,6 +10,7 @@ namespace EVCB_OCPP.WSServer
     {
         static void Main(string[] args)
         {
+           
             ProtalServer s = new ProtalServer();
             Console.WriteLine("Starting Server...");
             s.Start();

+ 75 - 57
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -93,6 +93,7 @@ namespace EVCB_OCPP.WSServer
         {
             _ct = _cts.Token;
             WarmUpLog();
+
         }
 
 
@@ -300,7 +301,7 @@ namespace EVCB_OCPP.WSServer
             // llistener.Add(new ListenerConfig { Ip = "", Port = Convert.ToInt32(wssserverPort), Backlog = 100, Security = serverSecurity });
             llistener.Add(new ListenerConfig { Ip = System.Net.IPAddress.Any.ToString(), Port = Convert.ToInt32(GlobalConfig.GetWS_Port()), Backlog = 100, Security = "None" });
             llistener.Add(new ListenerConfig { Ip = System.Net.IPAddress.Any.ToString(), Port = Convert.ToInt32(GlobalConfig.GetWSS_Port()), Backlog = 100, Security = SslProtocols.Tls12.ToString() });
-           // llistener.Add(new ListenerConfig { Ip = System.Net.IPAddress.Any.ToString(), Port = Convert.ToInt32(GlobalConfig.GetWSS_Port()), Backlog = 100, Security = SslProtocols.Tls11.ToString() });
+            // llistener.Add(new ListenerConfig { Ip = System.Net.IPAddress.Any.ToString(), Port = Convert.ToInt32(GlobalConfig.GetWSS_Port()), Backlog = 100, Security = SslProtocols.Tls11.ToString() });
             var config = ConfigurationManager.GetSection("superSocket") as IConfigurationSource;
             ICertificateConfig Certificate = config.Servers.ElementAt(0).Certificate;
             IEnumerable<IListenerConfig> listeners = llistener;
@@ -315,6 +316,9 @@ namespace EVCB_OCPP.WSServer
                 //Security = serverSecurity,
                 Certificate = Certificate,
                 Listeners = listeners,
+                LogAllSocketException = true,
+                KeepAliveTime = 10,
+                LogBasicSessionActivity = true
 
 
             };
@@ -399,71 +403,85 @@ namespace EVCB_OCPP.WSServer
 
         }
 
-        private void ReceivedMessage(ClientData session, string rawdata)
+        async private void ReceivedMessage(ClientData session, string rawdata)
         {
+            try
+            {
+                BasicMessageHandler msgAnalyser = new BasicMessageHandler();
+                MessageResult analysisResult = msgAnalyser.AnalysisReceiveData(session, rawdata);
 
-            BasicMessageHandler msgAnalyser = new BasicMessageHandler();
-            MessageResult analysisResult = msgAnalyser.AnalysisReceiveData(session, rawdata);
-
-            WriteMachineLog(session, rawdata,
-                 string.Format("{0} {1}", string.IsNullOrEmpty(analysisResult.Action) ? "unknown" : analysisResult.Action, analysisResult.Id == 2 ? "Request" : (analysisResult.Id == 3 ? "Confirmation" : "Error")), string.IsNullOrEmpty(analysisResult.CallErrorMsg) ? "" : analysisResult.Exception.Message);
+                WriteMachineLog(session, rawdata,
+                     string.Format("{0} {1}", string.IsNullOrEmpty(analysisResult.Action) ? "unknown" : analysisResult.Action, analysisResult.Id == 2 ? "Request" : (analysisResult.Id == 3 ? "Confirmation" : "Error")), string.IsNullOrEmpty(analysisResult.CallErrorMsg) ? "" : analysisResult.Exception.Message);
 
 
 
 
-            if (!analysisResult.Success)
-            {
-                //解析RawData就發生錯誤
-                if (!string.IsNullOrEmpty(analysisResult.CallErrorMsg))
+                if (!analysisResult.Success)
                 {
-                    Send(session, analysisResult.CallErrorMsg, string.Format("{0} {1}", analysisResult.Action, "Error"));
-                }
-                else
-                {
-                    BaseMessage _baseMsg = analysisResult.Message as BaseMessage;
-                    string replyMsg = msgAnalyser.GenerateCallError(_baseMsg.Id, OCPPErrorCodes.InternalError, OCPPErrorDescription.InternalError);
-                    string errorMsg = string.Empty;
-                    if (analysisResult.Exception != null)
+                    //解析RawData就發生錯誤
+                    if (!string.IsNullOrEmpty(analysisResult.CallErrorMsg))
                     {
-                        errorMsg = analysisResult.Exception.ToString();
+                        Send(session, analysisResult.CallErrorMsg, string.Format("{0} {1}", analysisResult.Action, "Error"));
                     }
+                    else
+                    {
+                        BaseMessage _baseMsg = analysisResult.Message as BaseMessage;
+                        string replyMsg = msgAnalyser.GenerateCallError(_baseMsg.Id, OCPPErrorCodes.InternalError, OCPPErrorDescription.InternalError);
+                        string errorMsg = string.Empty;
+                        if (analysisResult.Exception != null)
+                        {
+                            errorMsg = analysisResult.Exception.ToString();
+                        }
 
-                    Send(session, replyMsg, string.Format("{0} {1}", analysisResult.Action, "Error"), errorMsg);
+                        Send(session, replyMsg, string.Format("{0} {1}", analysisResult.Action, "Error"), errorMsg);
+                    }
                 }
-            }
-            else
-            {
-
-                Actions action = Convertor.GetAction(analysisResult.Action);
-                switch (analysisResult.Id)
+                else
                 {
-                    case BasicMessageHandler.TYPENUMBER_CALL:
-                        {
-                            ProcessRequestMessage(analysisResult, session, action);
 
-                        }
-                        break;
-                    case BasicMessageHandler.TYPENUMBER_CALLRESULT:
-                        {
+                    Actions action = Convertor.GetAction(analysisResult.Action);
+                    switch (analysisResult.Id)
+                    {
+                        case BasicMessageHandler.TYPENUMBER_CALL:
+                            {
+                                ProcessRequestMessage(analysisResult, session, action);
 
-                            ProcessConfirmationMessage(analysisResult, session, action);
-                        }
-                        break;
-                    case BasicMessageHandler.TYPENUMBER_CALLERROR:
-                        {
-                            //只處理 丟出Request 收到Error的訊息
-                            if (analysisResult.Success)
+                            }
+                            break;
+                        case BasicMessageHandler.TYPENUMBER_CALLRESULT:
                             {
-                                ProcessErrorMessage(analysisResult, session, action);
+
+                                ProcessConfirmationMessage(analysisResult, session, action);
                             }
+                            break;
+                        case BasicMessageHandler.TYPENUMBER_CALLERROR:
+                            {
+                                //只處理 丟出Request 收到Error的訊息                              
+                                if (analysisResult.Success && analysisResult.Message != null)
+                                {
+                                    ProcessErrorMessage(analysisResult, session, action);
+                                }
 
-                        }
-                        break;
-                    default:
-                        {
-                            logger.Error(string.Format("Can't analyze messagetype:{0} of raw data :{1} by {2}", analysisResult.Id, rawdata, session.ChargeBoxId));
-                        }
-                        break;
+                            }
+                            break;
+                        default:
+                            {
+                                logger.Error(string.Format("Can't analyze messagetype:{0} of raw data :{1} by {2}", analysisResult.Id, rawdata, session.ChargeBoxId));
+                            }
+                            break;
+
+                    }
+                }
+
+                await Task.Delay(10);
+            }
+            catch (Exception ex)
+            {
+                logger.Error(string.Format("**Exception :{0} ", ex.ToString()));
+
+                if (ex.InnerException != null)
+                {
+                    logger.Error(string.Format("**Inner exception :{0} ", ex.InnerException.ToString()));
 
                 }
             }
@@ -473,7 +491,7 @@ namespace EVCB_OCPP.WSServer
 
 
 
-        private void ProcessRequestMessage(MessageResult analysisResult, ClientData session, Actions action)
+        async private void ProcessRequestMessage(MessageResult analysisResult, ClientData session, Actions action)
         {
             BasicMessageHandler msgAnalyser = new BasicMessageHandler();
             if (!session.IsCheckIn && action != Actions.BootNotification)
@@ -490,7 +508,7 @@ namespace EVCB_OCPP.WSServer
                         {
 
                             bool oldstatus = session.IsCheckIn;
-                            var replyResult = profileHandler.ExecuteCoreRequest(action, session, (IRequest)analysisResult.Message);
+                            var replyResult = await profileHandler.ExecuteCoreRequest(action, session, (IRequest)analysisResult.Message);
                             if (replyResult.Success)
                             {
                                 string response = msgAnalyser.GenerateConfirmation(analysisResult.UUID, (IConfirmation)replyResult.Message);
@@ -798,8 +816,8 @@ namespace EVCB_OCPP.WSServer
                         //    x.FW_AssignedMachineVersionId != x.FW_VersionReport && x.Online == true)
                         //    .Select(x => new { x.Id, x.ChargeBoxId, x.FW_AssignedMachineVersionId }).ToList();
 
-                        var needUpdateChargers = db.Machine.Where(x => x.FW_AssignedMachineVersionId.HasValue == true &&
-                          x.FW_AssignedMachineVersionId != x.FW_VersionReport && x.Online == true)
+                        var needUpdateChargers = db.Machine.Where(x => x.FW_AssignedVersion.HasValue == true &&
+                          x.FW_AssignedVersion != x.FW_VersionReport && x.Online == true)
                           .Select(x => x.ChargeBoxId).AsNoTracking().ToList();
 
                         foreach (var chargeBoxId in needUpdateChargers)
@@ -1017,15 +1035,15 @@ namespace EVCB_OCPP.WSServer
                         _copyClientDic = new Dictionary<string, ClientData>(clientDic);
                     }
 
-                   var removeClients= _copyClientDic.Where(x => x.Value.LastActiveTime < DateTime.Now.AddSeconds(-120)).Select(x => x.Value).ToList();
+                    var removeClients = _copyClientDic.Where(x => x.Value.LastActiveTime < DateTime.Now.AddSeconds(-120)).Select(x => x.Value).ToList();
 
-                    foreach(var session in removeClients)
+                    foreach (var session in removeClients)
                     {
 
                         Console.WriteLine(string.Format("Server forced to shut down ChargeBox ({0}: LastActiveTime{1})", session.ChargeBoxId, session.LastActiveTime));
                         RemoveClient(session);
                     }
-                  
+
                     await Task.Delay(60000);
                 }
                 catch (Exception ex)
@@ -1135,7 +1153,7 @@ namespace EVCB_OCPP.WSServer
             {
 
                 logger.Trace("RemoveClient[" + session.ChargeBoxId + "]");
-                if(session.Connected)
+                if (session.Connected)
                 {
                     session.Close(CloseReason.ServerShutdown);
                 }

+ 2 - 2
EVCB_OCPP.WSServer/Service/BusinessServiceFactory.cs

@@ -12,9 +12,9 @@ namespace EVCB_OCPP.WSServer.Service
 
     public interface IBusinessService
     {
-        IdTagInfo Authorize(string chargeBoxId, string idTag);
+        Task<IdTagInfo> Authorize(string chargeBoxId, string idTag);
 
-        void NotifyFaultStatus(ErrorDetails details);
+        Task NotifyFaultStatus(ErrorDetails details);
 
     }
 

+ 5 - 2
EVCB_OCPP.WSServer/Service/HttpClientService.cs

@@ -39,7 +39,7 @@ namespace EVCB_OCPP.WSServer.Service
         private IHttpClientFactory _clientFactory = null;
         private IServiceCollection _services = new ServiceCollection();
         private int _handlerLifetime = 2;
-        private int _maxConnectionsPerServer = 20;
+        private int _maxConnectionsPerServer = 300;
         private int _timeout = 60;
 
 
@@ -55,10 +55,11 @@ namespace EVCB_OCPP.WSServer.Service
                 c.Timeout = TimeSpan.FromSeconds(_timeout);
                 c.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
             })
-          .AddTypedClient<HttpClient>().SetHandlerLifetime(TimeSpan.FromSeconds(_handlerLifetime)).ConfigurePrimaryHttpMessageHandler((h =>
+          .AddTypedClient<HttpClient>().SetHandlerLifetime(TimeSpan.FromMinutes(_handlerLifetime)).ConfigurePrimaryHttpMessageHandler((h =>
           {
               return new HttpClientHandler
               {
+                  
                   MaxConnectionsPerServer = _maxConnectionsPerServer
 
               };
@@ -72,6 +73,8 @@ namespace EVCB_OCPP.WSServer.Service
         {
             _clientFactory = _services.BuildServiceProvider()
                      .GetRequiredService<IHttpClientFactory>();
+
+        
         }
 
 

+ 83 - 56
EVCB_OCPP.WSServer/Service/LoadingBalanceService.cs

@@ -1,5 +1,6 @@
 using Dapper;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Data;
@@ -25,6 +26,9 @@ namespace EVCB_OCPP.WSServer.Service
         string mainConnectionString = ConfigurationManager.ConnectionStrings["MainDBContext"].ConnectionString;
         string webConnectionString = ConfigurationManager.ConnectionStrings["WebDBContext"].ConnectionString;
 
+        ConcurrentDictionary<int, object> _lockDic = new ConcurrentDictionary<int, object>();
+
+
         public LoadingBalanceService()
         {
 
@@ -49,23 +53,37 @@ namespace EVCB_OCPP.WSServer.Service
             var setting = GetLoadBalance(stationId);
             if (setting == null) return false;
 
-            if (setting.LBMode > 0 && setting.LBMode < 3 && !IsStillInTransactions(chargeBoxId))
+            lock (GetLock(stationId))
             {
-                // renew table
-                UpdateLoadbalanceRecord(stationId, machineId, 0, DateTime.UtcNow);
-                return true;
+                if (setting.LBMode > 0 && setting.LBMode < 3 && !IsStillInTransactions(chargeBoxId))
+                {
+                    // renew table
+                    UpdateLoadbalanceRecord(stationId, machineId, 0, DateTime.UtcNow);
+                    return true;
 
-            }
+                }
 
-            if (setting.LBMode >= 3 || setting.LBMode < 1)
-            {
-                CloseLoadbalanceRecord(stationId);
-               
-            }
+                if (setting.LBMode >= 3 || setting.LBMode < 1)
+                {
+                    CloseLoadbalanceRecord(stationId);
 
+                }
+            }
 
             return false;
 
+        }
+
+        private object GetLock(int stationId)
+        {
+
+            if (!_lockDic.ContainsKey(stationId))
+            {
+                _lockDic.TryAdd(stationId, new object());
+            }
+           
+            return _lockDic[stationId];
+
         }
         private void CloseLoadbalanceRecord(int stationId)
         {
@@ -164,47 +182,51 @@ namespace EVCB_OCPP.WSServer.Service
             var setting = GetLoadBalance(stationId);
             if (setting == null) return null;
 
-            if (setting != null && setting.LBMode == 2)
+            lock (GetLock(stationId))
             {
-                string machineId = string.Empty;
-                decimal ratedPower = GetRatedPower(machineId);
-                //找站內最早要充電的交易 下發充電Power & 填寫新給的Power
-                using (SqlConnection conn = new SqlConnection(mainConnectionString))
+                if (setting != null && setting.LBMode == 2)
                 {
-                    var parameters = new DynamicParameters();
-                    parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input);
-                    string strSql = "Select M.Id from [dbo].[LoadingBalance] LB,  [dbo].[Machine] M  where LB.StationId=@StationId and  LB.MachineId=M.Id and LB.Power < M.RatedPower and LB.FinishedOn='1991/01/01' order by LB.Id asc; ";
-                    machineId = conn.ExecuteScalar<string>(strSql, parameters);
-                }
+                    string machineId = string.Empty;
+                    decimal ratedPower = GetRatedPower(machineId);
+                    //找站內最早要充電的交易 下發充電Power & 填寫新給的Power
+                    using (SqlConnection conn = new SqlConnection(mainConnectionString))
+                    {
+                        var parameters = new DynamicParameters();
+                        parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input);
+                        string strSql = "Select M.Id from [dbo].[LoadingBalance] LB,  [dbo].[Machine] M  where LB.StationId=@StationId and  LB.MachineId=M.Id and LB.Power < M.RatedPower and LB.FinishedOn='1991/01/01' order by LB.Id asc; ";
+                        machineId = conn.ExecuteScalar<string>(strSql, parameters);
+                    }
 
-                if (!string.IsNullOrEmpty(machineId))
-                {
-                    decimal estimatedPwerValue = GetFCFSPower(stationId, machineId, setting.LBCurrent);
+                    if (!string.IsNullOrEmpty(machineId))
+                    {
+                        decimal estimatedPwerValue = GetFCFSPower(stationId, machineId, setting.LBCurrent);
 
-                    // renew table
-                    UpdateLoadbalanceRecord(stationId, machineId, estimatedPwerValue, null, true);
-                   // UpdateLoadbalanceRecord(stationId, machineId, estimatedPwerValue, null);
+                        // renew table
+                        UpdateLoadbalanceRecord(stationId, machineId, estimatedPwerValue, null, true);
+                        // UpdateLoadbalanceRecord(stationId, machineId, estimatedPwerValue, null);
 
-                    dic.Add(machineId, estimatedPwerValue);
-                }
+                        dic.Add(machineId, estimatedPwerValue);
+                    }
 
 
-            }
+                }
 
-            if (setting != null && setting.LBMode == 1)
-            {
-                dic = GetAveragePower(stationId, setting.LBCurrent);
-                foreach (var kv in dic)
+                if (setting != null && setting.LBMode == 1)
                 {
-                    if (kv.Value.HasValue)
+                    dic = GetAveragePower(stationId, setting.LBCurrent);
+                    foreach (var kv in dic)
                     {
-                        UpdateLoadbalanceRecord(stationId, kv.Key, 0, DateTime.UtcNow);
-                        UpdateLoadbalanceRecord(stationId, kv.Key, kv.Value.Value, null);
-                    }
+                        if (kv.Value.HasValue)
+                        {
+                            UpdateLoadbalanceRecord(stationId, kv.Key, 0, DateTime.UtcNow);
+                            UpdateLoadbalanceRecord(stationId, kv.Key, kv.Value.Value, null);
+                        }
 
+                    }
                 }
             }
 
+
             return dic;
 
         }
@@ -215,35 +237,40 @@ namespace EVCB_OCPP.WSServer.Service
             var setting = GetLoadBalance(stationId);
             if (setting == null) return null;
 
-            if (setting != null)
+            lock (GetLock(stationId))
             {
-                if (setting.LBMode == 1)
+
+                if (setting != null)
                 {
-                    dic = GetAveragePower(stationId, setting.LBCurrent, machineId);
-                    foreach (var kv in dic)
+                    if (setting.LBMode == 1)
                     {
-                        if (kv.Value.HasValue)
+                        dic = GetAveragePower(stationId, setting.LBCurrent, machineId);
+                        foreach (var kv in dic)
                         {
-                            UpdateLoadbalanceRecord(stationId, kv.Key, 0, DateTime.UtcNow);
-                            UpdateLoadbalanceRecord(stationId, kv.Key, kv.Value.Value, null);
-                        }
+                            if (kv.Value.HasValue)
+                            {
+                                UpdateLoadbalanceRecord(stationId, kv.Key, 0, DateTime.UtcNow);
+                                UpdateLoadbalanceRecord(stationId, kv.Key, kv.Value.Value, null);
+                            }
 
+                        }
                     }
-                }
-                else if (setting.LBMode == 2)
-                {
-                    dic.Add(machineId, GetFCFSPower(stationId, machineId, setting.LBCurrent));
+                    else if (setting.LBMode == 2)
+                    {
+                        dic.Add(machineId, GetFCFSPower(stationId, machineId, setting.LBCurrent));
 
-                    UpdateLoadbalanceRecord(stationId, machineId, 0, DateTime.UtcNow);
-                    UpdateLoadbalanceRecord(stationId, machineId, dic[machineId].Value, null);
+                        UpdateLoadbalanceRecord(stationId, machineId, 0, DateTime.UtcNow);
+                        UpdateLoadbalanceRecord(stationId, machineId, dic[machineId].Value, null);
 
-                }
-                else
-                {
-                    // 把LB TABLE 關閉
-                    CloseLoadbalanceRecord(stationId);
+                    }
+                    else
+                    {
+                        // 把LB TABLE 關閉
+                        CloseLoadbalanceRecord(stationId);
 
+                    }
                 }
+
             }
 
             return dic;

+ 7 - 6
EVCB_OCPP.WSServer/Service/LocalBusinessService.cs

@@ -9,8 +9,8 @@ using EVCB_OCPP.WSServer.Dto;
 namespace EVCB_OCPP.WSServer.Service
 {
     public class LocalBusinessService : IBusinessService
-    {       
-      
+    {
+
         string customerId = string.Empty;
 
         public LocalBusinessService(string customerId)
@@ -18,16 +18,17 @@ namespace EVCB_OCPP.WSServer.Service
             this.customerId = customerId;
         }
 
-        public IdTagInfo Authorize(string chargeBoxId, string idTag)
+        async public Task<IdTagInfo> Authorize(string chargeBoxId, string idTag)
         {
+            await Task.Delay(10);
             return new IdTagInfo() { status = AuthorizationStatus.Accepted };
 
         }
 
-     
-        public void NotifyFaultStatus(ErrorDetails details)
+
+        async public Task NotifyFaultStatus(ErrorDetails details)
         {
-            
+            await Task.Delay(10);
         }
     }
 }

+ 14 - 7
EVCB_OCPP.WSServer/Service/OuterBusinessService.cs

@@ -56,18 +56,19 @@ namespace EVCB_OCPP.WSServer.Service
             signMaterial = GetSign(customerId);
         }
 
-        public IdTagInfo Authorize(string chargeBoxId, string idTag)
+      
+        async public Task<IdTagInfo> Authorize(string chargeBoxId, string idTag)
         {
             IdTagInfo result = new IdTagInfo() { status = AuthorizationStatus.Invalid };
             try
             {
                 string requestParams = string.Format("charging_auth?chargeBoxId={0}&IdTag={1}", chargeBoxId, idTag);
 
-                var response = httpClient.Post(signMaterial.APIUrl + requestParams, new Dictionary<string, string>()
+                var response = await httpClient.Post(signMaterial.APIUrl + requestParams, new Dictionary<string, string>()
                             {
                                 { "PartnerId",signMaterial.Id}
 
-                            }, null, signMaterial.SaltKey).GetAwaiter().GetResult();
+                            }, null, signMaterial.SaltKey);
 
                 if (response.Success)
                 {
@@ -80,6 +81,12 @@ namespace EVCB_OCPP.WSServer.Service
                         result.expiryDate = dt;
                     }
 
+                    if (jo.ContainsKey("ParentIdTag"))
+                    {
+                        string _Message = jo["ParentIdTag"].Value<string>();
+                        result.parentIdTag = _Message;
+                    }
+
 
                     if (jo.ContainsKey("Status"))
                     {
@@ -100,18 +107,18 @@ namespace EVCB_OCPP.WSServer.Service
 
         }
 
-        public void NotifyFaultStatus(ErrorDetails details)
+        async public Task NotifyFaultStatus(ErrorDetails details)
         {
 
             try
             {
-                if(signMaterial.CallsThirdParty)
+                if (signMaterial.CallsThirdParty)
                 {
-                    var response = httpClient.Post(signMaterial.APIUrl + "connectorfault", new Dictionary<string, string>()
+                    var response = await httpClient.Post(signMaterial.APIUrl + "connectorfault", new Dictionary<string, string>()
                             {
                                 { "PartnerId",signMaterial.Id}
 
-                            }, JsonConvert.SerializeObject(details, GlobalConfig.JSONSERIALIZER_FORMAT), signMaterial.SaltKey).GetAwaiter().GetResult();
+                            }, JsonConvert.SerializeObject(details, GlobalConfig.JSONSERIALIZER_FORMAT), signMaterial.SaltKey);
 
 
                 }

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

@@ -65,7 +65,7 @@ namespace OCPPServer.Protocol
        
             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));
+            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())
             {

+ 11 - 11
EVCB_OCPP.WSServer/packages.config

@@ -4,16 +4,16 @@
   <package id="EntityFramework" version="6.2.0" targetFramework="net471" />
   <package id="log4net" version="2.0.3" targetFramework="net471" />
   <package id="Microsoft.Bcl.AsyncInterfaces" version="1.1.0" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Configuration" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Configuration.Abstractions" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Configuration.Binder" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.DependencyInjection" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Http" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Logging" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Logging.Abstractions" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Options" version="3.1.2" targetFramework="net471" />
-  <package id="Microsoft.Extensions.Primitives" version="3.1.2" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Configuration" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Configuration.Abstractions" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Configuration.Binder" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.DependencyInjection" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Http" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Logging" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Logging.Abstractions" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Options" version="3.1.3" targetFramework="net471" />
+  <package id="Microsoft.Extensions.Primitives" version="3.1.3" targetFramework="net471" />
   <package id="Newtonsoft.Json" version="12.0.1" targetFramework="net471" />
   <package id="NLog" version="4.6.6" targetFramework="net471" />
   <package id="NLog.Config" version="4.6.6" targetFramework="net471" />
@@ -22,6 +22,6 @@
   <package id="System.ComponentModel.Annotations" version="4.7.0" targetFramework="net471" />
   <package id="System.Memory" version="4.5.2" targetFramework="net471" />
   <package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net471" />
-  <package id="System.Runtime.CompilerServices.Unsafe" version="4.7.0" targetFramework="net471" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="4.7.1" targetFramework="net471" />
   <package id="System.Threading.Tasks.Extensions" version="4.5.2" targetFramework="net471" />
 </packages>

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


+ 18 - 17
TestTool.RemoteTriggerAPP/MainWindow.xaml

@@ -5,8 +5,8 @@
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:TestTool.RemoteTriggerAPP"      
         mc:Ignorable="d"
-        Title="下發測試用工具(公司內網) V1.1.10(20200423)" Height="450" Width="670">
-    <Grid Margin="0,2,0,-2">
+        Title="下發測試用工具(公司內網) V1.1.11(20200525)" Height="400" Width="639">
+    <Grid Margin="0,2,2,0">
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="109*"/>
             <ColumnDefinition Width="222*"/>
@@ -34,7 +34,7 @@
             <ComboBoxItem>GetDiagnostics_HTTP</ComboBoxItem>
             <ComboBoxItem>ReserveNow</ComboBoxItem>
             <ComboBoxItem>CancelReservation</ComboBoxItem>
-            <ComboBoxItem>SetChargingProfile</ComboBoxItem>       
+            <ComboBoxItem>SetChargingProfile</ComboBoxItem>
             <ComboBoxItem>ClearChargingProfile</ComboBoxItem>
             <ComboBoxItem>GetCompositeSchedule</ComboBoxItem>
             <ComboBoxItem>TriggerMessage_BootNotification</ComboBoxItem>
@@ -46,8 +46,8 @@
         </ComboBox>
         <Label  Content="Remote Trigger Cmd:" HorizontalAlignment="Left" Height="27" Margin="69,165,0,0" VerticalAlignment="Top" Width="137"/>
         <Button Name="uxSubmitBtn" Content="Submit" HorizontalAlignment="Left" Margin="260,165,0,0" VerticalAlignment="Top" Width="51" Height="34" Click="UxSubmitBtn_Click" Grid.Column="1"/>
-        <TextBox Name="uxMsgTb" HorizontalAlignment="Left" Height="80" Margin="58,329,0,0" VerticalAlignment="Top" Width="471" Grid.ColumnSpan="2"/>
-        <Label Content="Msg:" HorizontalAlignment="Left" Height="27" Margin="58,298,0,0" VerticalAlignment="Top" Width="43" RenderTransformOrigin="0.744,3.407"/>
+        <TextBox Name="uxMsgTb" HorizontalAlignment="Left" Height="80" Margin="71,249,0,0" VerticalAlignment="Top" Width="471" Grid.ColumnSpan="2"/>
+        <Label Content="Msg:" HorizontalAlignment="Left" Height="27" Margin="69,215,0,0" VerticalAlignment="Top" Width="43" RenderTransformOrigin="0.744,3.407"/>
         <Label Content="Id Tag:" HorizontalAlignment="Left" Height="27" Margin="71,74,0,0" VerticalAlignment="Top" Width="47"/>
         <TextBox x:Name="uxIdTagTb" Text="TestTool" HorizontalAlignment="Left" Height="27" Margin="128,74,0,0" VerticalAlignment="Top" Width="63" RenderTransformOrigin="3.714,1"/>
         <Label Content="TransactionId:" HorizontalAlignment="Left" Height="27" Margin="162,74,0,0" VerticalAlignment="Top" Width="100" Grid.Column="1"/>
@@ -58,19 +58,20 @@
         <TextBox x:Name="uxConfigKeyTb" Text="ConnectionTimeOut" HorizontalAlignment="Left" Height="27" Margin="196,119,0,0" VerticalAlignment="Top" Width="138" RenderTransformOrigin="3.714,1" Grid.ColumnSpan="2"/>
         <Label Content=" Value:" HorizontalAlignment="Left" Height="27" Margin="121,119,0,0" VerticalAlignment="Top" Width="54" Grid.Column="1"/>
         <TextBox x:Name="uxConfigValueTb" Text="30" HorizontalAlignment="Left" Height="27" Margin="180,117,0,0" VerticalAlignment="Top" Width="52" RenderTransformOrigin="3.714,1" Grid.Column="1"/>
-        <Label  Content="Upload Firmware:" HorizontalAlignment="Left" Height="27" Margin="69,217,0,0" VerticalAlignment="Top" Width="113"/>
 
-        <TextBox x:Name="uxUploadFileTb" Text="" HorizontalAlignment="Left" Height="27" Margin="182,217,0,0" VerticalAlignment="Top" Width="210" RenderTransformOrigin="3.714,1" Grid.ColumnSpan="2"/>
-        <Button x:Name="uxFileSubmitBtn" Content="..." HorizontalAlignment="Left" Margin="187,215,0,0" VerticalAlignment="Top" Width="46" Height="29" Click="uxFileSubmitBtn_Click" Grid.Column="1"/>
-        <Button x:Name="uxUploadBtn" Content="Upload" HorizontalAlignment="Left" Margin="259,212,0,0" VerticalAlignment="Top" Width="52" Height="34" Click="uxUploadBtn_Click" Grid.Column="1"/>
-        <Label  Content="Publish Version:" HorizontalAlignment="Left" Height="27" Margin="69,266,0,0" VerticalAlignment="Top" Width="113"/>
-        <ComboBox x:Name="uxPublishCb" HorizontalAlignment="Left" Margin="179,266,0,0" VerticalAlignment="Top" Width="213" Height="34" SelectionChanged="uxPublishCb_SelectionChanged" Grid.ColumnSpan="2"/>
-        <Button x:Name="uxRefreshBtn" Content="Refresh" HorizontalAlignment="Left" Margin="192,266,0,0" VerticalAlignment="Top" Width="53" Height="34" Click="uxRefreshBtn_Click" Grid.Column="1"/>
-        <Button x:Name="uxPublishBtn" Content="Publish" HorizontalAlignment="Left" Margin="258,266,0,0" VerticalAlignment="Top" Width="53" Height="34" Click="uxPublishBtn_Click" Grid.Column="1"/>
-        <Label Content="ReservationId:" HorizontalAlignment="Left" Height="27" Margin="262,23,0,0" VerticalAlignment="Top" Width="100" Grid.Column="1"/>
-        <TextBox x:Name="uxReservationTb" Text="0" HorizontalAlignment="Left" Height="27" Margin="367,23,0,0" VerticalAlignment="Top" Width="44" RenderTransformOrigin="3.714,1" Grid.Column="1"/>
-        <Button x:Name="uxClearPublishBtn" Content="Clear Publish" HorizontalAlignment="Left" Margin="325,266,0,0" VerticalAlignment="Top" Width="86" Height="34" Click="uxClearPublishBtn_Click" Grid.Column="1"/>
-        <Button x:Name="uxFTPUploadBtn" Content="Upload(FTP)" HorizontalAlignment="Left" Margin="325,212,0,0" VerticalAlignment="Top" Width="86" Height="34" Click="uxFTPUploadBtn_Click" RenderTransformOrigin="2.058,0.529" Grid.Column="1"/>
+        <Label Visibility="Hidden"   Content="Upload Firmware:" HorizontalAlignment="Left" Height="27" Margin="69,217,0,0" VerticalAlignment="Top" Width="113"/>
+        <TextBox Visibility="Hidden" x:Name="uxUploadFileTb" Text="" HorizontalAlignment="Left" Height="27" Margin="182,217,0,0" VerticalAlignment="Top" Width="210" RenderTransformOrigin="3.714,1" Grid.ColumnSpan="2"/>
+        <Button Visibility="Hidden"  x:Name="uxFileSubmitBtn" Content="..." HorizontalAlignment="Left" Margin="187,215,0,0" VerticalAlignment="Top" Width="46" Height="29" Click="uxFileSubmitBtn_Click" Grid.Column="1"/>
+        <Button Visibility="Hidden"  x:Name="uxUploadBtn" Content="Upload" HorizontalAlignment="Left" Margin="259,212,0,0" VerticalAlignment="Top" Width="52" Height="34" Click="uxUploadBtn_Click" Grid.Column="1"/>
+        <Label Visibility="Hidden"   Content="Publish Version:" HorizontalAlignment="Left" Height="27" Margin="69,266,0,0" VerticalAlignment="Top" Width="113"/>
+        <ComboBox Visibility="Hidden"  x:Name="uxPublishCb" HorizontalAlignment="Left" Margin="179,266,0,0" VerticalAlignment="Top" Width="213" Height="34" SelectionChanged="uxPublishCb_SelectionChanged" Grid.ColumnSpan="2"/>
+        <Button Visibility="Hidden"  x:Name="uxRefreshBtn" Content="Refresh" HorizontalAlignment="Left" Margin="192,266,0,0" VerticalAlignment="Top" Width="53" Height="34" Click="uxRefreshBtn_Click" Grid.Column="1"/>
+        <Button Visibility="Hidden"  x:Name="uxPublishBtn" Content="Publish" HorizontalAlignment="Left" Margin="258,266,0,0" VerticalAlignment="Top" Width="53" Height="34" Click="uxPublishBtn_Click" Grid.Column="1"/>
+        <Label Visibility="Hidden"  Content="ReservationId:" HorizontalAlignment="Left" Height="27" Margin="262,23,0,0" VerticalAlignment="Top" Width="100" Grid.Column="1"/>
+        <TextBox Visibility="Hidden"  x:Name="uxReservationTb" Text="0" HorizontalAlignment="Left" Height="27" Margin="367,23,0,0" VerticalAlignment="Top" Width="44" RenderTransformOrigin="3.714,1" Grid.Column="1"/>
+        <Button  Visibility="Hidden" x:Name="uxClearPublishBtn" Content="Clear Publish" HorizontalAlignment="Left" Margin="325,266,0,0" VerticalAlignment="Top" Width="86" Height="34" Click="uxClearPublishBtn_Click" Grid.Column="1"/>
+        <Button Visibility="Hidden"  x:Name="uxFTPUploadBtn" Content="Upload(FTP)" HorizontalAlignment="Left" Margin="325,212,0,0" VerticalAlignment="Top" Width="86" Height="34" Click="uxFTPUploadBtn_Click" RenderTransformOrigin="2.058,0.529" Grid.Column="1"/>
+
         <Label Content=" Expiry Time:" HorizontalAlignment="Left" Height="27" Margin="237,119,0,0" VerticalAlignment="Top" Width="80" Grid.Column="1"/>
 
         <TextBox x:Name="uxExpiryTimeTb"  Margin="325,117,10,273" Text="2020/02/06 12:00" Grid.Column="1"></TextBox>

+ 39 - 74
TestTool.RemoteTriggerAPP/MainWindow.xaml.cs

@@ -42,7 +42,7 @@ namespace TestTool.RemoteTriggerAPP
     public partial class MainWindow : Window
     {
         string action = "";
-        List<PublishVersion> publishes = new List<PublishVersion>();
+        List<UploadFile> publishes = new List<UploadFile>();
         FTPClient UploadClient = new FTPClient(@"ftp://test.evsocket.phihong.com.cn", "testocpp", "testocpp");
         string chargingProfilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "chargingProfile.json");
         int selectedPublish = -1;
@@ -443,7 +443,7 @@ namespace TestTool.RemoteTriggerAPP
                 var uuid = Guid.NewGuid().ToString();
                 var request = new SendLocalListRequest()
                 {
-                    listVersion = Convert.ToInt32(DateTime.Now.ToUniversalTime().ToString("yyMMddHHmm")),
+                    listVersion = Convert.ToInt32(DateTime.Now.AddYears(-100).Ticks%100000000),
                     updateType = isFull ? UpdateType.Full : UpdateType.Differential,
                     localAuthorizationList = new List<AuthorizationData>()
                     //localAuthorizationList = new List<AuthorizationData>()
@@ -462,29 +462,29 @@ namespace TestTool.RemoteTriggerAPP
 
                 };
 
-                request.localAuthorizationList.Add(new AuthorizationData()
-                {
-                    idTag = "F5902677",
-                    idTagInfo = new IdTagInfo()
-                    {
-                        parentIdTag = "0000000000000000001",
-                        expiryDate = DateTime.UtcNow.AddMonths(1),
-                        status = AuthorizationStatus.ConcurrentTx
-                    }
-                });
-
-                request.localAuthorizationList.Add(new AuthorizationData()
-                {
-                    idTag = "772690F5",
-                    idTagInfo = new IdTagInfo()
-                    {
-                        parentIdTag = "0000000000000000001",
-                        expiryDate = DateTime.UtcNow.AddMonths(1),
-                        status = AuthorizationStatus.Accepted
-                    }
-                });
-
-                for (int i = 0; i < 23; i++)
+                //request.localAuthorizationList.Add(new AuthorizationData()
+                //{
+                //    idTag = "F5902677",
+                //    idTagInfo = new IdTagInfo()
+                //    {
+                //        parentIdTag = "0000000000000000001",
+                //        expiryDate = DateTime.UtcNow.AddMonths(1),
+                //        status = AuthorizationStatus.ConcurrentTx
+                //    }
+                //});
+
+                //request.localAuthorizationList.Add(new AuthorizationData()
+                //{
+                //    idTag = "772690F5",
+                //    idTagInfo = new IdTagInfo()
+                //    {
+                //        parentIdTag = "0000000000000000001",
+                //        expiryDate = DateTime.UtcNow.AddMonths(1),
+                //        status = AuthorizationStatus.Accepted
+                //    }
+                //});
+
+                for (int i = 0; i < 50; i++)
                 {
                     request.localAuthorizationList.Add(new AuthorizationData()
                     {
@@ -860,15 +860,7 @@ namespace TestTool.RemoteTriggerAPP
             {
                 db.UploadFile.Add(ufObj);
                 db.SaveChanges();
-                var pvQry = db.PublishVersion.Where(x => x.CustomerMachineComponentId == 1).OrderByDescending(c => c.Version).FirstOrDefault();
-                PublishVersion pv = new PublishVersion { CustomerMachineComponentId = 1, CreatedOn = DateTime.Now.ToUniversalTime(), Version = 1 };
-                if (pvQry != null)
-                {
-                    pv.Version = pvQry.Version + 1;
-                }
-                pv.PublishVersionFiles.Add(new PublishVersionFile() { UploadFileId = ufObj.Id });
-                db.PublishVersion.Add(pv);
-                db.SaveChanges();
+              
             }
 
             string filePath = uxUploadFileTb.Text;
@@ -965,15 +957,7 @@ namespace TestTool.RemoteTriggerAPP
             {
                 db.UploadFile.Add(ufObj);
                 db.SaveChanges();
-                var pvQry = db.PublishVersion.Where(x => x.CustomerMachineComponentId == 1).OrderByDescending(c => c.Version).FirstOrDefault();
-                PublishVersion pv = new PublishVersion { CustomerMachineComponentId = 1, CreatedOn = DateTime.Now.ToUniversalTime(), Version = 1 };
-                if (pvQry != null)
-                {
-                    pv.Version = pvQry.Version + 1;
-                }
-                pv.PublishVersionFiles.Add(new PublishVersionFile() { UploadFileId = ufObj.Id });
-                db.PublishVersion.Add(pv);
-                db.SaveChanges();
+              
             }
 
 
@@ -994,32 +978,20 @@ namespace TestTool.RemoteTriggerAPP
         {
             using (var db = new MainDBContext())
             {
-                publishes = db.PublishVersion
-                   .Include(c => c.PublishVersionFiles)
-                   .Include(c => c.PublishVersionFiles.Select(z => z.UploadFile))
-                   .Include(c => c.CustomerMachineComponent)
-                   .Include(c => c.CustomerMachineComponent.MachineComponent)
-                   .Include(c => c.CustomerMachineComponent.MachineComponent.MachineModel)
-                   .Include(c => c.CustomerMachineComponent.MachineComponent.MachinePart)
-                   .Where(c => c.CustomerMachineComponent.CustomerId == new Guid("8456AED9-6DD9-4BF3-A94C-9F5DCB9506F7") && c.CustomerMachineComponent.Id == 1 && c.CustomerMachineComponent.Id == 1).OrderByDescending(c => c.Id).Take(20).ToList();
+                publishes = db.UploadFile.Where(c => c.CustomerId == new Guid("8456AED9-6DD9-4BF3-A94C-9F5DCB9506F7") ).OrderByDescending(c => c.Id).Take(20).ToList();
 
                 StringBuilder sb = new StringBuilder();
                 uxPublishCb.Items.Clear();
                 foreach (var i in publishes)
                 {
-                    string prefix = i.PublishVersionFiles.FirstOrDefault().UploadFile.FileUrl.StartsWith("ftp") ? "FTP" : "HTTP";
+                    string prefix = i.FileUrl.StartsWith("ftp") ? "FTP" : "HTTP";
                     sb.Clear();
-                    sb.Append(string.Format("[{0}]", prefix));
-                    sb.Append("_版本號:");
-                    sb.Append(i.Version);
+                    sb.Append(string.Format("[{0}]", prefix));                  
                     sb.Append("_上傳日期:");
-                    sb.Append(i.PublishVersionFiles.First().UploadFile.CreatedOn.ToString());
+                    sb.Append(i.CreatedOn.ToString());
                     sb.Append("_檔名:");
-                    foreach (var f in i.PublishVersionFiles)
-                    {
-                        sb.Append(f.UploadFile.OriginName);
-                        sb.Append("、");
-                    }
+                    sb.Append(i.OriginName);
+                   
                     uxPublishCb.Items.Add(sb.ToString());
                     uxPublishCb.SelectedIndex = 0;
                 }
@@ -1038,24 +1010,18 @@ namespace TestTool.RemoteTriggerAPP
             {
 
                 var machine = db.Machine.Where(x => x.ChargeBoxId == uxChargeBoxIdTb.Text).FirstOrDefault();
-                MachineVersion obj = new MachineVersion()
+                MachineVersionFile obj = new MachineVersionFile()
                 {
-                    MachineId = machine.Id,
-                    PublishVersionId = publishes[selectedPublish].Id,
+                    MachineId = new Guid(machine.Id),
+                    UploadFileId = publishes[selectedPublish].Id,
                     CreatedOn = DateTime.Now.ToUniversalTime()
                 };
 
-                obj.MachineVersionFiles.Add(new MachineVersionFile()
-                {
-                    UploadFileId = publishes[selectedPublish].PublishVersionFiles.First().UploadFileId,
-                    CreatedOn = DateTime.Now.ToUniversalTime()
-                });
-                db.MachineVersion.Add(obj);
+                obj= db.MachineVersionFile.Add(obj);
 
                 //將machine的軟體更新更新到這個值
 
-                machine.FW_AssignedVersion = publishes[selectedPublish].Version;
-                machine.FW_MachineVersion = obj;
+                machine.FW_AssignedVersion = obj.Id;            
 
                 db.SaveChanges();
             }
@@ -1076,8 +1042,7 @@ namespace TestTool.RemoteTriggerAPP
             {
 
                 var machine = db.Machine.Where(x => x.ChargeBoxId == uxChargeBoxIdTb.Text).FirstOrDefault();
-                machine.FW_AssignedVersion = null;
-                machine.FW_AssignedMachineVersionId = null;
+                machine.FW_AssignedVersion = null;              
                 db.SaveChanges();
             }