MakeRequestHandler.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. using Evcb.Domain.Model;
  2. using Newtonsoft.Json;
  3. using OCPP_Packet.Packet.DataTransfer;
  4. using OCPPPacket.Packet.DataTransfer;
  5. using OCPPPacket.Packet.Messages;
  6. using OCPPPacket.Packet.Messages.Core;
  7. using OCPPPacket.Packet.Messages.FirmwareManagement;
  8. using OCPPPacket.Packet.Messages.LocalAuthListManagement;
  9. using OCPPPacket.Packet.Messages.RemoteTrigger;
  10. using OCPPPacket.Packet.Messages.Reservation;
  11. using OCPPPacket.Packet.Messages.SmartCharging;
  12. using OCPPPacket.Packet.Status;
  13. using OCPPServer.Common;
  14. using Packet.Cmd;
  15. using System;
  16. using System.Collections.Generic;
  17. namespace OCPPServer.Handler
  18. {
  19. public class MakeRequestHandler
  20. {
  21. #region Core
  22. /// <summary>
  23. /// 取得電樁 configuration settings
  24. /// </summary>
  25. static public IRequest MakeGetConfigurationRequest()
  26. {
  27. GetConfigurationRequest req = new GetConfigurationRequest();
  28. req.key = new List<string>();
  29. //req.key.Add("AllowOfflineTxForUnknownIdAvailable");
  30. //req.key.Add("AllowOfflineTxForUnknownIdEnabled");
  31. //req.key.Add("AuthorizationCacheAvailable");
  32. //req.key.Add("AuthorizationCacheEnabled");
  33. //req.key.Add("BlinkRepeat");
  34. //req.key.Add("ClockAlignedDataInterval");
  35. //req.key.Add("ConnectionTimeOut");
  36. //req.key.Add("HeartBeatInterval");
  37. //req.key.Add("LightIntensity");
  38. //req.key.Add("LocalAuthorizeOffline");
  39. //req.key.Add("LocalPreAuthorize");
  40. //req.key.Add("MeterValuesAlignedData");
  41. //req.key.Add("MeterValuesSampledData");
  42. //req.key.Add("MeterValueSampleInterval");
  43. //req.key.Add("MinimumStatusDuration");
  44. //req.key.Add("ResetRetries");
  45. //req.key.Add("ConnectorPhaseRotation");
  46. //req.key.Add("StopTransactionOnEVSideDisconnect");
  47. //req.key.Add("LocalAuthorizationListEnabled");
  48. //req.key.Add("StopTransactionOnInvalidId");
  49. //req.key.Add("StopTxnAlignedData");
  50. //req.key.Add("StopTxnSampledData");
  51. //req.key.Add("SupportedCompliancyProfiles");
  52. //req.key.Add("TransactionMessageAttempts");
  53. //req.key.Add("TransactionMessageRetryInterval");
  54. //req.key.Add("UnlockConnectorOnEVSideDisconnect");
  55. //req.key.Add("ChargeProfileMaxStackLevel");
  56. //req.key.Add("ChargingScheduleAllowedSchedulingUnit");
  57. //req.key.Add("ChargingScheduleMaxPeriods");
  58. //req.key.Add("MaxChargingProfilesInstalled");
  59. //req.key.Add("ProximityLockRetries");
  60. //req.key.Add("ProximityContactRetries");
  61. //req.key.Add("ChargePointId");
  62. //req.key.Add("GetConfigurationMaxKeys");
  63. //req.key.Add("LocalAuthListSize");
  64. //req.key.Add("LocalAuthMaxElementsOnce");
  65. //req.key.Add("MaxEnergyOnInvalidId");
  66. //req.key.Add("MeterValuesTriggeredData");
  67. //req.key.Add("ReserveConnectorZeroSupported");
  68. //req.key.Add("WebSocketPingInterval");
  69. //req.key.Add("Testing");
  70. return req;
  71. }
  72. /// <summary>
  73. /// 要求電樁改變configuration parameters
  74. /// </summary>
  75. static public IRequest MakeChangeConfigurationRequest(string key, string keyvalue)
  76. {
  77. ChangeConfigurationRequest req = new ChangeConfigurationRequest();
  78. if (key == "HeartbeatInterval")
  79. {
  80. req.key = "HeartbeatInterval";
  81. req.value = keyvalue;
  82. }
  83. return req;
  84. }
  85. /// <summary>
  86. /// APP啟動充電
  87. /// </summary>
  88. public IRequest MakeRemoteStartTransactionRequest(int gunSerNo, string memberId)
  89. {
  90. RemoteStartTransactionRequest req = new RemoteStartTransactionRequest();
  91. req.connectorId = gunSerNo;//0;
  92. req.idTag = memberId;//"990f57dd-b660-4734-8e96-4cd346d0qwez";
  93. req.chargingProfile = null;
  94. return req;
  95. }
  96. /// <summary>
  97. /// APP結束充電
  98. /// </summary>
  99. public IRequest MakeRemoteStopTransactionRequest(int transactionId)
  100. {
  101. RemoteStopTransactionRequest req = new RemoteStopTransactionRequest();
  102. req.transactionId = transactionId;
  103. return req;
  104. }
  105. /// <summary>
  106. /// 要求電樁清除 Authorization Cache
  107. /// </summary>
  108. public IRequest MakeClearCacheRequest()
  109. {
  110. ClearCacheRequest req = new ClearCacheRequest();
  111. return req;
  112. }
  113. /// <summary>
  114. /// 要求電樁 Hard Reset
  115. /// </summary>
  116. public IRequest MakeHardResetRequest()
  117. {
  118. ResetRequest req = new ResetRequest();
  119. req.type = ResetType.Hard;
  120. return req;
  121. }
  122. /// <summary>
  123. /// 要求電樁 Soft Reset
  124. /// </summary>
  125. public IRequest MakeSoftResetRequest()
  126. {
  127. ResetRequest req = new ResetRequest();
  128. req.type = ResetType.Soft;
  129. return req;
  130. }
  131. /// <summary>
  132. /// unlock 電樁 connector
  133. /// </summary>
  134. public IRequest MakeUnlockConnectorRequest(int connectorId)
  135. {
  136. UnlockConnectorRequest req = new UnlockConnectorRequest();
  137. req.connectorId = connectorId;
  138. return req;
  139. }
  140. /// <summary>
  141. /// 取得 電樁 configuration
  142. /// </summary>
  143. public IRequest MakeGetConfigurationRequest(string key)
  144. {
  145. GetConfigurationRequest req = new GetConfigurationRequest();
  146. //req.key = new List<string> {"LocalAuthListEnabled","SendLocalListMaxLength"};
  147. //req.key = new List<string> { "AllowOfflineTxForUnknownId", "AuthorizationCacheEnabled", "AuthorizeRemoteTxRequests", "BlinkRepeat", "ClockAlignedDataInterval", "ConnectionTimeOut", "GetConfigurationMaxKeys", "HeartbeatInterval", "LightIntensity", "LocalAuthorizeOffline", "LocalPreAuthorize", "MaxEnergyOnInvalidId" , "MeterValuesAlignedData", "MeterValuesAlignedDataMaxLength", "MeterValuesSampledData", "MeterValuesSampledDataMaxLength", "MeterValueSampleInterval", "MinimumStatusDuration", "NumberOfConnectors", "ResetRetries", "ConnectorPhaseRotation", "ConnectorPhaseRotationMaxLength", "StopTransactionOnEVSideDisconnect", "StopTransactionOnInvalidId", "StopTxnAlignedData", "StopTxnAlignedDataMaxLength", "StopTxnSampledData", "StopTxnSampledDataMaxLength", "SupportedFeatureProfiles", "SupportedFeatureProfilesMaxLength", "TransactionMessageAttempts", "TransactionMessageRetryInterval", "UnlockConnectorOnEVSideDisconnect", "WebSocketPingInterval", "LocalAuthListEnabled", "LocalAuthListMaxLength", "SendLocalListMaxLength", "ReserveConnectorZeroSupported", "ChargeProfileMaxStackLevel", "ChargingScheduleAllowedChargingRateUnit", "ChargingScheduleMaxPeriods", "ConnectorSwitch3to1PhaseSupported", "MaxChargingProfilesInstalled" };
  148. //req.key = new List<string> ();
  149. req.key = new List<string> { "AllowOfflineTxForUnknownId", "AuthorizationCacheEnabled", "LocalAuthListEnabled", "SendLocalListMaxLength", "ConnectionTimeOut", "HeartbeatInterval", "test1", "test2" };
  150. return req;
  151. }
  152. /// <summary>
  153. /// 設定 電樁槍號 availability 改變
  154. /// </summary>
  155. public IRequest MakeChangeAvailabilityRequest(int connectorId)
  156. {
  157. ChangeAvailabilityRequest req = new ChangeAvailabilityRequest();
  158. req.connectorId = connectorId;
  159. req.type = AvailabilityType.Operative;
  160. return req;
  161. }
  162. #endregion Core
  163. #region RemoteTrigger
  164. /// <summary>
  165. /// Trigger 電樁 送相關的message
  166. /// </summary>
  167. public IRequest MakeTriggerMessageRequest(MessageTrigger messageType, int connectorId)
  168. {
  169. TriggerMessageRequest req = new TriggerMessageRequest();
  170. req.requestedMessage = messageType;
  171. req.connectorId = connectorId;
  172. return req;
  173. }
  174. #endregion RemoteTrigger
  175. #region FirmwareManagement
  176. /// <summary>
  177. /// 請電樁送diagnostic information
  178. /// </summary>
  179. static public IRequest MakeGetDiagnosticsRequest(bool ac)
  180. {
  181. GetDiagnosticsRequest req = new GetDiagnosticsRequest();
  182. if (ac == true)
  183. req.location = new Uri("ftp://ipc_ui:pht2016@ftp.phihong.com.tw/AC/log/");
  184. else
  185. req.location = new Uri("ftp://ipc_ui:pht2016@ftp.phihong.com.tw/DC/log/");
  186. return req;
  187. }
  188. /// <summary>
  189. /// 請電樁 update firmware
  190. /// </summary>
  191. static public IRequest MakeOCPPUpdateFirmwareRequest(string fileurl)
  192. {
  193. UpdateFirmwareRequest req = new UpdateFirmwareRequest();
  194. req.location = new Uri(fileurl);
  195. req.retrieveDate = DateTime.Now;
  196. return req;
  197. }
  198. #endregion FirmwareManagement
  199. #region LocalAuthListManagement
  200. /// <summary>
  201. /// 請電樁送 the Local Authorization Lis 版本號
  202. /// </summary>
  203. static public IRequest MakeGetLocalListVersionRequest()
  204. {
  205. GetLocalListVersionRequest req = new GetLocalListVersionRequest();
  206. return req;
  207. }
  208. /// <summary>
  209. /// 送給電樁 Local Authorization Lis 版本號 跟 idTags
  210. /// </summary>
  211. static public IRequest MakeSendLocalListRequest(List<OCPPServer.Common.LocalAuthorization> localauth, uint version, byte type)
  212. {
  213. SendLocalListRequest req = new SendLocalListRequest();
  214. req.localAuthorizationList = new List<AuthorizationData>();
  215. foreach (var localAuthorization in localauth)
  216. {
  217. AuthorizationData athData = new AuthorizationData();
  218. athData.IdToken = localAuthorization.CardNumber;
  219. IdTagInfo idTagInfo = new IdTagInfo();
  220. idTagInfo.expiryDate = DateTime.Parse(localAuthorization.ExpiryDate);
  221. idTagInfo.parentIdTag = localAuthorization.CardNumber;
  222. idTagInfo.status = (AuthorizationStatus)localAuthorization.Status;
  223. athData.idTagInfo = idTagInfo;
  224. req.localAuthorizationList.Add(athData);
  225. }
  226. req.listVersion = Convert.ToInt32(version);
  227. //0:全部更新 ,1:差异更新
  228. if (type == 0)
  229. {
  230. req.updateType = UpdateType.Full;
  231. }
  232. else
  233. {
  234. req.updateType = UpdateType.Differential;
  235. }
  236. return req;
  237. }
  238. #endregion LocalAuthListManagement
  239. #region Reservation
  240. /// <summary>
  241. /// 預約電樁槍號
  242. /// </summary>
  243. public IRequest MakeReserveNowRequest(int connectorId, string memberId, bool reserveConnectorZeroSupported, int reservationId)
  244. {
  245. int RetainMinute = 5;
  246. ReserveNowRequest req = new ReserveNowRequest();
  247. if (reserveConnectorZeroSupported == true)
  248. req.connectorId = 0;
  249. else
  250. req.connectorId = connectorId;
  251. req.expiryDate = DateTime.Now.AddMinutes(RetainMinute);
  252. req.parentIdTag = memberId;
  253. req.idTag = memberId;
  254. req.reservationId = reservationId;
  255. return req;
  256. }
  257. /// <summary>
  258. /// 取消預約電樁槍號
  259. /// </summary>
  260. public IRequest MakeCancelReservationRequest(int reservationId)
  261. {
  262. CancelReservationRequest req = new CancelReservationRequest();
  263. req.reservationId = reservationId;
  264. return req;
  265. }
  266. #endregion Reservation
  267. #region SmartCharging
  268. /// <summary>
  269. /// 設定 Charging Profile
  270. /// </summary>
  271. static public IRequest MakeSetChargingProfileRequest(int connectorId, int transactionId, int chargingProfileId, string purpose)
  272. {
  273. SetChargingProfileRequest req = new SetChargingProfileRequest();
  274. req.connectorId = connectorId;
  275. req.csChargingProfiles = new csChargingProfiles();
  276. req.csChargingProfiles.chargingProfileId = chargingProfileId;
  277. req.csChargingProfiles.transactionId = transactionId;
  278. if (purpose.Contains("ChargePointMaxProfile"))
  279. {
  280. req.csChargingProfiles.stackLevel = 2;
  281. req.csChargingProfiles.chargingProfilePurpose = ChargingProfilePurposeType.ChargePointMaxProfile;
  282. req.csChargingProfiles.chargingProfileKind = ChargingProfileKindType.Recurring;
  283. req.csChargingProfiles.recurrencyKind = RecurrencyKindType.Daily;
  284. }
  285. else if (purpose.Contains("TxDefaultProfile"))
  286. {
  287. req.csChargingProfiles.stackLevel = 1;
  288. req.csChargingProfiles.chargingProfilePurpose = ChargingProfilePurposeType.TxDefaultProfile;
  289. req.csChargingProfiles.chargingProfileKind = ChargingProfileKindType.Absolute;
  290. req.csChargingProfiles.recurrencyKind = RecurrencyKindType.Weekly;
  291. }
  292. else if (purpose.Contains("TxProfile"))
  293. {
  294. req.csChargingProfiles.stackLevel = 0;
  295. req.csChargingProfiles.chargingProfilePurpose = ChargingProfilePurposeType.TxProfile;
  296. req.csChargingProfiles.chargingProfileKind = ChargingProfileKindType.Relative;
  297. req.csChargingProfiles.recurrencyKind = RecurrencyKindType.Daily;
  298. }
  299. req.csChargingProfiles.validFrom = DateTime.Now;
  300. req.csChargingProfiles.validTo = DateTime.Now.AddHours(2);
  301. req.csChargingProfiles.chargingSchedule = new ChargingSchedule();
  302. req.csChargingProfiles.chargingSchedule.chargingRateUnit = ChargingRateUnitType.A;
  303. req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod = new List<ChargingSchedulePeriod>();
  304. req.csChargingProfiles.chargingSchedule.duration = 120;
  305. req.csChargingProfiles.chargingSchedule.minChargingRate = 0.0m;
  306. req.csChargingProfiles.chargingSchedule.startSchedule = DateTime.Now;
  307. req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod = new List<ChargingSchedulePeriod>();
  308. req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod.Add(new ChargingSchedulePeriod() { startPeriod = 0, limit = 11000.0m, numberPhases = 3 });
  309. req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod.Add(new ChargingSchedulePeriod() { startPeriod = 28800, limit = 6000.0m, numberPhases = 3 });
  310. req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod.Add(new ChargingSchedulePeriod() { startPeriod = 72000, limit = 6000.0m, numberPhases = 3 });
  311. // Add parts to the list.
  312. //req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod.Add(new ChargingSchedulePeriod() { startPeriod = 5, limit = 8.1m, numberPhases = 3 });
  313. return req;
  314. }
  315. /// <summary>
  316. /// 設定 Charging Profile
  317. /// </summary>
  318. static public IRequest MakeSetChargingProfileRequest(BaseCmd cmd, int transactionId)
  319. {
  320. SetChargingProfileRequest req = new SetChargingProfileRequest();
  321. var c = cmd as Cmd1013;
  322. if(c.GunSerNo == 255)
  323. req.connectorId = 0;
  324. else
  325. req.connectorId = c.GunSerNo + 1;
  326. req.csChargingProfiles = new csChargingProfiles();
  327. req.csChargingProfiles.chargingProfileId = c.ChargingProfileId;
  328. req.csChargingProfiles.transactionId = transactionId;
  329. req.csChargingProfiles.stackLevel = c.stackLevel;
  330. req.csChargingProfiles.chargingProfilePurpose = (c.ChargingProfilePurpose == 0) ? ChargingProfilePurposeType.ChargePointMaxProfile : ((c.ChargingProfilePurpose == 1) ? ChargingProfilePurposeType.TxDefaultProfile : ChargingProfilePurposeType.TxProfile);
  331. req.csChargingProfiles.chargingProfileKind = (c.ChargingProfileKind == 0) ? ChargingProfileKindType.Absolute : ((c.ChargingProfileKind == 1) ? ChargingProfileKindType.Recurring : ChargingProfileKindType.Relative);
  332. req.csChargingProfiles.recurrencyKind = (c.RecurrencyKind == 0) ? RecurrencyKindType.Daily : RecurrencyKindType.Weekly;
  333. req.csChargingProfiles.validFrom = c.ValidFrom.Value;
  334. req.csChargingProfiles.validTo = c.ValidTo.Value;
  335. req.csChargingProfiles.chargingSchedule = new ChargingSchedule();
  336. req.csChargingProfiles.chargingSchedule.chargingRateUnit = (c.ChargingRateUnit == 0) ? ChargingRateUnitType.W: ChargingRateUnitType.A;
  337. req.csChargingProfiles.chargingSchedule.duration = Convert.ToInt32(c.Duration);
  338. req.csChargingProfiles.chargingSchedule.minChargingRate = c.MinChargingRate.RealValue;
  339. req.csChargingProfiles.chargingSchedule.startSchedule = c.StartSchedule.Value;
  340. req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod = new List<ChargingSchedulePeriod>();
  341. var chargingPeriod = c.ChargingSchedulePeriod as List<ChargingSchedulePeriodParameter>;
  342. foreach (var csp in chargingPeriod)
  343. {
  344. req.csChargingProfiles.chargingSchedule.chargingSchedulePeriod.Add(new ChargingSchedulePeriod() { startPeriod = Convert.ToInt32(csp.StartPeriod), limit = csp.Limit.RealValue, numberPhases = 3 });
  345. }
  346. return req;
  347. }
  348. /// <summary>
  349. /// 設定Clear Charging Profile
  350. /// </summary>
  351. public IRequest MakeClearChargingProfileRequest(int connectorId)
  352. {
  353. ClearChargingProfileRequest req = new ClearChargingProfileRequest();
  354. req.connectorId = 0;
  355. req.id = 1;
  356. req.stackLevel = 1;
  357. req.chargingProfilePurpose = ChargingProfilePurposeType.TxDefaultProfile;
  358. return req;
  359. }
  360. /// <summary>
  361. /// 設定Clear Charging Profile
  362. /// </summary>
  363. public IRequest MakeClearChargingProfileRequest(BaseCmd cmd)
  364. {
  365. ClearChargingProfileRequest req = new ClearChargingProfileRequest();
  366. var c = cmd as Cmd1015;
  367. if (c.GunSerNo == 255)
  368. req.connectorId = 0;
  369. else
  370. req.connectorId = c.GunSerNo + 1;
  371. req.id = c.ChargingProfileId;
  372. req.stackLevel = c.stackLevel;
  373. req.chargingProfilePurpose = (c.ChargingProfilePurpose == 0) ? ChargingProfilePurposeType.ChargePointMaxProfile : ((c.ChargingProfilePurpose == 1) ? ChargingProfilePurposeType.TxDefaultProfile : ChargingProfilePurposeType.TxProfile);
  374. return req;
  375. }
  376. /// <summary>
  377. /// 取得電樁 Composite Charging Schedule
  378. /// </summary>
  379. public IRequest MakeGetCompositeScheduleRequest(int connectorId)
  380. {
  381. GetCompositeScheduleRequest req = new GetCompositeScheduleRequest();
  382. req.connectorId = connectorId;
  383. req.duration = 120;
  384. req.chargingRateUnit = ChargingRateUnitType.A;
  385. return req;
  386. }
  387. #endregion SmartCharging
  388. #region DataTransfer
  389. /// <summary>
  390. /// 向充電樁下發升級指令
  391. /// </summary>
  392. public IRequest MakeUpdateFirmware(int type, ProgramParam param, UploadFile uploadFile)
  393. {
  394. UpdateFirmware updatefirm = new UpdateFirmware();
  395. updatefirm.type = (ProgramType)type;
  396. updatefirm.param = param;
  397. updatefirm.url = @"http://" + uploadFile.FileUrl;
  398. updatefirm.md5 = uploadFile.FileMD5.ToUpper();
  399. DataTransferRequest req = new DataTransferRequest();
  400. req.vendorId = "Phihong";
  401. req.messageId = "UpdateFirmware";
  402. req.data = JsonConvert.SerializeObject(updatefirm);
  403. return req;
  404. }
  405. /// <summary>
  406. /// 設定簡易版充電電量
  407. /// </summary>
  408. static public IRequest MakeSendChargingConfigRequest(BaseCmd cmd)
  409. {
  410. var c = cmd as Cmd1017;
  411. DataTransferRequest req = new DataTransferRequest();
  412. req.vendorId = c.vendorId;
  413. req.messageId = "SetChargingConfig";
  414. req.data = JsonConvert.SerializeObject( new ChargingRate() { chargingRateUnit="A", limit=c.limit});
  415. return req;
  416. }
  417. /// <summary>
  418. /// 取得簡易版充電電量
  419. /// </summary>
  420. static public IRequest MakeSendGetChargingConfigRequest(BaseCmd cmd)
  421. {
  422. var c = cmd as Cmd1019;
  423. DataTransferRequest req = new DataTransferRequest();
  424. req.vendorId = c.vendorId;
  425. req.messageId = "GetChargingConfig";
  426. return req;
  427. }
  428. /// <summary>
  429. /// 設定樁的夥伴代碼
  430. /// </summary>
  431. public IRequest MakeSendPartnerPoleIdRequest(string partnerPoleId)
  432. {
  433. DataTransferRequest req = new DataTransferRequest();
  434. req.vendorId = "Phihong";
  435. req.messageId = "SendPartnerPoleId";
  436. req.data = partnerPoleId;
  437. return req;
  438. }
  439. /// <summary>
  440. /// 將電樁轉伺服器
  441. /// </summary>
  442. public IRequest MakeServerDomainNameRequest(string ServerDomainName)
  443. {
  444. DataTransferRequest req = new DataTransferRequest();
  445. req.vendorId = "Phihong";
  446. req.messageId = "ServerDomainName";
  447. req.data = ServerDomainName;
  448. return req;
  449. }
  450. /// <summary>
  451. /// 下發全天電費
  452. /// </summary>
  453. public IRequest MakeAllDayUniformElectricBillRequest(decimal pricePerKWH)
  454. {
  455. DataTransferRequest req = new DataTransferRequest();
  456. req.vendorId = "Phihong";
  457. req.messageId = "AllDayUniformElectricBill";
  458. req.data = System.Convert.ToString((double)pricePerKWH);
  459. return req;
  460. }
  461. /// <summary>
  462. /// 下發全天 48 時段電費
  463. /// </summary>
  464. public IRequest MakeAllDaySectionElectricBillRequest(List<double> sectionElectricBill)
  465. {
  466. DataTransferRequest req = new DataTransferRequest();
  467. req.vendorId = "Phihong";
  468. req.messageId = "AllDaySectionElectricBill";
  469. req.data = JsonConvert.SerializeObject(sectionElectricBill);
  470. return req;
  471. }
  472. /// <summary>
  473. /// 下發充電服務費
  474. /// </summary>
  475. public IRequest MakeFeePerKWHRequest(decimal pricePerKWH)
  476. {
  477. DataTransferRequest req = new DataTransferRequest();
  478. req.vendorId = "Phihong";
  479. req.messageId = "FeePerKWH";
  480. req.data = System.Convert.ToString((double)pricePerKWH);
  481. return req;
  482. }
  483. /// <summary>
  484. /// 下發帳戶餘額
  485. /// </summary>
  486. public IRequest MakeAccountBalanceRequest(string uniqueId, decimal balance, int VehicleType)
  487. {
  488. DataTransferRequest req = new DataTransferRequest();
  489. req.vendorId = "Phihong";
  490. req.messageId = "AccountBalance";
  491. AccountBalance account = new AccountBalance();
  492. account.uniqueId = uniqueId;
  493. account.balance = (double)balance;
  494. account.VehicleType = VehicleType;
  495. req.data = JsonConvert.SerializeObject(account);
  496. return req;
  497. }
  498. /// <summary>
  499. /// 下發定時充電資訊
  500. /// </summary>
  501. public IRequest MakeAutoChargeReservationRequest(AutoChargeReservation autoChargeReservationParam)
  502. {
  503. DataTransferRequest req = new DataTransferRequest();
  504. req.vendorId = "Phihong";
  505. req.messageId = "AutoChargeReservation";
  506. req.data = JsonConvert.SerializeObject(autoChargeReservationParam);
  507. return req;
  508. }
  509. /// <summary>
  510. ///
  511. /// </summary>
  512. /// <param name="gunNo"></param>
  513. /// <param name="Type"></param>
  514. /// <returns></returns>
  515. public IRequest MakeCustomCommandRequest(int gunNo, int Type)
  516. {
  517. DataTransferRequest req = new DataTransferRequest();
  518. req.vendorId = "Phihong";
  519. req.messageId = "SetCustomCMD";
  520. CustomCommand customCommandParam = new CustomCommand();
  521. customCommandParam.connectorId = gunNo;
  522. customCommandParam.CommandType = (Type == 18) ? OCPP_Packet.Packet.Status.CustomCommandType.QRCodeFlash : ((Type == 19) ? OCPP_Packet.Packet.Status.CustomCommandType.DisableCharger : OCPP_Packet.Packet.Status.CustomCommandType.EnableCharger);
  523. req.data = JsonConvert.SerializeObject(customCommandParam);
  524. return req;
  525. }
  526. #endregion DataTransfer
  527. }
  528. }