Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

143 rindas
5.4KB

  1. using DotNetty.Buffers;
  2. using DotNetty.Transport.Channels;
  3. using Microsoft.Extensions.Logging;
  4. using NearCardAttendance.Common.helper;
  5. using NearCardAttendance.Service.TcpServer.Mapper;
  6. using NearCardAttendance.Service.TcpServer.Protocol;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace NearCardAttendance.Service.TcpServer.Handler
  13. {
  14. public class RegisterHandler : ChannelHandlerAdapter
  15. {
  16. private readonly ILogger<RegisterHandler> _logger;
  17. private readonly HttpHelper _httpHelper = default!;
  18. private readonly IDisposable _loggerScope = default!;
  19. private readonly TcpClientsManager _managerTcpClients;
  20. private readonly ScheduleResendManager _managerScheduleResend;
  21. public RegisterHandler(ILogger<RegisterHandler> logger,HttpHelper httpHelper)
  22. {
  23. _logger = logger;
  24. _httpHelper = httpHelper;
  25. }
  26. public override void ChannelActive(IChannelHandlerContext context)
  27. {
  28. base.ChannelActive(context); // Pass the event to the next handler
  29. }
  30. public override async void ChannelInactive(IChannelHandlerContext context)
  31. {
  32. try
  33. {
  34. }
  35. catch (Exception ex)
  36. {
  37. _logger.LogInformation($"{nameof(RegisterHandler)} --- {nameof(ChannelInactive)} 出错\n{ex.Message}\n{ex.StackTrace}");
  38. }
  39. }
  40. public override void HandlerRemoved(IChannelHandlerContext context)
  41. {
  42. base.HandlerRemoved(context);
  43. }
  44. public override async void ChannelRead(IChannelHandlerContext context, object message)
  45. {
  46. if (message is ProtocolParser parser)
  47. {
  48. try
  49. {
  50. using (_logger.BeginScope(new Dictionary<string, object> { ["RequestId"] = parser.SeqNo }))
  51. {
  52. //认证
  53. if (parser.FuncNo.Equals("10"))
  54. {
  55. #region 认证业务
  56. // PHONE_AUTHEN
  57. ProtocolWrapper phoneAuthWrapper = new(parser.FuncNo, parser.SeqNo, "1");
  58. await SendToTcpClientAsync(phoneAuthWrapper, context.Channel);
  59. // ABT_STATUS 延时3秒 给终端同步时间
  60. await context.Channel.EventLoop.Schedule(async () =>
  61. {
  62. ProtocolWrapper abtStatusWrapper = new("82", parser.SeqNo, DateTime.Now.ToString("yyyyMMddHHmmss"));
  63. await SendToTcpClientAsync(abtStatusWrapper, context.Channel);
  64. },TimeSpan.FromSeconds(3));
  65. #endregion
  66. }
  67. else if (parser.FuncNo.Equals("82"))
  68. {
  69. // 认证成功
  70. _logger.LogInformation($"认证成功{parser.Data}.");
  71. }
  72. // 心跳
  73. else if (parser.FuncNo.Equals("05"))
  74. {
  75. ProtocolWrapper stdtSignRecsWrapper = new(parser.FuncNo, parser.SeqNo,"");
  76. await SendToTcpClientAsync(stdtSignRecsWrapper, context.Channel);
  77. } // STDT_SIGN_RECS
  78. else if (parser.FuncNo.Equals("04"))
  79. {
  80. // 回应设备
  81. ProtocolWrapper stdtSignRecsWrapper = new(parser.FuncNo, parser.SeqNo,"1");
  82. await SendToTcpClientAsync(stdtSignRecsWrapper, context.Channel);
  83. // 刷卡考勤信息,需要推送给第三方平台
  84. //var url = "";
  85. //await _httpHelper.HttpToPostAsync(url, new object());
  86. }
  87. //switch (parser.FuncNo)
  88. //{
  89. // case "10":
  90. // break;
  91. // case "82":
  92. // break;
  93. // default:
  94. // break;
  95. //}
  96. }
  97. }
  98. catch (Exception ex)
  99. {
  100. _logger.LogInformation($"{nameof(RegisterHandler)} --- {nameof(ChannelRead)} 处理消息 {parser.SeqNo} 出错\n{ex.Message}\n{ex.StackTrace}");
  101. }
  102. }
  103. }
  104. /// <summary>
  105. /// 发送到TCP客户端
  106. /// </summary>
  107. /// <param name="wrapper"></param>
  108. /// <param name="channel"></param>
  109. private async Task SendToTcpClientAsync(ProtocolWrapper wrapper, IChannel channel)
  110. {
  111. string protocolMsg = wrapper.GenerateProtocolString();
  112. // 发送protocolMsg到tcp客户端
  113. await channel
  114. .WriteAndFlushAsync(Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(protocolMsg)))
  115. .ContinueWith(Action => {
  116. _logger.LogInformation($"{nameof(RegisterHandler)} -- {nameof(SendToTcpClientAsync)} -- 下发设备内容:\n{protocolMsg}");
  117. });
  118. }
  119. }
  120. }