BasicMessageHandler.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using EVCB_OCPP.Packet.Messages;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Serialization;
  4. using NLog;
  5. using OCPPServer.Protocol;
  6. namespace EVCB_OCPP.WSServer.Message
  7. {
  8. /// <summary>
  9. /// 實現 OCPP 基本傳送規範,
  10. /// 1.訊息 基本格式,將訊息包裝成 Call 、CallResult、CallError 三種格式
  11. /// 2.OCPP 定義的傳送規則:交易相關的訊息必須依照時序性傳送,一個傳完才能接著送下一個(忽略規則 由Center System定義)
  12. /// </summary>
  13. internal class BasicMessageHandler
  14. {
  15. static protected ILogger logger = NLog.LogManager.GetCurrentClassLogger();
  16. #region 傳送 or 解析訊息需要欄位
  17. private const int INDEX_MESSAGEID = 0;
  18. private const int INDEX_UNIQUEID = 1;
  19. internal const int TYPENUMBER_CALL = 2;
  20. private const int INDEX_CALL_ACTION = 2;
  21. private const int INDEX_CALL_PAYLOAD = 3;
  22. internal const int TYPENUMBER_CALLRESULT = 3;
  23. private const int INDEX_CALLRESULT_PAYLOAD = 2;
  24. internal const int TYPENUMBER_CALLERROR = 4;
  25. private const int INDEX_CALLERROR_ERRORCODE = 2;
  26. private const int INDEX_CALLERROR_DESCRIPTION = 3;
  27. private const int INDEX_CALLERROR_PAYLOAD = 4;
  28. private const string CALL_FORMAT = "[2,\"{0}\",\"{1}\",{2}]";
  29. private const string CALLRESULT_FORMAT = "[3,\"{0}\",{1}]";
  30. private const string CALLERROR_FORMAT = "[4,\"{0}\",\"{1}\",\"{2}\",{3}]";
  31. private const string DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
  32. private const string DATE_FORMAT_WITH_MS = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
  33. #endregion
  34. private OCPP16MessageHandler _ocpp16Handler = new OCPP16MessageHandler();
  35. private OCPP20MessageHandler _ocpp20Handler = new OCPP20MessageHandler();
  36. /// <summary>
  37. /// 將收到的封包做基本的拆解分成 Call 、CallResult、CallError
  38. /// </summary>
  39. /// <param name="client"></param>
  40. /// <param name="data"></param>
  41. /// <returns></returns>
  42. internal MessageResult AnalysisReceiveData(ClientData client, string data)
  43. {
  44. MessageResult result = null;
  45. if (!client.ISOCPP20)
  46. {
  47. result = _ocpp16Handler.AnalysisReceiveData(client, data);
  48. }
  49. else
  50. {
  51. result = _ocpp20Handler.AnalysisReceiveData(client, data);
  52. }
  53. return result;
  54. }
  55. static internal string GenerateCallError(string uniqueId, string errorCode, string errorDescription)
  56. {
  57. string msg = string.Format(CALLERROR_FORMAT, uniqueId, errorCode, errorDescription, "{}");
  58. return msg;
  59. }
  60. static internal string GenerateConfirmation(string uniqueId, IConfirmation confirmation)
  61. {
  62. string msg = string.Empty;
  63. if (confirmation != null && confirmation.Validate())
  64. {
  65. msg = string.Format(CALLRESULT_FORMAT, uniqueId, JsonConvert.SerializeObject(confirmation, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }));
  66. }
  67. else
  68. {
  69. logger.Error(string.Format("confirmation is null or InVaild in GenerateConfirmation Method"), "Warning");
  70. }
  71. return msg;
  72. }
  73. static internal string GenerateConfirmationofOCPP20(string uniqueId, EVCB_OCPP20.Packet.Messages.IConfirmation confirmation)
  74. {
  75. string msg = string.Empty;
  76. if (confirmation != null && confirmation.Validate())
  77. {
  78. msg = string.Format(CALLRESULT_FORMAT, uniqueId, JsonConvert.SerializeObject(confirmation, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }));
  79. }
  80. else
  81. {
  82. logger.Error(string.Format("confirmation is null or InVaild in GenerateConfirmation Method"), "Warning");
  83. }
  84. return msg;
  85. }
  86. static internal string GenerateRequest(string uniqueId, string action, IRequest request)
  87. {
  88. string msg = string.Empty;
  89. if (request != null && request.Validate())
  90. {
  91. msg = string.Format(CALL_FORMAT, uniqueId, action, JsonConvert.SerializeObject(request, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }));
  92. }
  93. else
  94. {
  95. logger.Error(string.Format("confirmation is null or InVaild in GenerateRequest Method"), "Warning");
  96. }
  97. return msg;
  98. }
  99. static internal string GenerateRequestofOCPP20(string uniqueId, string action, EVCB_OCPP20.Packet.Messages.IRequest request)
  100. {
  101. string msg = string.Empty;
  102. if (request != null && request.Validate())
  103. {
  104. msg = string.Format(CALL_FORMAT, uniqueId, action, JsonConvert.SerializeObject(request, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }));
  105. }
  106. else
  107. {
  108. logger.Error(string.Format("confirmation is null or InVaild in GenerateRequest Method"), "Warning");
  109. }
  110. return msg;
  111. }
  112. static internal string GenerateDestroyRequest(string uniqueId, string action, string request)
  113. {
  114. return string.Format(CALL_FORMAT, uniqueId, action, request);
  115. }
  116. }
  117. }