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.

293 lines
12 KiB

  1. using JT808.Protocol.Extensions;
  2. using JT808.Protocol.Formatters;
  3. using JT808.Protocol.Interfaces;
  4. using JT808.Protocol.MessagePack;
  5. using System.Collections.Generic;
  6. using System.Text.Json;
  7. namespace JT808.Protocol.MessageBody
  8. {
  9. /// <summary>
  10. /// 查询区域或线路数据应答
  11. /// </summary>
  12. public class JT808_0x0608 : JT808MessagePackFormatter<JT808_0x0608>, JT808Bodies, IJT808Analyze, IJT808_2019_Version
  13. {
  14. /// <summary>
  15. /// 0x0608
  16. /// </summary>
  17. public ushort MsgId => 0x0608;
  18. /// <summary>
  19. ///
  20. /// </summary>
  21. public bool SkipSerialization => false;
  22. /// <summary>
  23. /// 查询区域或线路数据应答
  24. /// </summary>
  25. public string Description => "查询区域或线路数据应答";
  26. /// <summary>
  27. /// 查询类型
  28. /// </summary>
  29. public byte QueryType { get; set; }
  30. /// <summary>
  31. /// 查询的区域或线路的ID数量
  32. /// </summary>
  33. public uint Count { get; set; }
  34. /// <summary>
  35. /// 查询的区域或线路的ID
  36. /// </summary>
  37. public List<uint> Ids { get; set; }
  38. /// <summary>
  39. /// 设置圆形区域
  40. /// 查询类型为1
  41. /// </summary>
  42. public List<JT808_0x8600> JT808_0x8600s { get; set; }
  43. /// <summary>
  44. /// 设置矩形区域
  45. /// 查询类型为2
  46. /// </summary>
  47. public List<JT808_0x8602> JT808_0x8602s { get; set; }
  48. /// <summary>
  49. /// 设置多边形区域
  50. /// 查询类型为3
  51. /// </summary>
  52. public List<JT808_0x8604> JT808_0x8604s { get; set; }
  53. /// <summary>
  54. /// 设置路线
  55. /// 查询类型为4
  56. /// </summary>
  57. public List<JT808_0x8606> JT808_0x8606s { get; set; }
  58. /// <summary>
  59. ///
  60. /// </summary>
  61. /// <param name="reader"></param>
  62. /// <param name="writer"></param>
  63. /// <param name="config"></param>
  64. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  65. {
  66. JT808_0x0608 value = new JT808_0x0608();
  67. value.QueryType = reader.ReadByte();
  68. writer.WriteNumber($"[{value.QueryType.ReadNumber()}]查询类型", value.QueryType);
  69. value.Count = reader.ReadUInt32();
  70. writer.WriteNumber($"[{value.Count.ReadNumber()}]查询的区域或线路的ID数量", value.Count);
  71. if (value.Count > 0)
  72. {
  73. switch (value.QueryType)
  74. {
  75. case 1:
  76. writer.WriteStartArray("设置圆形区域");
  77. for (int i = 0; i < value.Count; i++)
  78. {
  79. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8600).GUID, out IJT808MessagePackFormatter instance))
  80. {
  81. writer.WriteStartObject();
  82. instance.Analyze(ref reader, writer, config);
  83. writer.WriteEndObject();
  84. }
  85. }
  86. writer.WriteEndArray();
  87. break;
  88. case 2:
  89. writer.WriteStartArray("设置矩形区域");
  90. for (int i = 0; i < value.Count; i++)
  91. {
  92. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8602).GUID, out IJT808MessagePackFormatter instance))
  93. {
  94. writer.WriteStartObject();
  95. instance.Analyze(ref reader, writer, config);
  96. writer.WriteEndObject();
  97. }
  98. }
  99. writer.WriteEndArray();
  100. break;
  101. case 3:
  102. writer.WriteStartArray("设置多边形区域");
  103. for (int i = 0; i < value.Count; i++)
  104. {
  105. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8604).GUID, out IJT808MessagePackFormatter instance))
  106. {
  107. writer.WriteStartObject();
  108. instance.Analyze(ref reader, writer, config);
  109. writer.WriteEndObject();
  110. }
  111. }
  112. writer.WriteEndArray();
  113. break;
  114. case 4:
  115. writer.WriteStartArray("设置路线");
  116. for (int i = 0; i < value.Count; i++)
  117. {
  118. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8606).GUID, out IJT808MessagePackFormatter instance))
  119. {
  120. writer.WriteStartObject();
  121. instance.Analyze(ref reader, writer, config);
  122. writer.WriteEndObject();
  123. }
  124. }
  125. writer.WriteEndArray();
  126. break;
  127. default:
  128. writer.WriteStartArray("线路Id集合");
  129. for (int i = 0; i < value.Count; i++)
  130. {
  131. writer.WriteStartObject();
  132. var routeId = reader.ReadUInt32();
  133. writer.WriteNumber($"[{routeId.ReadNumber()}]Id{i+1}", routeId);
  134. writer.WriteEndObject();
  135. }
  136. writer.WriteEndArray();
  137. break;
  138. }
  139. }
  140. }
  141. /// <summary>
  142. ///
  143. /// </summary>
  144. /// <param name="reader"></param>
  145. /// <param name="config"></param>
  146. /// <returns></returns>
  147. public override JT808_0x0608 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  148. {
  149. JT808_0x0608 value = new JT808_0x0608();
  150. value.QueryType = reader.ReadByte();
  151. value.Count = reader.ReadUInt32();
  152. if (value.Count > 0)
  153. {
  154. switch (value.QueryType)
  155. {
  156. case 1:
  157. value.JT808_0x8600s = new List<JT808_0x8600>();
  158. for (int i = 0; i < value.Count; i++)
  159. {
  160. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8600).GUID, out IJT808MessagePackFormatter instance))
  161. {
  162. object attachImpl = instance.Deserialize(ref reader, config);
  163. if (attachImpl != null)
  164. {
  165. value.JT808_0x8600s.Add((JT808_0x8600)attachImpl);
  166. }
  167. }
  168. }
  169. break;
  170. case 2:
  171. value.JT808_0x8602s = new List<JT808_0x8602>();
  172. for (int i = 0; i < value.Count; i++)
  173. {
  174. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8602).GUID, out IJT808MessagePackFormatter instance))
  175. {
  176. object attachImpl = instance.Deserialize(ref reader, config);
  177. if (attachImpl != null)
  178. {
  179. value.JT808_0x8602s.Add((JT808_0x8602)attachImpl);
  180. }
  181. }
  182. }
  183. break;
  184. case 3:
  185. value.JT808_0x8604s = new List<JT808_0x8604>();
  186. for (int i = 0; i < value.Count; i++)
  187. {
  188. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8604).GUID, out IJT808MessagePackFormatter instance))
  189. {
  190. object attachImpl = instance.Deserialize(ref reader, config);
  191. if (attachImpl != null)
  192. {
  193. value.JT808_0x8604s.Add((JT808_0x8604)attachImpl);
  194. }
  195. }
  196. }
  197. break;
  198. case 4:
  199. value.JT808_0x8606s = new List<JT808_0x8606>();
  200. for (int i = 0; i < value.Count; i++)
  201. {
  202. if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8606).GUID, out IJT808MessagePackFormatter instance))
  203. {
  204. object attachImpl = instance.Deserialize(ref reader, config);
  205. if (attachImpl != null)
  206. {
  207. value.JT808_0x8606s.Add((JT808_0x8606)attachImpl);
  208. }
  209. }
  210. }
  211. break;
  212. default:
  213. value.Ids = new List<uint>();
  214. for (int i = 0; i < value.Count; i++)
  215. {
  216. value.Ids.Add(reader.ReadUInt32());
  217. }
  218. break;
  219. }
  220. }
  221. return value;
  222. }
  223. /// <summary>
  224. ///
  225. /// </summary>
  226. /// <param name="writer"></param>
  227. /// <param name="value"></param>
  228. /// <param name="config"></param>
  229. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x0608 value, IJT808Config config)
  230. {
  231. writer.WriteByte(value.QueryType);
  232. switch (value.QueryType)
  233. {
  234. case 1:
  235. if (value.JT808_0x8600s != null && value.JT808_0x8600s.Count > 0)
  236. {
  237. writer.WriteUInt32((uint)value.JT808_0x8600s.Count);
  238. foreach (var item in value.JT808_0x8600s)
  239. {
  240. item.SerializeExt(ref writer, item, config);
  241. }
  242. }
  243. break;
  244. case 2:
  245. if (value.JT808_0x8602s != null && value.JT808_0x8602s.Count > 0)
  246. {
  247. writer.WriteUInt32((uint)value.JT808_0x8602s.Count);
  248. foreach (var item in value.JT808_0x8602s)
  249. {
  250. item.SerializeExt(ref writer, item, config);
  251. }
  252. }
  253. break;
  254. case 3:
  255. if (value.JT808_0x8604s != null && value.JT808_0x8604s.Count > 0)
  256. {
  257. writer.WriteUInt32((uint)value.JT808_0x8604s.Count);
  258. foreach (var item in value.JT808_0x8604s)
  259. {
  260. item.SerializeExt(ref writer, item, config);
  261. }
  262. }
  263. break;
  264. case 4:
  265. if(value.JT808_0x8606s != null && value.JT808_0x8606s.Count > 0)
  266. {
  267. writer.WriteUInt32((uint)value.JT808_0x8606s.Count);
  268. foreach (var item in value.JT808_0x8606s)
  269. {
  270. item.SerializeExt(ref writer, item, config);
  271. }
  272. }
  273. break;
  274. default:
  275. if (value.Ids != null && value.Ids.Count > 0)
  276. {
  277. writer.WriteUInt32((uint)value.Ids.Count);
  278. foreach (var item in value.Ids)
  279. {
  280. writer.WriteUInt32(item);
  281. }
  282. }
  283. else
  284. {
  285. writer.WriteUInt32(0);
  286. }
  287. break;
  288. }
  289. }
  290. }
  291. }