25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

94 satır
3.7 KiB

  1. using JT808.Gateway.Client;
  2. using JT808.Protocol;
  3. using JT808.Protocol.Enums;
  4. using JT808.Protocol.Extensions;
  5. using JT808.Protocol.MessageBody;
  6. using Microsoft.Extensions.Hosting;
  7. using Microsoft.Extensions.Logging;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. namespace JT808.Gateway.NBIotSimpleClient.Services
  15. {
  16. /// <summary>
  17. /// 处理平台下发的数据包
  18. /// </summary>
  19. public class ProccessPackageService : IHostedService
  20. {
  21. ReceviePackageService ReceviePackageService;
  22. IJT808TcpClientFactory TcpClientFactory;
  23. JT808Serializer Serializer;
  24. DeviceInfoService DeviceInfoService;
  25. ILogger Logger;
  26. public ProccessPackageService(
  27. ILoggerFactory loggerFactory,
  28. IJT808Config jT808Config,
  29. IJT808TcpClientFactory tcpClientFactory,
  30. DeviceInfoService deviceInfoService,
  31. ReceviePackageService receviePackageService)
  32. {
  33. ReceviePackageService = receviePackageService;
  34. TcpClientFactory = tcpClientFactory;
  35. Serializer = jT808Config.GetSerializer();
  36. DeviceInfoService = deviceInfoService;
  37. Logger = loggerFactory.CreateLogger<ProccessPackageService>();
  38. }
  39. public Task StartAsync(CancellationToken cancellationToken)
  40. {
  41. Task.Run(() =>
  42. {
  43. try
  44. {
  45. foreach(var package in ReceviePackageService.BlockingCollection.GetConsumingEnumerable(cancellationToken))
  46. {
  47. if(package.Header.MsgId == JT808MsgId._0x8100.ToUInt16Value())
  48. {
  49. if (package.Bodies is JT808_0x8100 body)
  50. {
  51. DeviceInfoService.DeviceInfos.TryAdd(package.Header.TerminalPhoneNo, new Metadata.DeviceInfo {
  52. TerminalPhoneNo = package.Header.TerminalPhoneNo,
  53. Code = body.Code
  54. });
  55. Logger.LogInformation($"{package.Header.TerminalPhoneNo}-{body.Code}-success");
  56. }
  57. }
  58. else if (package.Header.MsgId == JT808MsgId._0x8001.ToValue())
  59. {
  60. if(package.Bodies is JT808_0x8001 body)
  61. {
  62. if(body.AckMsgId== JT808MsgId._0x0102.ToUInt16Value())
  63. {
  64. if(body.JT808PlatformResult== JT808PlatformResult.succeed)
  65. {
  66. if (DeviceInfoService.DeviceInfos.TryGetValue(package.Header.TerminalPhoneNo, out var deviceInfo))
  67. {
  68. deviceInfo.Successed = true;
  69. DeviceInfoService.DeviceInfos.TryUpdate(package.Header.TerminalPhoneNo, deviceInfo, deviceInfo);
  70. }
  71. }
  72. Logger.LogInformation($"{package.Header.TerminalPhoneNo}-{body.JT808PlatformResult.ToString()}");
  73. }
  74. }
  75. }
  76. }
  77. }
  78. catch (Exception ex)
  79. {
  80. }
  81. });
  82. return Task.CompletedTask;
  83. }
  84. public Task StopAsync(CancellationToken cancellationToken)
  85. {
  86. return Task.CompletedTask;
  87. }
  88. }
  89. }