FirmwareManagementProfileHandler.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using EVCB_OCPP.Domain;
  2. using EVCB_OCPP.Domain.Models.Database;
  3. using EVCB_OCPP.Packet.Features;
  4. using EVCB_OCPP.Packet.Messages;
  5. using EVCB_OCPP.Packet.Messages.FirmwareManagement;
  6. using Newtonsoft.Json;
  7. using OCPPServer.Protocol;
  8. using System;
  9. using System.Data.Entity;
  10. using System.Linq;
  11. namespace EVCB_OCPP.WSServer.Message
  12. {
  13. internal partial class ProfileHandler
  14. {
  15. internal async MessageResult ExecuteFirmwareManagementRequest(Actions action, ClientData session, IRequest request)
  16. {
  17. MessageResult result = new MessageResult() { Success = false };
  18. try
  19. {
  20. switch (action)
  21. {
  22. case Actions.FirmwareStatusNotification:
  23. {
  24. FirmwareStatusNotificationRequest _request = request as FirmwareStatusNotificationRequest;
  25. if (_request.status == Packet.Messages.SubTypes.FirmwareStatus.Idle)
  26. {
  27. string requestId = Guid.NewGuid().ToString();
  28. using (var db = new MainDBContext())
  29. {
  30. var machine = db.Machine.Where(x => x.FW_AssignedVersion.HasValue == true && x.FW_AssignedVersion.HasValue
  31. && x.FW_AssignedVersion != x.FW_VersionReport && x.ChargeBoxId == session.ChargeBoxId)
  32. .Select(x => new { x.Id, x.FW_AssignedVersion }).AsNoTracking().FirstOrDefault();
  33. if (machine != null)
  34. {
  35. var mv = db.MachineVersionFile.Include(c => c.UploadFile)
  36. .Where(c => c.Id == machine.FW_AssignedVersion.Value).First();
  37. string downloadUrl = mv.UploadFile.FileUrl;
  38. var _updateFWrequest = new UpdateFirmwareRequest()
  39. {
  40. location = new Uri(downloadUrl),
  41. retries = 3,
  42. retrieveDate = DateTime.UtcNow,
  43. retryInterval = 10
  44. };
  45. db.MachineOperateRecord.Add(new MachineOperateRecord()
  46. {
  47. CreatedOn = DateTime.UtcNow,
  48. ChargeBoxId = session.ChargeBoxId,
  49. SerialNo = requestId,
  50. RequestContent = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  51. EVSE_Status = 0,
  52. EVSE_Value = "Fw Version:" + machine.FW_AssignedVersion,
  53. Status = 0,
  54. RequestType = 0,
  55. Action = _updateFWrequest.Action.ToString()
  56. });
  57. db.ServerMessage.Add(new ServerMessage()
  58. {
  59. ChargeBoxId = session.ChargeBoxId,
  60. CreatedBy = "Server",
  61. CreatedOn = DateTime.UtcNow,
  62. OutAction = _updateFWrequest.Action.ToString(),
  63. OutRequest = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  64. SerialNo = requestId,
  65. InMessage = string.Empty
  66. });
  67. db.SaveChanges();
  68. var clearMachine = db.Machine.Where(x => x.Id == machine.Id).FirstOrDefault();
  69. clearMachine.FW_AssignedVersion = null;
  70. db.SaveChanges();
  71. }
  72. }
  73. }
  74. else
  75. {
  76. using (var db = new MainDBContext())
  77. {
  78. var item = db.MachineOperateRecord.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.RequestType == 0)
  79. .OrderByDescending(x => x.CreatedOn).FirstOrDefault();
  80. if (item != null)
  81. {
  82. item.EVSE_Status = (int)_request.status;
  83. item.FinishedOn = DateTime.UtcNow;
  84. //if (!string.IsNullOrEmpty(item.EVSE_Value) && _request.status == Packet.Messages.SubTypes.FirmwareStatus.Installed)
  85. //{
  86. // int version = 0;
  87. // int.TryParse(item.EVSE_Value.Split(':').Last(), out version);
  88. // var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
  89. // machine.FW_VersionReport = version;
  90. //}
  91. }
  92. db.SaveChanges();
  93. }
  94. }
  95. var confirm = new FirmwareStatusNotificationConfirmation() { };
  96. result.Message = confirm;
  97. result.Success = true;
  98. }
  99. break;
  100. case Actions.DiagnosticsStatusNotification:
  101. {
  102. DiagnosticsStatusNotificationRequest _request = request as DiagnosticsStatusNotificationRequest;
  103. using (var db = new MainDBContext())
  104. {
  105. db.MachineOperateRecord.Add(new MachineOperateRecord()
  106. {
  107. CreatedOn = DateTime.UtcNow,
  108. ChargeBoxId = session.ChargeBoxId,
  109. SerialNo = requestId,
  110. RequestContent = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  111. EVSE_Status = 0,
  112. EVSE_Value = "Fw Version:" + machine.FW_AssignedVersion,
  113. Status = 0,
  114. RequestType = 0,
  115. Action = _updateFWrequest.Action.ToString()
  116. });
  117. await db.SaveChangesAsync();
  118. }
  119. var confirm = new DiagnosticsStatusNotificationConfirmation() { };
  120. result.Message = confirm;
  121. result.Success = true;
  122. }
  123. break;
  124. default:
  125. {
  126. Console.WriteLine(string.Format("Not Implement {0} Logic", request.GetType().ToString().Replace("OCPPPackage.Messages.FirmwareManagement.", "")));
  127. }
  128. break;
  129. }
  130. }
  131. catch (Exception ex)
  132. {
  133. logger.Fatal(string.Format("chargeBoxId:{0} {1}", session.ChargeBoxId, action));
  134. logger.Fatal(string.Format("Data {0}", request.ToString()));
  135. logger.Fatal(string.Format("Error {0}", ex.ToString()));
  136. result.Exception = ex;
  137. }
  138. return result;
  139. }
  140. internal MessageResult ExecuteFirmwareManagementConfirm(Actions action, ClientData session, IConfirmation confirm, string requestId)
  141. {
  142. MessageResult result = new MessageResult() { Success = true };
  143. switch (action)
  144. {
  145. case Actions.UpdateFirmware:
  146. case Actions.GetDiagnostics:
  147. {
  148. string evse_rep = string.Empty;
  149. if (confirm is GetDiagnosticsConfirmation)
  150. {
  151. var confirmation = confirm as GetDiagnosticsConfirmation;
  152. evse_rep = confirmation.fileName;
  153. }
  154. using (var db = new MainDBContext())
  155. {
  156. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  157. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  158. if (operation != null)
  159. {
  160. operation.FinishedOn = DateTime.UtcNow;
  161. operation.Status = 1;//電樁有回覆
  162. operation.EVSE_Status = (int)1;//OK
  163. operation.EVSE_Value = string.IsNullOrEmpty(evse_rep) ? operation.EVSE_Value : evse_rep;
  164. db.SaveChanges();
  165. }
  166. }
  167. }
  168. break;
  169. default:
  170. {
  171. Console.WriteLine(string.Format("Not Implement {0} Logic", confirm.GetType().ToString().Replace("OCPPPackage.Messages.FirmwareManagement.", "")));
  172. }
  173. break;
  174. }
  175. return result;
  176. }
  177. internal MessageResult ReceivedFirmwareManagementError(Actions action, string errorMsg, ClientData session, string requestId)
  178. {
  179. MessageResult result = new MessageResult() { Success = true };
  180. switch (action)
  181. {
  182. case Actions.FirmwareStatusNotification:
  183. case Actions.UpdateFirmware:
  184. case Actions.GetDiagnostics:
  185. case Actions.DiagnosticsStatusNotification:
  186. {
  187. using (var db = new MainDBContext())
  188. {
  189. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  190. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  191. if (operation != null)
  192. {
  193. operation.FinishedOn = DateTime.UtcNow;
  194. operation.Status = 1;//電樁有回覆
  195. operation.EVSE_Status = (int)255;//錯誤
  196. operation.EVSE_Value = errorMsg;
  197. db.SaveChanges();
  198. }
  199. }
  200. }
  201. break;
  202. default:
  203. {
  204. Console.WriteLine(string.Format("Not Implement {0} Logic", action));
  205. }
  206. break;
  207. }
  208. return result;
  209. }
  210. }
  211. }