Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

308 строки
11 KiB

  1. using JT808.Protocol;
  2. using JT808.Protocol.Enums;
  3. using JT808.Protocol.Extensions;
  4. using JT808.Protocol.MessageBody;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Text;
  8. namespace JT808.Gateway.Abstractions
  9. {
  10. public class JT808QueueReplyMessageHandler
  11. {
  12. protected Dictionary<ushort, MsgIdMethodDelegate> HandlerDict { get; }
  13. protected delegate byte[] MsgIdMethodDelegate(JT808HeaderPackage package);
  14. protected JT808Serializer JT808Serializer { get; }
  15. protected IJT808MsgReplyProducer JT808MsgReplyProducer { get; }
  16. public JT808QueueReplyMessageHandler(
  17. IJT808Config jT808Config,
  18. IJT808MsgReplyProducer jT808MsgReplyProducer)
  19. {
  20. this.JT808Serializer = jT808Config.GetSerializer();
  21. this.JT808MsgReplyProducer = jT808MsgReplyProducer;
  22. HandlerDict = new Dictionary<ushort, MsgIdMethodDelegate> {
  23. {JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001},
  24. {JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102},
  25. {JT808MsgId.终端心跳.ToUInt16Value(), Msg0x0002},
  26. {JT808MsgId.终端注销.ToUInt16Value(), Msg0x0003},
  27. {JT808MsgId.终端注册.ToUInt16Value(), Msg0x0100},
  28. {JT808MsgId.位置信息汇报.ToUInt16Value(),Msg0x0200 },
  29. {JT808MsgId.定位数据批量上传.ToUInt16Value(),Msg0x0704 },
  30. {JT808MsgId.数据上行透传.ToUInt16Value(),Msg0x0900 },
  31. {JT808MsgId.查询服务器时间请求.ToUInt16Value(),Msg0x0004 },
  32. {JT808MsgId.查询终端参数应答.ToUInt16Value(),Msg0x0104 },
  33. {JT808MsgId.查询终端属性应答.ToUInt16Value(),Msg0x0107 },
  34. {JT808MsgId.终端升级结果通知.ToUInt16Value(),Msg0x0108 },
  35. {JT808MsgId.位置信息查询应答.ToUInt16Value(),Msg0x0201 },
  36. {JT808MsgId.链路检测.ToUInt16Value(),Msg0x8204 },
  37. {JT808MsgId.车辆控制应答.ToUInt16Value(),Msg0x0500 },
  38. {JT808MsgId.摄像头立即拍摄命令.ToUInt16Value(),Msg0x8801 },
  39. {JT808MsgId.多媒体数据上传.ToUInt16Value(),Msg0x0801 },
  40. {JT808MsgId.多媒体事件信息上传.ToUInt16Value(),Msg0x0800 },
  41. {JT808MsgId.CAN总线数据上传.ToUInt16Value(),Msg0x0705 },
  42. };
  43. }
  44. public virtual void Processor((string TerminalNo, byte[] Data) parameter)
  45. {
  46. var request = JT808Serializer.HeaderDeserialize(parameter.Data);
  47. if (HandlerDict.TryGetValue(request.Header.MsgId, out var func))
  48. {
  49. var buffer = func(request);
  50. if (buffer != null)
  51. {
  52. JT808MsgReplyProducer.ProduceAsync(parameter.TerminalNo, buffer);
  53. }
  54. }
  55. }
  56. /// <summary>
  57. /// 终端通用应答
  58. /// 平台无需回复
  59. /// 实现自己的业务
  60. /// </summary>
  61. /// <param name="request"></param>
  62. /// <returns></returns>
  63. public virtual byte[] Msg0x0001(JT808HeaderPackage request)
  64. {
  65. return default;
  66. }
  67. /// <summary>
  68. /// 平台通用应答
  69. /// </summary>
  70. /// <param name="request"></param>
  71. /// <param name="session"></param>
  72. public virtual byte[] CommonReply(JT808HeaderPackage request)
  73. {
  74. if (request.Version == JT808Version.JTT2019)
  75. {
  76. byte[] data = JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001()
  77. {
  78. AckMsgId = request.Header.MsgId,
  79. JT808PlatformResult = JT808PlatformResult.成功,
  80. MsgNum = request.Header.MsgNum
  81. }));
  82. return data;
  83. }
  84. else
  85. {
  86. byte[] data = JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
  87. {
  88. AckMsgId = request.Header.MsgId,
  89. JT808PlatformResult = JT808PlatformResult.成功,
  90. MsgNum = request.Header.MsgNum
  91. }));
  92. return data;
  93. }
  94. }
  95. /// <summary>
  96. /// 终端心跳
  97. /// </summary>
  98. /// <param name="request"></param>
  99. /// <returns></returns>
  100. public virtual byte[] Msg0x0002(JT808HeaderPackage request)
  101. {
  102. return CommonReply(request);
  103. }
  104. /// <summary>
  105. /// 查询服务器时间
  106. /// 2019版本
  107. /// </summary>
  108. /// <param name="request"></param>
  109. /// <returns></returns>
  110. public virtual byte[] Msg0x0004(JT808HeaderPackage request)
  111. {
  112. byte[] data = JT808Serializer.Serialize(JT808MsgId.查询服务器时间应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8004()
  113. {
  114. Time = DateTime.Now
  115. }));
  116. return data;
  117. }
  118. /// <summary>
  119. /// 服务器补传分包请求
  120. /// </summary>
  121. /// <param name="request"></param>
  122. /// <param name="session"></param>
  123. /// <returns></returns>
  124. public virtual byte[] Msg0x8003(JT808HeaderPackage request)
  125. {
  126. throw new NotImplementedException("0x8003-服务器补传分包请求");
  127. }
  128. /// <summary>
  129. /// 终端补传分包请求
  130. /// </summary>
  131. /// <param name="request"></param>
  132. /// <returns></returns>
  133. public virtual byte[] Msg0x0005(JT808HeaderPackage request)
  134. {
  135. throw new NotImplementedException("0x0005-终端补传分包请求");
  136. }
  137. /// <summary>
  138. /// 终端注册
  139. /// </summary>
  140. /// <param name="request"></param>
  141. /// <returns></returns>
  142. public virtual byte[] Msg0x0100(JT808HeaderPackage request)
  143. {
  144. if (request.Version == JT808Version.JTT2019)
  145. {
  146. byte[] data = JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create_终端注册应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8100()
  147. {
  148. Code = "J" + request.Header.TerminalPhoneNo,
  149. JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功,
  150. AckMsgNum = request.Header.MsgNum
  151. }));
  152. return data;
  153. }
  154. else
  155. {
  156. byte[] data = JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8100()
  157. {
  158. Code = "J" + request.Header.TerminalPhoneNo,
  159. JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功,
  160. AckMsgNum = request.Header.MsgNum
  161. }));
  162. return data;
  163. }
  164. }
  165. /// <summary>
  166. /// 终端注销
  167. /// </summary>
  168. /// <param name="request"></param>
  169. /// <returns></returns>
  170. public virtual byte[] Msg0x0003(JT808HeaderPackage request)
  171. {
  172. return CommonReply(request);
  173. }
  174. /// <summary>
  175. /// 终端鉴权
  176. /// </summary>
  177. /// <param name="request"></param>
  178. /// <returns></returns>
  179. public virtual byte[] Msg0x0102(JT808HeaderPackage request)
  180. {
  181. return CommonReply(request);
  182. }
  183. /// <summary>
  184. /// 查询终端参数应答
  185. /// </summary>
  186. /// <param name="request"></param>
  187. /// <returns></returns>
  188. public virtual byte[] Msg0x0104(JT808HeaderPackage request)
  189. {
  190. return CommonReply(request);
  191. }
  192. /// <summary>
  193. /// 查询终端属性应答
  194. /// </summary>
  195. /// <param name="request"></param>
  196. /// <returns></returns>
  197. public virtual byte[] Msg0x0107(JT808HeaderPackage request)
  198. {
  199. return CommonReply(request);
  200. }
  201. /// <summary>
  202. /// 终端升级结果应答
  203. /// </summary>
  204. /// <param name="request"></param>
  205. /// <returns></returns>
  206. public virtual byte[] Msg0x0108(JT808HeaderPackage request)
  207. {
  208. return CommonReply(request);
  209. }
  210. /// <summary>
  211. /// 位置信息汇报
  212. /// </summary>
  213. /// <param name="request"></param>
  214. /// <param name="session"></param>
  215. /// <returns></returns>
  216. public virtual byte[] Msg0x0200(JT808HeaderPackage request)
  217. {
  218. return CommonReply(request);
  219. }
  220. /// <summary>
  221. /// 位置信息查询应答
  222. /// </summary>
  223. /// <param name="request"></param>
  224. /// <returns></returns>
  225. public virtual byte[] Msg0x0201(JT808HeaderPackage request)
  226. {
  227. return CommonReply(request);
  228. }
  229. /// <summary>
  230. /// 链路检测
  231. /// 2019版本
  232. /// </summary>
  233. /// <param name="request"></param>
  234. /// <returns></returns>
  235. public virtual byte[] Msg0x8204(JT808HeaderPackage request)
  236. {
  237. return default;
  238. }
  239. /// <summary>
  240. /// 车辆控制应答
  241. /// </summary>
  242. /// <param name="request"></param>
  243. /// <returns></returns>
  244. public virtual byte[] Msg0x0500(JT808HeaderPackage request)
  245. {
  246. return CommonReply(request);
  247. }
  248. /// <summary>
  249. /// 定位数据批量上传
  250. /// </summary>
  251. /// <param name="request"></param>
  252. /// <returns></returns>
  253. public virtual byte[] Msg0x0704(JT808HeaderPackage request)
  254. {
  255. return CommonReply(request);
  256. }
  257. /// <summary>
  258. /// CAN总线数据上传
  259. /// </summary>
  260. /// <param name="request"></param>
  261. /// <returns></returns>
  262. public virtual byte[] Msg0x0705(JT808HeaderPackage request)
  263. {
  264. return CommonReply(request);
  265. }
  266. /// <summary>
  267. /// 多媒体事件信息上传
  268. /// </summary>
  269. /// <param name="request"></param>
  270. /// <returns></returns>
  271. public virtual byte[] Msg0x0800(JT808HeaderPackage request)
  272. {
  273. return CommonReply(request);
  274. }
  275. /// <summary>
  276. /// 多媒体数据上传
  277. /// </summary>
  278. /// <param name="request"></param>
  279. /// <returns></returns>
  280. public virtual byte[] Msg0x0801(JT808HeaderPackage request)
  281. {
  282. throw new NotImplementedException("0x8800多媒体数据上传应答");
  283. }
  284. /// <summary>
  285. /// 摄像头立即拍摄命令
  286. /// </summary>
  287. /// <param name="request"></param>
  288. /// <returns></returns>
  289. public virtual byte[] Msg0x8801(JT808HeaderPackage request)
  290. {
  291. throw new NotImplementedException("0x0805摄像头立即拍摄命令应答");
  292. }
  293. /// <summary>
  294. /// 数据上行透传
  295. /// </summary>
  296. /// <param name="request"></param>
  297. /// <returns></returns>
  298. public virtual byte[] Msg0x0900(JT808HeaderPackage request)
  299. {
  300. return CommonReply(request);
  301. }
  302. }
  303. }