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

145 行
6.1 KiB

  1. using System;
  2. using System.Linq;
  3. using JT808.Gateway.GrpcService;
  4. using Grpc.Core;
  5. using System.Threading.Tasks;
  6. using JT808.Gateway.Abstractions.Enums;
  7. using JT808.Gateway.Session;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using static Grpc.Core.Metadata;
  10. using Microsoft.Extensions.Options;
  11. using JT808.Gateway.Configurations;
  12. namespace JT808.Gateway.Services
  13. {
  14. public class JT808GatewayService: JT808Gateway.JT808GatewayBase
  15. {
  16. private readonly JT808AtomicCounterService jT808TcpAtomicCounterService;
  17. private readonly JT808AtomicCounterService jT808UdpAtomicCounterService;
  18. private readonly JT808SessionManager jT808SessionManager;
  19. private readonly IOptionsMonitor<JT808Configuration> ConfigurationOptionsMonitor;
  20. public JT808GatewayService(
  21. IOptionsMonitor<JT808Configuration> configurationOptionsMonitor,
  22. JT808SessionManager jT808SessionManager,
  23. JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory
  24. )
  25. {
  26. this.jT808SessionManager = jT808SessionManager;
  27. this.ConfigurationOptionsMonitor = configurationOptionsMonitor;
  28. this.jT808TcpAtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.tcp);
  29. this.jT808UdpAtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.udp);
  30. }
  31. public JT808GatewayService(IServiceProvider serviceProvider)
  32. {
  33. this.jT808SessionManager = serviceProvider.GetRequiredService<JT808SessionManager>();
  34. this.jT808TcpAtomicCounterService = serviceProvider.GetRequiredService<JT808AtomicCounterServiceFactory>().Create(JT808TransportProtocolType.tcp);
  35. this.jT808UdpAtomicCounterService = serviceProvider.GetRequiredService<JT808AtomicCounterServiceFactory>().Create(JT808TransportProtocolType.udp);
  36. this.ConfigurationOptionsMonitor = serviceProvider.GetRequiredService<IOptionsMonitor<JT808Configuration>>();
  37. }
  38. public override Task<TcpSessionInfoReply> GetTcpSessionAll(Empty request, ServerCallContext context)
  39. {
  40. Auth(context);
  41. var result = jT808SessionManager.GetTcpAll();
  42. TcpSessionInfoReply reply = new TcpSessionInfoReply();
  43. foreach (var item in result)
  44. {
  45. reply.TcpSessions.Add(new SessionInfo
  46. {
  47. LastActiveTime = item.ActiveTime.ToString("yyyy-MM-dd HH:mm:ss"),
  48. StartTime = item.StartTime.ToString("yyyy-MM-dd HH:mm:ss"),
  49. RemoteAddressIP = item.RemoteEndPoint.ToString(),
  50. TerminalPhoneNo = item.TerminalPhoneNo
  51. });
  52. }
  53. return Task.FromResult(reply);
  54. }
  55. public override Task<SessionRemoveReply> RemoveSessionByTerminalPhoneNo(SessionRemoveRequest request, ServerCallContext context)
  56. {
  57. Auth(context);
  58. try
  59. {
  60. jT808SessionManager.RemoveByTerminalPhoneNo(request.TerminalPhoneNo);
  61. return Task.FromResult(new SessionRemoveReply { Success = true });
  62. }
  63. catch (Exception)
  64. {
  65. return Task.FromResult(new SessionRemoveReply { Success = false });
  66. }
  67. }
  68. public override Task<UdpSessionInfoReply> GetUdpSessionAll(Empty request, ServerCallContext context)
  69. {
  70. Auth(context);
  71. var result = jT808SessionManager.GetUdpAll();
  72. UdpSessionInfoReply reply = new UdpSessionInfoReply();
  73. foreach (var item in result)
  74. {
  75. reply.UdpSessions.Add(new SessionInfo
  76. {
  77. LastActiveTime = item.ActiveTime.ToString("yyyy-MM-dd HH:mm:ss"),
  78. StartTime = item.StartTime.ToString("yyyy-MM-dd HH:mm:ss"),
  79. RemoteAddressIP = item.RemoteEndPoint.ToString(),
  80. TerminalPhoneNo = item.TerminalPhoneNo
  81. });
  82. }
  83. return Task.FromResult(reply);
  84. }
  85. public override async Task<UnificationSendReply> UnificationSend(UnificationSendRequest request, ServerCallContext context)
  86. {
  87. Auth(context);
  88. try
  89. {
  90. var flag = await jT808SessionManager.TrySendByTerminalPhoneNoAsync(request.TerminalPhoneNo, request.Data.ToByteArray());
  91. return new UnificationSendReply { Success = flag };
  92. }
  93. catch (Exception)
  94. {
  95. return new UnificationSendReply { Success = false };
  96. }
  97. }
  98. public override Task<TcpAtomicCounterReply> GetTcpAtomicCounter(Empty request, ServerCallContext context)
  99. {
  100. Auth(context);
  101. TcpAtomicCounterReply reply = new TcpAtomicCounterReply();
  102. reply.MsgFailCount=jT808TcpAtomicCounterService.MsgFailCount;
  103. reply.MsgSuccessCount=jT808TcpAtomicCounterService.MsgSuccessCount;
  104. return Task.FromResult(reply);
  105. }
  106. public override Task<UdpAtomicCounterReply> GetUdpAtomicCounter(Empty request, ServerCallContext context)
  107. {
  108. Auth(context);
  109. UdpAtomicCounterReply reply = new UdpAtomicCounterReply();
  110. reply.MsgFailCount = jT808UdpAtomicCounterService.MsgFailCount;
  111. reply.MsgSuccessCount = jT808UdpAtomicCounterService.MsgSuccessCount;
  112. return Task.FromResult(reply);
  113. }
  114. private void Auth(ServerCallContext context)
  115. {
  116. Entry tokenEntry = context.RequestHeaders.FirstOrDefault(w => w.Key == "token");
  117. if (tokenEntry != null)
  118. {
  119. if(tokenEntry.Value != ConfigurationOptionsMonitor.CurrentValue.WebApiToken)
  120. {
  121. throw new Grpc.Core.RpcException(new Status(StatusCode.Unauthenticated, "token error"));
  122. }
  123. }
  124. else
  125. {
  126. throw new Grpc.Core.RpcException(new Status(StatusCode.Unauthenticated,"token empty"));
  127. }
  128. }
  129. }
  130. }