選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

101 行
4.6 KiB

  1. using DotNetty.Buffers;
  2. using DotNetty.Transport.Channels;
  3. using JT808.Protocol;
  4. using System;
  5. using Microsoft.Extensions.Logging;
  6. using DotNetty.Transport.Channels.Sockets;
  7. using JT808.DotNetty.Core.Metadata;
  8. using JT808.DotNetty.Abstractions;
  9. using JT808.DotNetty.Core.Services;
  10. using JT808.DotNetty.Core;
  11. using JT808.DotNetty.Core.Handlers;
  12. using System.Threading.Tasks;
  13. namespace JT808.DotNetty.Udp.Handlers
  14. {
  15. /// <summary>
  16. /// JT808 Udp服务端处理程序
  17. /// </summary>
  18. internal class JT808UdpServerHandler : SimpleChannelInboundHandler<JT808UdpPackage>
  19. {
  20. private readonly IJT808SourcePackageDispatcher jT808SourcePackageDispatcher;
  21. private readonly JT808UdpAtomicCounterService jT808UdpAtomicCounterService;
  22. private readonly ILogger<JT808UdpServerHandler> logger;
  23. private readonly JT808UdpSessionManager jT808UdpSessionManager;
  24. private readonly JT808MsgIdUdpHandlerBase handler;
  25. private readonly JT808UdpTrafficService jT808UdpTrafficService;
  26. public JT808UdpServerHandler(
  27. JT808UdpTrafficService jT808UdpTrafficService,
  28. ILoggerFactory loggerFactory,
  29. IJT808SourcePackageDispatcher jT808SourcePackageDispatcher,
  30. JT808MsgIdUdpHandlerBase handler,
  31. JT808UdpAtomicCounterService jT808UdpAtomicCounterService,
  32. JT808UdpSessionManager jT808UdpSessionManager)
  33. {
  34. this.jT808UdpTrafficService = jT808UdpTrafficService;
  35. this.handler = handler;
  36. this.jT808SourcePackageDispatcher = jT808SourcePackageDispatcher;
  37. this.jT808UdpAtomicCounterService = jT808UdpAtomicCounterService;
  38. this.jT808UdpSessionManager = jT808UdpSessionManager;
  39. logger = loggerFactory.CreateLogger<JT808UdpServerHandler>();
  40. }
  41. protected override void ChannelRead0(IChannelHandlerContext ctx, JT808UdpPackage msg)
  42. {
  43. try
  44. {
  45. jT808SourcePackageDispatcher?.SendAsync(msg.Buffer);
  46. jT808UdpTrafficService.ReceiveSize(msg.Buffer.Length);
  47. //解析到头部,然后根据具体的消息Id通过队列去进行消费
  48. //要是一定要解析到数据体可以在JT808MsgIdHandlerBase类中根据具体的消息,
  49. //解析具体的消息体,具体调用JT808Serializer.Deserialize<T>
  50. JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize<JT808HeaderPackage>(msg.Buffer);
  51. jT808UdpAtomicCounterService.MsgSuccessIncrement();
  52. jT808UdpSessionManager.TryAdd(new JT808UdpSession(ctx.Channel, msg.Sender, jT808HeaderPackage.Header.TerminalPhoneNo));
  53. if (logger.IsEnabled(LogLevel.Debug))
  54. {
  55. logger.LogDebug("accept package success count<<<" + jT808UdpAtomicCounterService.MsgSuccessCount.ToString());
  56. }
  57. Func<JT808Request, JT808Response> handlerFunc;
  58. if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out handlerFunc))
  59. {
  60. JT808Response jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg.Buffer));
  61. if (jT808Response != null)
  62. {
  63. var sendData = JT808Serializer.Serialize(jT808Response.Package, jT808Response.MinBufferSize);
  64. jT808UdpTrafficService.SendSize(sendData.Length);
  65. ctx.WriteAndFlushAsync(new DatagramPacket(Unpooled.WrappedBuffer(sendData), msg.Sender));
  66. }
  67. }
  68. }
  69. catch (JT808.Protocol.Exceptions.JT808Exception ex)
  70. {
  71. jT808UdpAtomicCounterService.MsgFailIncrement();
  72. if (logger.IsEnabled(LogLevel.Error))
  73. {
  74. logger.LogError("accept package fail count<<<" + jT808UdpAtomicCounterService.MsgFailCount.ToString());
  75. logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg.Buffer));
  76. }
  77. }
  78. catch (Exception ex)
  79. {
  80. jT808UdpAtomicCounterService.MsgFailIncrement();
  81. if (logger.IsEnabled(LogLevel.Error))
  82. {
  83. logger.LogError("accept package fail count<<<" + jT808UdpAtomicCounterService.MsgFailCount.ToString());
  84. logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg.Buffer));
  85. }
  86. }
  87. }
  88. public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush();
  89. }
  90. }