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.

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