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.

267 lines
12 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_0x9206 : JT808MessagePackFormatter<JT808_0x9206>, JT808Bodies, IJT808Analyze
  14. {
  15. /// <summary>
  16. /// 文件上传指令
  17. /// </summary>
  18. public string Description => "文件上传指令";
  19. /// <summary>
  20. ///
  21. /// </summary>
  22. public bool SkipSerialization => false;
  23. /// <summary>
  24. /// 0x9206
  25. /// </summary>
  26. public ushort MsgId => 0x9206;
  27. /// <summary>
  28. /// 服务器IP地址服务
  29. /// </summary>
  30. public byte ServerIpLength { get; set; }
  31. /// <summary>
  32. /// 服务器IP地址
  33. /// </summary>
  34. public string ServerIp { get; set; }
  35. /// <summary>
  36. /// 服务器端口
  37. /// </summary>
  38. public ushort Port { get; set; }
  39. /// <summary>
  40. /// 用户名长度
  41. /// </summary>
  42. public byte UserNameLength { get; set; }
  43. /// <summary>
  44. /// 用户名
  45. /// </summary>
  46. public string UserName { get; set; }
  47. /// <summary>
  48. /// 密码长度
  49. /// </summary>
  50. public byte PasswordLength { get; set; }
  51. /// <summary>
  52. /// 密码
  53. /// </summary>
  54. public string Password { get; set; }
  55. /// <summary>
  56. /// 文件上传路径长度
  57. /// </summary>
  58. public byte FileUploadPathLength { get; set; }
  59. /// <summary>
  60. /// 文件上传路径
  61. /// </summary>
  62. public string FileUploadPath { get; set; }
  63. /// <summary>
  64. /// 逻辑通道号
  65. /// </summary>
  66. public byte ChannelNo { get; set; }
  67. /// <summary>
  68. /// 起始时间 BCD[6]
  69. /// </summary>
  70. public DateTime BeginTime { get; set; }
  71. /// <summary>
  72. /// 结束时间 BCD[6]
  73. /// </summary>
  74. public DateTime EndTime { get; set; }
  75. /// <summary>
  76. /// 报警标志
  77. /// </summary>
  78. public UInt64 AlarmFlag { get; set; }
  79. /// <summary>
  80. /// 音视频资源类型
  81. /// </summary>
  82. public byte MediaType { get; set; }
  83. /// <summary>
  84. /// 码流类型
  85. /// </summary>
  86. public byte StreamType { get; set; }
  87. /// <summary>
  88. /// 存储位置
  89. /// </summary>
  90. public byte MemoryPositon { get; set; }
  91. /// <summary>
  92. /// 任务执行条件
  93. /// </summary>
  94. public byte TaskExcuteCondition { get; set; }
  95. /// <summary>
  96. ///
  97. /// </summary>
  98. /// <param name="reader"></param>
  99. /// <param name="writer"></param>
  100. /// <param name="config"></param>
  101. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  102. {
  103. JT808_0x9206 value = new JT808_0x9206();
  104. value.ServerIpLength = reader.ReadByte();
  105. writer.WriteNumber($"[{value.ServerIpLength.ReadNumber()}]服务器IP地址长度", value.ServerIpLength);
  106. string ipHex = reader.ReadVirtualArray(value.ServerIpLength).ToArray().ToHexString();
  107. value.ServerIp = reader.ReadString(value.ServerIpLength);
  108. writer.WriteString($"[{ipHex}]服务器IP地址", value.ServerIp);
  109. value.Port = reader.ReadUInt16();
  110. writer.WriteNumber($"[{value.Port.ReadNumber()}]服务器端口", value.Port);
  111. value.UserNameLength = reader.ReadByte();
  112. writer.WriteNumber($"[{value.UserNameLength.ReadNumber()}]用户名长度", value.UserNameLength);
  113. string userNameHex = reader.ReadVirtualArray(value.UserNameLength).ToArray().ToHexString();
  114. value.UserName = reader.ReadString(value.UserNameLength);
  115. writer.WriteString($"[{userNameHex}]用户名", value.UserName);
  116. value.PasswordLength = reader.ReadByte();
  117. writer.WriteNumber($"[{value.PasswordLength.ReadNumber()}]密码长度", value.PasswordLength);
  118. string passwordHex = reader.ReadVirtualArray(value.PasswordLength).ToArray().ToHexString();
  119. value.Password = reader.ReadString(value.PasswordLength);
  120. writer.WriteString($"[{passwordHex}]密码", value.Password);
  121. value.FileUploadPathLength = reader.ReadByte();
  122. writer.WriteNumber($"[{value.FileUploadPathLength.ReadNumber()}]文件上传路径长度", value.FileUploadPathLength);
  123. string fileUploadPathHex = reader.ReadVirtualArray(value.FileUploadPathLength).ToArray().ToHexString();
  124. value.FileUploadPath = reader.ReadString(value.FileUploadPathLength);
  125. writer.WriteString($"[{fileUploadPathHex}]文件上传路径", value.FileUploadPath);
  126. value.ChannelNo = reader.ReadByte();
  127. writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo));
  128. value.BeginTime = reader.ReadDateTime_yyMMddHHmmss();
  129. writer.WriteString($"[{value.BeginTime.ToString("yyMMddHHmmss")}]起始时间", value.BeginTime.ToString("yyyy-MM-dd HH:mm:ss"));
  130. value.EndTime = reader.ReadDateTime_yyMMddHHmmss();
  131. writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]起始时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss"));
  132. value.AlarmFlag = reader.ReadUInt64();
  133. writer.WriteNumber($"[{value.AlarmFlag.ReadNumber()}]报警标志", value.AlarmFlag);
  134. value.MediaType = reader.ReadByte();
  135. writer.WriteString($"[{value.MediaType.ReadNumber()}]音视频类型", AVResourceTypeDisplay(value.MediaType));
  136. value.StreamType = reader.ReadByte();
  137. writer.WriteString($"[{value.StreamType.ReadNumber()}]码流类型", StreamTypeDisplay(value.StreamType));
  138. value.MemoryPositon = reader.ReadByte();
  139. writer.WriteString($"[{value.MemoryPositon.ReadNumber()}]存储器类型", MemoryPositonDisplay(value.MemoryPositon));
  140. value.TaskExcuteCondition = reader.ReadByte();
  141. writer.WriteString($"[{value.TaskExcuteCondition.ReadNumber()}]任务执行条件", TaskExcuteConditionDisplay(value.TaskExcuteCondition));
  142. static string AVResourceTypeDisplay(byte AVResourceType)
  143. {
  144. return AVResourceType switch
  145. {
  146. 0 => "音视频",
  147. 1 => "音频",
  148. 2 => "视频",
  149. 3 => "音频或视频",
  150. _ => "未知",
  151. };
  152. }
  153. static string StreamTypeDisplay(byte StreamType)
  154. {
  155. return StreamType switch
  156. {
  157. 0 => "所有码流",
  158. 1 => "主码流",
  159. 2 => "子码流",
  160. _ => "未知",
  161. };
  162. }
  163. static string MemoryPositonDisplay(byte MemoryPositon)
  164. {
  165. return MemoryPositon switch
  166. {
  167. 0 => "主存储器或灾备服务器",
  168. 1 => "主存储器",
  169. 2 => "灾备服务器",
  170. _ => "未知",
  171. };
  172. }
  173. static string LogicalChannelNoDisplay(byte LogicalChannelNo)
  174. {
  175. return LogicalChannelNo switch
  176. {
  177. 1 => "驾驶员",
  178. 2 => "车辆正前方",
  179. 3 => "车前门",
  180. 4 => "车厢前部",
  181. 5 => "车厢后部",
  182. 7 => "行李舱",
  183. 8 => "车辆左侧",
  184. 9 => "车辆右侧",
  185. 10 => "车辆正后方",
  186. 11 => "车厢中部",
  187. 12 => "车中门",
  188. 13 => "驾驶席车门",
  189. 33 => "驾驶员",
  190. 36 => "车厢前部",
  191. 37 => "车厢后部",
  192. _ => "预留",
  193. };
  194. }
  195. static string TaskExcuteConditionDisplay(byte TaskExcuteCondition) {
  196. var taskExcuteConditionDisplay = string.Empty;
  197. taskExcuteConditionDisplay += (TaskExcuteCondition & 0x01) == 1 ? ",WIFI":"";
  198. taskExcuteConditionDisplay += (TaskExcuteCondition & 0x01) == 1 ? ",LAN" : "";
  199. taskExcuteConditionDisplay += (TaskExcuteCondition & 0x01) == 1 ? ",3G/4G" : "";
  200. return taskExcuteConditionDisplay.Length > 0 ? taskExcuteConditionDisplay.Substring(1) : "";
  201. }
  202. }
  203. /// <summary>
  204. ///
  205. /// </summary>
  206. /// <param name="reader"></param>
  207. /// <param name="config"></param>
  208. /// <returns></returns>
  209. public override JT808_0x9206 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  210. {
  211. var jT808_0x9206 = new JT808_0x9206();
  212. jT808_0x9206.ServerIpLength = reader.ReadByte();
  213. jT808_0x9206.ServerIp = reader.ReadString(jT808_0x9206.ServerIpLength);
  214. jT808_0x9206.Port = reader.ReadUInt16();
  215. jT808_0x9206.UserNameLength = reader.ReadByte();
  216. jT808_0x9206.UserName = reader.ReadString(jT808_0x9206.UserNameLength);
  217. jT808_0x9206.PasswordLength = reader.ReadByte();
  218. jT808_0x9206.Password = reader.ReadString(jT808_0x9206.PasswordLength);
  219. jT808_0x9206.FileUploadPathLength = reader.ReadByte();
  220. jT808_0x9206.FileUploadPath = reader.ReadString(jT808_0x9206.FileUploadPathLength);
  221. jT808_0x9206.ChannelNo = reader.ReadByte();
  222. jT808_0x9206.BeginTime = reader.ReadDateTime_yyMMddHHmmss();
  223. jT808_0x9206.EndTime = reader.ReadDateTime_yyMMddHHmmss();
  224. jT808_0x9206.AlarmFlag = reader.ReadUInt64();
  225. jT808_0x9206.MediaType = reader.ReadByte();
  226. jT808_0x9206.StreamType = reader.ReadByte();
  227. jT808_0x9206.MemoryPositon = reader.ReadByte();
  228. jT808_0x9206.TaskExcuteCondition = reader.ReadByte();
  229. return jT808_0x9206;
  230. }
  231. /// <summary>
  232. ///
  233. /// </summary>
  234. /// <param name="writer"></param>
  235. /// <param name="value"></param>
  236. /// <param name="config"></param>
  237. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x9206 value, IJT808Config config)
  238. {
  239. writer.Skip(1, out int serverIpLengthposition);
  240. writer.WriteString(value.ServerIp);
  241. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - serverIpLengthposition - 1), serverIpLengthposition);
  242. writer.WriteUInt16(value.Port);
  243. writer.Skip(1, out int userNameLengthposition);
  244. writer.WriteString(value.UserName);
  245. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - userNameLengthposition - 1), userNameLengthposition);
  246. writer.Skip(1, out int passwordLengthLengthposition);
  247. writer.WriteString(value.Password);
  248. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - passwordLengthLengthposition - 1), passwordLengthLengthposition);
  249. writer.Skip(1, out int fileUploadPathLengthLengthposition);
  250. writer.WriteString(value.FileUploadPath);
  251. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - fileUploadPathLengthLengthposition - 1), fileUploadPathLengthLengthposition);
  252. writer.WriteByte(value.ChannelNo);
  253. writer.WriteDateTime_yyMMddHHmmss(value.BeginTime);
  254. writer.WriteDateTime_yyMMddHHmmss(value.EndTime);
  255. writer.WriteUInt64(value.AlarmFlag);
  256. writer.WriteByte(value.MediaType);
  257. writer.WriteByte(value.StreamType);
  258. writer.WriteByte(value.MemoryPositon);
  259. writer.WriteByte(value.TaskExcuteCondition);
  260. }
  261. }
  262. }