選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

190 行
9.3 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Extensions;
  3. using JT808.Protocol.Formatters;
  4. using JT808.Protocol.Interfaces;
  5. using JT808.Protocol.MessagePack;
  6. using System;
  7. using System.Buffers.Binary;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using System.Text.Json;
  11. namespace JT808.Protocol.MessageBody.CarDVR
  12. {
  13. /// <summary>
  14. /// 采集指定的速度状态日志
  15. /// 返回:符合条件的速度状态日志
  16. /// </summary>
  17. public class JT808_CarDVR_Up_0x15 : JT808CarDVRUpBodies, IJT808MessagePackFormatter<JT808_CarDVR_Up_0x15>, IJT808Analyze
  18. {
  19. /// <summary>
  20. /// 0x15
  21. /// </summary>
  22. public override byte CommandId => JT808CarDVRCommandID.collect_specified_speed_status_logs.ToByteValue();
  23. /// <summary>
  24. /// 请求发送指定的时间范围内 N 个单位数据块的数据(N≥1)
  25. /// </summary>
  26. public List<JT808_CarDVR_Up_0x15_SpeedStatusLog> JT808_CarDVR_Up_0x15_SpeedStatusLogs { get; set; }
  27. /// <summary>
  28. /// 符合条件的速度状态日志
  29. /// </summary>
  30. public override string Description => "符合条件的速度状态日志";
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. /// <param name="reader"></param>
  35. /// <param name="writer"></param>
  36. /// <param name="config"></param>
  37. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  38. {
  39. writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据");
  40. var count = (reader.ReadCurrentRemainContentLength() - 1) / 133;//记录块个数, -1 去掉校验位
  41. for (int i = 0; i < count; i++)
  42. {
  43. JT808_CarDVR_Up_0x15_SpeedStatusLog jT808_CarDVR_Up_0x15_SpeedStatusLog = new JT808_CarDVR_Up_0x15_SpeedStatusLog();
  44. writer.WriteStartObject();
  45. writer.WriteStartObject($"指定的结束时间之前最近的第{i+1} 条速度状态日志");
  46. jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatus = reader.ReadByte();
  47. writer.WriteString($"[{ jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatus.ReadNumber()}]速度状态", SpeedStatusDisplay(jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatus));
  48. var hex = reader.ReadVirtualArray(6);
  49. jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusStartTime = reader.ReadDateTime_yyMMddHHmmss();
  50. writer.WriteString($"[{ hex.ToArray().ToHexString()}]速度状态判定的开始时间", jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusStartTime);
  51. hex = reader.ReadVirtualArray(6);
  52. jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusEndTime = reader.ReadDateTime_yyMMddHHmmss();
  53. writer.WriteString($"[{ hex.ToArray().ToHexString()}]速度状态判定的结束时间", jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusEndTime);
  54. writer.WriteStartArray("前60s速度状态日志");
  55. for (int j = 0; j < 60; j++)//60组
  56. {
  57. writer.WriteStartObject();
  58. JT808_CarDVR_Up_0x15_SpeedPerSecond jT808_CarDVR_Up_0X15_SpeedPerSecond = new JT808_CarDVR_Up_0x15_SpeedPerSecond();
  59. if (j == 0)
  60. {
  61. jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed = reader.ReadByte();
  62. writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed.ReadNumber()}]开始时间对应的记录速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed);
  63. jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed = reader.ReadByte();
  64. writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed.ReadNumber()}]开始时间对应的参考速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed);
  65. }
  66. else
  67. {
  68. jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed = reader.ReadByte();
  69. writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed.ReadNumber()}]开始时间后第{j}秒对应的记录速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed);
  70. jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed = reader.ReadByte();
  71. writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed.ReadNumber()}]开始时间后第{j}秒对应的参考速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed);
  72. }
  73. writer.WriteEndObject();
  74. }
  75. writer.WriteEndArray();
  76. writer.WriteEndObject();
  77. writer.WriteEndObject();
  78. }
  79. writer.WriteEndArray();
  80. static string SpeedStatusDisplay(byte speedStatus) {
  81. if (speedStatus == 0x01)
  82. {
  83. return "正常";
  84. }
  85. else if (speedStatus == 0x02)
  86. {
  87. return "异常";
  88. }
  89. else {
  90. return "未知";
  91. }
  92. }
  93. }
  94. /// <summary>
  95. ///
  96. /// </summary>
  97. /// <param name="writer"></param>
  98. /// <param name="value"></param>
  99. /// <param name="config"></param>
  100. public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x15 value, IJT808Config config)
  101. {
  102. foreach (var speedStatusLog in value.JT808_CarDVR_Up_0x15_SpeedStatusLogs)
  103. {
  104. writer.WriteByte(speedStatusLog.SpeedStatus);
  105. writer.WriteDateTime_yyMMddHHmmss(speedStatusLog.SpeedStatusStartTime);
  106. writer.WriteDateTime_yyMMddHHmmss(speedStatusLog.SpeedStatusEndTime);
  107. for (int i = 0; i < 60; i++)
  108. {
  109. if (i < speedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds.Count)
  110. {
  111. writer.WriteByte(speedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds[i].RecordSpeed);
  112. writer.WriteByte(speedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds[i].ReferenceSpeed);
  113. }
  114. else {
  115. writer.WriteByte(0xFF);
  116. writer.WriteByte(0xFF);
  117. }
  118. }
  119. }
  120. }
  121. /// <summary>
  122. ///
  123. /// </summary>
  124. /// <param name="reader"></param>
  125. /// <param name="config"></param>
  126. /// <returns></returns>
  127. public JT808_CarDVR_Up_0x15 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  128. {
  129. JT808_CarDVR_Up_0x15 value = new JT808_CarDVR_Up_0x15();
  130. value.JT808_CarDVR_Up_0x15_SpeedStatusLogs = new List<JT808_CarDVR_Up_0x15_SpeedStatusLog>();
  131. var count = (reader.ReadCurrentRemainContentLength() - 1) / 133;//记录块个数, -1 去掉校验位
  132. for (int i = 0; i < count; i++)
  133. {
  134. JT808_CarDVR_Up_0x15_SpeedStatusLog jT808_CarDVR_Up_0x15_SpeedStatusLog = new JT808_CarDVR_Up_0x15_SpeedStatusLog();
  135. jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatus = reader.ReadByte();
  136. jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusStartTime = reader.ReadDateTime_yyMMddHHmmss();
  137. jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusEndTime = reader.ReadDateTime_yyMMddHHmmss();
  138. jT808_CarDVR_Up_0x15_SpeedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds = new List<JT808_CarDVR_Up_0x15_SpeedPerSecond>();
  139. for (int j = 0; j < 60; j++)//60组
  140. {
  141. JT808_CarDVR_Up_0x15_SpeedPerSecond jT808_CarDVR_Up_0X15_SpeedPerSecond = new JT808_CarDVR_Up_0x15_SpeedPerSecond();
  142. jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed = reader.ReadByte();
  143. jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed = reader.ReadByte();
  144. jT808_CarDVR_Up_0x15_SpeedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds.Add(jT808_CarDVR_Up_0X15_SpeedPerSecond);
  145. }
  146. value.JT808_CarDVR_Up_0x15_SpeedStatusLogs.Add(jT808_CarDVR_Up_0x15_SpeedStatusLog);
  147. }
  148. return value;
  149. }
  150. }
  151. /// <summary>
  152. /// 单位速度状态日志数据块格式
  153. /// </summary>
  154. public class JT808_CarDVR_Up_0x15_SpeedStatusLog
  155. {
  156. /// <summary>
  157. /// 记录仪的速度状态
  158. /// </summary>
  159. public byte SpeedStatus { get; set; }
  160. /// <summary>
  161. /// 速度状态判定的开始时间
  162. /// </summary>
  163. public DateTime SpeedStatusStartTime { get; set; }
  164. /// <summary>
  165. /// 速度状态判定的结束时间
  166. /// </summary>
  167. public DateTime SpeedStatusEndTime { get; set; }
  168. /// <summary>
  169. /// 60组
  170. /// </summary>
  171. public List<JT808_CarDVR_Up_0x15_SpeedPerSecond> JT808_CarDVR_Up_0x15_SpeedPerSeconds { get; set; }
  172. }
  173. /// <summary>
  174. /// 每秒速度
  175. /// </summary>
  176. public class JT808_CarDVR_Up_0x15_SpeedPerSecond
  177. {
  178. /// <summary>
  179. /// 记录速度
  180. /// </summary>
  181. public byte RecordSpeed { get; set; }
  182. /// <summary>
  183. /// 参考速度
  184. /// </summary>
  185. public byte ReferenceSpeed { get; set; }
  186. }
  187. }