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.
 
 
 

194 rivejä
6.9 KiB

  1. using JT808.Gateway;
  2. using JT808.Gateway.PubSub;
  3. using JT808.Gateway.Services;
  4. using JT808.Protocol;
  5. using JT808.Protocol.Enums;
  6. using JT808.Protocol.Extensions;
  7. using JT808.Protocol.MessageBody;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Text;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. namespace JT808.Gateway.Impls
  14. {
  15. internal class JT808MsgReplyConsumerDefaultImpl : IJT808MsgReplyConsumer
  16. {
  17. private readonly JT808MsgService JT808MsgService;
  18. private readonly JT808Serializer JT808Serializer;
  19. private Dictionary<ushort, Func<JT808HeaderPackage, byte[]>> HandlerDict;
  20. public JT808MsgReplyConsumerDefaultImpl(
  21. IJT808Config jT808Config,
  22. JT808MsgService jT808MsgService)
  23. {
  24. JT808MsgService = jT808MsgService;
  25. this.JT808Serializer = jT808Config.GetSerializer();
  26. HandlerDict = new Dictionary<ushort, Func<JT808HeaderPackage, byte[]>> {
  27. {JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001},
  28. {JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102},
  29. {JT808MsgId.终端心跳.ToUInt16Value(), Msg0x0002},
  30. {JT808MsgId.终端注销.ToUInt16Value(), Msg0x0003},
  31. {JT808MsgId.终端注册.ToUInt16Value(), Msg0x0100},
  32. {JT808MsgId.位置信息汇报.ToUInt16Value(),Msg0x0200 },
  33. {JT808MsgId.定位数据批量上传.ToUInt16Value(),Msg0x0704 },
  34. {JT808MsgId.数据上行透传.ToUInt16Value(),Msg0x0900 }
  35. };
  36. }
  37. public CancellationTokenSource Cts =>new CancellationTokenSource();
  38. public string TopicName => JT808GatewayConstants.MsgReplyTopic;
  39. public void Dispose()
  40. {
  41. Cts.Dispose();
  42. }
  43. public void OnMessage(Action<(string TerminalNo, byte[] Data)> callback)
  44. {
  45. Task.Run(() =>
  46. {
  47. foreach(var item in JT808MsgService.MsgQueue.GetConsumingEnumerable())
  48. {
  49. try
  50. {
  51. var package = JT808Serializer.HeaderDeserialize(item.Data);
  52. if (HandlerDict.TryGetValue(package.Header.MsgId, out var func))
  53. {
  54. var buffer = func(package);
  55. if (buffer != null)
  56. {
  57. callback((item.TerminalNo, buffer));
  58. }
  59. }
  60. }
  61. catch (Exception ex)
  62. {
  63. }
  64. }
  65. }, Cts.Token);
  66. }
  67. public void Subscribe()
  68. {
  69. }
  70. public void Unsubscribe()
  71. {
  72. Cts.Cancel();
  73. }
  74. /// <summary>
  75. /// 终端通用应答
  76. /// 平台无需回复
  77. /// 实现自己的业务
  78. /// </summary>
  79. /// <param name="request"></param>
  80. /// <returns></returns>
  81. public byte[] Msg0x0001(JT808HeaderPackage request)
  82. {
  83. return null;
  84. }
  85. /// <summary>
  86. /// 终端心跳
  87. /// </summary>
  88. /// <param name="request"></param>
  89. /// <returns></returns>
  90. public byte[] Msg0x0002(JT808HeaderPackage request)
  91. {
  92. return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
  93. {
  94. MsgId = request.Header.MsgId,
  95. JT808PlatformResult = JT808PlatformResult.成功,
  96. MsgNum = request.Header.MsgNum
  97. }));
  98. }
  99. /// <summary>
  100. /// 终端注销
  101. /// </summary>
  102. /// <param name="request"></param>
  103. /// <returns></returns>
  104. public byte[] Msg0x0003(JT808HeaderPackage request)
  105. {
  106. return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
  107. {
  108. MsgId = request.Header.MsgId,
  109. JT808PlatformResult = JT808PlatformResult.成功,
  110. MsgNum = request.Header.MsgNum
  111. }));
  112. }
  113. /// <summary>
  114. /// 终端注册
  115. /// </summary>
  116. /// <param name="request"></param>
  117. /// <returns></returns>
  118. public byte[] Msg0x0100(JT808HeaderPackage request)
  119. {
  120. return JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8100()
  121. {
  122. Code = "J" + request.Header.TerminalPhoneNo,
  123. JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功,
  124. MsgNum = request.Header.MsgNum
  125. }));
  126. }
  127. /// <summary>
  128. /// 终端鉴权
  129. /// </summary>
  130. /// <param name="request"></param>
  131. /// <returns></returns>
  132. public byte[] Msg0x0102(JT808HeaderPackage request)
  133. {
  134. return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
  135. {
  136. MsgId = request.Header.MsgId,
  137. JT808PlatformResult = JT808PlatformResult.成功,
  138. MsgNum = request.Header.MsgNum
  139. }));
  140. }
  141. /// <summary>
  142. /// 位置信息汇报
  143. /// </summary>
  144. /// <param name="request"></param>
  145. /// <returns></returns>
  146. public byte[] Msg0x0200(JT808HeaderPackage request)
  147. {
  148. return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
  149. {
  150. MsgId = request.Header.MsgId,
  151. JT808PlatformResult = JT808PlatformResult.成功,
  152. MsgNum = request.Header.MsgNum
  153. }));
  154. }
  155. /// <summary>
  156. /// 定位数据批量上传
  157. /// </summary>
  158. /// <param name="request"></param>
  159. /// <returns></returns>
  160. public byte[] Msg0x0704(JT808HeaderPackage request)
  161. {
  162. return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
  163. {
  164. MsgId = request.Header.MsgId,
  165. JT808PlatformResult = JT808PlatformResult.成功,
  166. MsgNum = request.Header.MsgNum
  167. }));
  168. }
  169. /// <summary>
  170. /// 数据上行透传
  171. /// </summary>
  172. /// <param name="request"></param>
  173. /// <returns></returns>
  174. public byte[] Msg0x0900(JT808HeaderPackage request)
  175. {
  176. return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
  177. {
  178. MsgId = request.Header.MsgId,
  179. JT808PlatformResult = JT808PlatformResult.成功,
  180. MsgNum = request.Header.MsgNum
  181. }));
  182. }
  183. }
  184. }