You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

80 lines
3.5 KiB

  1. using DotNetty.Buffers;
  2. using DotNetty.Transport.Channels;
  3. using JT808.Protocol;
  4. using System;
  5. using Microsoft.Extensions.Logging;
  6. using JT808.Gateway.Services;
  7. using JT808.Gateway.Session;
  8. using JT808.Gateway.PubSub;
  9. using JT808.Gateway.Metadata;
  10. using JT808.Gateway.Enums;
  11. namespace JT808.Gateway.Handlers
  12. {
  13. /// <summary>
  14. /// JT808 Udp服务端处理程序
  15. /// </summary>
  16. internal class JT808UdpServerHandler : SimpleChannelInboundHandler<JT808UdpPackage>
  17. {
  18. private readonly JT808AtomicCounterService jT808AtomicCounterService;
  19. private readonly ILogger<JT808UdpServerHandler> logger;
  20. private readonly JT808SessionManager jT808UdpSessionManager;
  21. private readonly JT808Serializer JT808Serializer;
  22. private readonly IJT808MsgProducer JT808MsgProducer;
  23. public JT808UdpServerHandler(
  24. IJT808MsgProducer jT808MsgProducer,
  25. IJT808Config jT808Config,
  26. ILoggerFactory loggerFactory,
  27. JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory,
  28. JT808SessionManager jT808UdpSessionManager)
  29. {
  30. this.JT808MsgProducer = jT808MsgProducer;
  31. this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.udp);
  32. this.jT808UdpSessionManager = jT808UdpSessionManager;
  33. logger = loggerFactory.CreateLogger<JT808UdpServerHandler>();
  34. JT808Serializer = jT808Config.GetSerializer();
  35. }
  36. protected override void ChannelRead0(IChannelHandlerContext ctx, JT808UdpPackage msg)
  37. {
  38. try
  39. {
  40. //解析到头部,然后根据具体的消息Id通过队列去进行消费
  41. //要是一定要解析到数据体可以在JT808MsgIdHandlerBase类中根据具体的消息,
  42. //解析具体的消息体,具体调用JT808Serializer.Deserialize<T>
  43. JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize<JT808HeaderPackage>(msg.Buffer);
  44. if (logger.IsEnabled(LogLevel.Trace))
  45. {
  46. logger.LogTrace($"accept package success count=>{jT808AtomicCounterService.MsgFailCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg.Buffer)}");
  47. }
  48. jT808AtomicCounterService.MsgSuccessIncrement();
  49. jT808UdpSessionManager.TryAdd(ctx.Channel, msg.Sender, jT808HeaderPackage.Header.TerminalPhoneNo);
  50. JT808MsgProducer.ProduceAsync(jT808HeaderPackage.Header.TerminalPhoneNo, msg.Buffer);
  51. }
  52. catch (JT808.Protocol.Exceptions.JT808Exception ex)
  53. {
  54. jT808AtomicCounterService.MsgFailIncrement();
  55. if (logger.IsEnabled(LogLevel.Error))
  56. {
  57. logger.LogError(ex, $"accept package fail count=>{jT808AtomicCounterService.MsgFailCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg.Buffer)}");
  58. }
  59. }
  60. catch (Exception ex)
  61. {
  62. jT808AtomicCounterService.MsgFailIncrement();
  63. if (logger.IsEnabled(LogLevel.Error))
  64. {
  65. logger.LogError(ex, $"accept package fail count=>{jT808AtomicCounterService.MsgFailCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg.Buffer)}");
  66. }
  67. }
  68. }
  69. public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush();
  70. }
  71. }