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.
 
 
 

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