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.

253 lines
10 KiB

  1. using JT808.Protocol.Formatters;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.MessagePack;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.Extensions.JT1078.MessageBody
  9. {
  10. /// <summary>
  11. /// 平台下发远程录像回放请求
  12. /// </summary>
  13. public class JT808_0x9201 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9201>, IJT808Analyze
  14. {
  15. public override string Description => "平台下发远程录像回放请求";
  16. public override ushort MsgId => 0x9201;
  17. /// <summary>
  18. /// 服务器IP地址长度
  19. /// </summary>
  20. public byte ServerIpLength { get; set; }
  21. /// <summary>
  22. /// 服务器IP地址
  23. /// </summary>
  24. public string ServerIp { get; set; }
  25. /// <summary>
  26. /// 服务器音视频通道监听端口号TCP
  27. /// </summary>
  28. public ushort TcpPort { get; set; }
  29. /// <summary>
  30. /// 服务器音视频通道监听端口号UDP
  31. /// </summary>
  32. public ushort UdpPort { get; set; }
  33. /// <summary>
  34. /// 逻辑通道号
  35. /// </summary>
  36. public byte LogicChannelNo { get; set; }
  37. /// <summary>
  38. /// 音视频类型
  39. /// </summary>
  40. public byte AVItemType { get; set; }
  41. /// <summary>
  42. /// 码流类型
  43. /// </summary>
  44. public byte StreamType { get; set; }
  45. /// <summary>
  46. /// 存储器类型
  47. /// </summary>
  48. public byte MemType { get; set; }
  49. /// <summary>
  50. /// 回放方式
  51. /// </summary>
  52. public byte PlayBackWay { get; set; }
  53. /// <summary>
  54. /// 快进或快退倍数
  55. /// </summary>
  56. public byte FastForwardOrFastRewindMultiples { get; set; }
  57. /// <summary>
  58. /// 起始时间
  59. /// </summary>
  60. public DateTime BeginTime { get; set; }
  61. /// <summary>
  62. /// 结束时间
  63. /// </summary>
  64. public DateTime EndTime { get; set; }
  65. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  66. {
  67. JT808_0x9201 value = new JT808_0x9201();
  68. value.ServerIpLength = reader.ReadByte();
  69. writer.WriteNumber($"[{value.ServerIpLength.ReadNumber()}]服务器IP地址长度", value.ServerIpLength);
  70. string ipHex = reader.ReadVirtualArray(value.ServerIpLength).ToArray().ToHexString();
  71. value.ServerIp = reader.ReadString(value.ServerIpLength);
  72. writer.WriteString($"[{ipHex}]服务器IP地址", value.ServerIp);
  73. value.TcpPort = reader.ReadUInt16();
  74. writer.WriteNumber($"[{value.TcpPort.ReadNumber()}]服务器视频通道监听端口号(TCP)", value.TcpPort);
  75. value.UdpPort = reader.ReadUInt16();
  76. writer.WriteNumber($"[{value.UdpPort.ReadNumber()}]服务器视频通道监听端口号(UDP)", value.UdpPort);
  77. value.LogicChannelNo = reader.ReadByte();
  78. writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo));
  79. value.AVItemType = reader.ReadByte();
  80. writer.WriteString($"[{value.AVItemType.ReadNumber()}]音视频类型", AVItemTypeDisplay(value.AVItemType));
  81. value.StreamType = reader.ReadByte();
  82. writer.WriteString($"[{value.StreamType.ReadNumber()}]码流类型", StreamTypeDisplay(value.StreamType));
  83. value.MemType = reader.ReadByte();
  84. writer.WriteString($"[{value.MemType.ReadNumber()}]存储器类型", MemTypeDisplay(value.MemType));
  85. value.PlayBackWay = reader.ReadByte();
  86. writer.WriteString($"[{value.PlayBackWay.ReadNumber()}]回访方式", PlayBackWayDisplay(value.PlayBackWay));
  87. value.FastForwardOrFastRewindMultiples = reader.ReadByte();
  88. writer.WriteString($"[{value.FastForwardOrFastRewindMultiples.ReadNumber()}]快进或快退倍数", FastForwardOrFastRewindMultiplesDisplay(value.FastForwardOrFastRewindMultiples));
  89. value.BeginTime = reader.ReadDateTime6();
  90. writer.WriteString($"[{value.BeginTime.ToString("yyMMddHHmmss")}]起始时间", value.BeginTime.ToString("yyyy-MM-dd HH:mm:ss"));
  91. value.EndTime = reader.ReadDateTime6();
  92. writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss"));
  93. string AVItemTypeDisplay(byte AVItemType)
  94. {
  95. switch (AVItemType)
  96. {
  97. case 0:
  98. return "音视频";
  99. case 1:
  100. return "音频";
  101. case 2:
  102. return "视频";
  103. case 3:
  104. return "音频或视频";
  105. default:
  106. return "未知";
  107. }
  108. }
  109. string StreamTypeDisplay(byte StreamType)
  110. {
  111. switch (StreamType)
  112. {
  113. case 0:
  114. return "主码流或子码流";
  115. case 1:
  116. return "主码流";
  117. case 2:
  118. return "子码流";
  119. default:
  120. return "未知";
  121. }
  122. }
  123. string MemTypeDisplay(byte MemType)
  124. {
  125. switch (MemType)
  126. {
  127. case 0:
  128. return "主存储器或灾备服务器";
  129. case 1:
  130. return "主存储器";
  131. case 2:
  132. return "灾备服务器";
  133. default:
  134. return "未知";
  135. }
  136. }
  137. string PlayBackWayDisplay(byte PlayBackWay)
  138. {
  139. switch (PlayBackWay)
  140. {
  141. case 0:
  142. return "正常回放";
  143. case 1:
  144. return "快进回放";
  145. case 2:
  146. return "关键帧快退回访";
  147. case 3:
  148. return "关键帧播放";
  149. case 4:
  150. return "单帧上传";
  151. default:
  152. return "未知";
  153. }
  154. }
  155. string FastForwardOrFastRewindMultiplesDisplay(byte FastForwardOrFastRewindMultiples)
  156. {
  157. switch (FastForwardOrFastRewindMultiples)
  158. {
  159. case 0:
  160. return "无效";
  161. case 1:
  162. return "1倍";
  163. case 2:
  164. return "2倍";
  165. case 3:
  166. return "4倍";
  167. case 4:
  168. return "8倍";
  169. case 5:
  170. return "16倍";
  171. default:
  172. return "未知";
  173. }
  174. }
  175. string LogicalChannelNoDisplay(byte LogicalChannelNo)
  176. {
  177. switch (LogicalChannelNo)
  178. {
  179. case 1:
  180. return "驾驶员";
  181. case 2:
  182. return "车辆正前方";
  183. case 3:
  184. return "车前门";
  185. case 4:
  186. return "车厢前部";
  187. case 5:
  188. return "车厢后部";
  189. case 7:
  190. return "行李舱";
  191. case 8:
  192. return "车辆左侧";
  193. case 9:
  194. return "车辆右侧";
  195. case 10:
  196. return "车辆正后方";
  197. case 11:
  198. return "车厢中部";
  199. case 12:
  200. return "车中门";
  201. case 13:
  202. return "驾驶席车门";
  203. case 33:
  204. return "驾驶员";
  205. case 36:
  206. return "车厢前部";
  207. case 37:
  208. return "车厢后部";
  209. default:
  210. return "预留";
  211. }
  212. }
  213. }
  214. public JT808_0x9201 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  215. {
  216. JT808_0x9201 jT808_0x9201 = new JT808_0x9201();
  217. jT808_0x9201.ServerIpLength = reader.ReadByte();
  218. jT808_0x9201.ServerIp = reader.ReadString(jT808_0x9201.ServerIpLength);
  219. jT808_0x9201.TcpPort = reader.ReadUInt16();
  220. jT808_0x9201.UdpPort = reader.ReadUInt16();
  221. jT808_0x9201.LogicChannelNo = reader.ReadByte();
  222. jT808_0x9201.AVItemType = reader.ReadByte();
  223. jT808_0x9201.StreamType = reader.ReadByte();
  224. jT808_0x9201.MemType = reader.ReadByte();
  225. jT808_0x9201.PlayBackWay = reader.ReadByte();
  226. jT808_0x9201.FastForwardOrFastRewindMultiples = reader.ReadByte();
  227. jT808_0x9201.BeginTime = reader.ReadDateTime6();
  228. jT808_0x9201.EndTime = reader.ReadDateTime6();
  229. return jT808_0x9201;
  230. }
  231. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9201 value, IJT808Config config)
  232. {
  233. writer.Skip(1, out int position);
  234. writer.WriteString(value.ServerIp);
  235. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - position - 1), position);//计算完字符串后,回写字符串长度
  236. writer.WriteUInt16(value.TcpPort);
  237. writer.WriteUInt16(value.UdpPort);
  238. writer.WriteByte(value.LogicChannelNo);
  239. writer.WriteByte(value.AVItemType);
  240. writer.WriteByte(value.StreamType);
  241. writer.WriteByte(value.MemType);
  242. writer.WriteByte(value.PlayBackWay);
  243. writer.WriteByte(value.FastForwardOrFastRewindMultiples);
  244. writer.WriteDateTime6(value.BeginTime);
  245. writer.WriteDateTime6(value.EndTime);
  246. }
  247. }
  248. }