VendorIdReplaceService.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using EVCB_OCPP.Packet.Messages.Core;
  2. using EVCB_OCPP.WSServer.Message;
  3. using EVCB_OCPP.WSServer.Service.WsService;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using Microsoft.Extensions.Hosting;
  6. using Microsoft.Extensions.Logging;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace EVCB_OCPP.WSServer.Service
  13. {
  14. public static class VendorIdReplaceServiceExt
  15. {
  16. public static Task InitVendorIdReplaceService(this IHost host)
  17. {
  18. var server = host.Services.GetRequiredService<ProtalServer>();
  19. var vendorIdReplaceService = host.Services.GetRequiredService<VendorIdReplaceService>();
  20. server.InitActions.Add(vendorIdReplaceService.GetAndRecordVendorId);
  21. return host.Services.GetRequiredService<StationConfigService>().Init();
  22. }
  23. }
  24. internal class VendorIdReplaceService
  25. {
  26. public VendorIdReplaceService(
  27. ProtalServer protalServer
  28. , ServerMessageService messageService
  29. , ConfirmWaitingMessageSerevice confirmWaitingMessageSerevice
  30. , ILogger<VendorIdReplaceService> logger
  31. )
  32. {
  33. this.protalServer = protalServer;
  34. this.messageService = messageService;
  35. this.confirmWaitingMessageSerevice = confirmWaitingMessageSerevice;
  36. this.logger = logger;
  37. }
  38. private static string Session_VID_Key = "StationConfigService_Station";
  39. private readonly ProtalServer protalServer;
  40. private readonly ServerMessageService messageService;
  41. private readonly ConfirmWaitingMessageSerevice confirmWaitingMessageSerevice;
  42. private readonly ILogger<VendorIdReplaceService> logger;
  43. internal async Task GetAndRecordVendorId(WsClientData wsClient, CancellationToken token)
  44. {
  45. var getEvseCurrentConfigResponse = await GetEvseCurrentConfig(wsClient.ChargeBoxId, token);
  46. if (!getEvseCurrentConfigResponse.Success ||
  47. getEvseCurrentConfigResponse.Message is not GetConfigurationConfirmation confirmation)
  48. {
  49. logger.LogWarning("{chargeBoxId} get config from evse failed", wsClient.ChargeBoxId);
  50. return;
  51. }
  52. var vendorId = confirmation.configurationKey?.FirstOrDefault(x => x.key == "ChargePointVendorId");
  53. if (vendorId is null)
  54. {
  55. logger.LogWarning("{chargeBoxId} get vendorId from evse failed", wsClient.ChargeBoxId);
  56. return;
  57. }
  58. SetSessionVendorId(wsClient, vendorId.value);
  59. }
  60. private async Task<MessageResult> GetEvseCurrentConfig(string chargeBoxId, CancellationToken token = default)
  61. {
  62. var sendTask = async () => await messageService.SendGetEVSEConfigureRequest(chargeBoxId);
  63. var response = await confirmWaitingMessageSerevice.SendAndWaitUntilResultAsync(sendTask, token);
  64. return response;
  65. }
  66. private int? GetSessionVendorId(WsClientData session)
  67. {
  68. if (session is null ||
  69. !session.Data.ContainsKey(Session_VID_Key))
  70. {
  71. return null;
  72. }
  73. return (int?)session.Data[Session_VID_Key];
  74. }
  75. private void SetSessionVendorId(WsClientData session, string vid)
  76. {
  77. if (session is null)
  78. {
  79. return;
  80. }
  81. session.Data[Session_VID_Key] = vid;
  82. }
  83. }
  84. }