No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

263 líneas
12 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.Json;
  5. using JT808.Protocol.Extensions.SuBiao.Metadata;
  6. using JT808.Protocol.Formatters;
  7. using JT808.Protocol.Interfaces;
  8. using JT808.Protocol.MessageBody;
  9. using JT808.Protocol.MessagePack;
  10. namespace JT808.Protocol.Extensions.SuBiao.MessageBody
  11. {
  12. /// <summary>
  13. /// 盲区监测系统报警信息
  14. /// </summary>
  15. public class JT808_0x0200_0x67 : JT808MessagePackFormatter<JT808_0x0200_0x67>, JT808_0x0200_CustomBodyBase, IJT808Analyze
  16. {
  17. /// <summary>
  18. /// 盲区监测系统报警信息Id
  19. /// </summary>
  20. public byte AttachInfoId { get; set; } = JT808_SuBiao_Constants.JT808_0X0200_0x67;
  21. /// <summary>
  22. /// 盲区监测系统报警信息长度
  23. /// </summary>
  24. public byte AttachInfoLength { get; set; }
  25. /// <summary>
  26. /// 报警ID
  27. /// </summary>
  28. public uint AlarmId { get; set; }
  29. /// <summary>
  30. /// 标志状态
  31. /// </summary>
  32. public byte FlagState { get; set; }
  33. /// <summary>
  34. /// 报警/事件类型
  35. /// </summary>
  36. public byte AlarmOrEventType { get; set; }
  37. /// <summary>
  38. /// 车速
  39. /// </summary>
  40. public byte Speed { get; set; }
  41. /// <summary>
  42. /// 高程
  43. /// </summary>
  44. public ushort Altitude { get; set; }
  45. /// <summary>
  46. /// 纬度
  47. /// </summary>
  48. public int Latitude { get; set; }
  49. /// <summary>
  50. /// 经度
  51. /// </summary>
  52. public int Longitude { get; set; }
  53. /// <summary>
  54. /// 日期时间
  55. /// YYMMDDhhmmss
  56. /// BCD[6]
  57. /// </summary>
  58. public DateTime AlarmTime { get; set; }
  59. /// <summary>
  60. /// 车辆状态
  61. /// </summary>
  62. public ushort VehicleState { get; set; }
  63. /// <summary>
  64. /// 报警标识号
  65. /// </summary>
  66. public AlarmIdentificationProperty AlarmIdentification { get; set; }
  67. /// <summary>
  68. ///
  69. /// </summary>
  70. /// <param name="reader"></param>
  71. /// <param name="writer"></param>
  72. /// <param name="config"></param>
  73. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  74. {
  75. JT808_0x0200_0x67 value = new JT808_0x0200_0x67();
  76. value.AttachInfoId = reader.ReadByte();
  77. writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId);
  78. value.AttachInfoLength = reader.ReadByte();
  79. writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength);
  80. value.AlarmId = reader.ReadUInt32();
  81. writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId);
  82. value.FlagState = reader.ReadByte();
  83. string flagStateString = "未知";
  84. switch (value.FlagState)
  85. {
  86. case 0:
  87. flagStateString = "不可用";
  88. break;
  89. case 1:
  90. flagStateString = "开始标志";
  91. break;
  92. case 2:
  93. flagStateString = "结束标志";
  94. break;
  95. }
  96. writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState);
  97. value.AlarmOrEventType = reader.ReadByte();
  98. string alarmOrEventTypeString = "";
  99. switch (value.AlarmOrEventType)
  100. {
  101. case 0x01:
  102. alarmOrEventTypeString = "前向碰撞报警";
  103. break;
  104. case 0x02:
  105. alarmOrEventTypeString = "车道偏离报警";
  106. break;
  107. case 0x03:
  108. alarmOrEventTypeString = "车距过近报警";
  109. break;
  110. case 0x04:
  111. alarmOrEventTypeString = "行人碰撞报警";
  112. break;
  113. case 0x05:
  114. alarmOrEventTypeString = "频繁变道报警";
  115. break;
  116. case 0x06:
  117. alarmOrEventTypeString = "道路标识超限报警";
  118. break;
  119. case 0x07:
  120. alarmOrEventTypeString = "障碍物报警";
  121. break;
  122. case 0x08:
  123. case 0x09:
  124. case 0x0A:
  125. case 0x0B:
  126. case 0x0C:
  127. case 0x0D:
  128. case 0x0E:
  129. case 0x0F:
  130. alarmOrEventTypeString = "用户自定义";
  131. break;
  132. case 0x10:
  133. alarmOrEventTypeString = "道路标志识别事件";
  134. break;
  135. case 0x11:
  136. alarmOrEventTypeString = "主动抓拍事件";
  137. break;
  138. case 0x12:
  139. case 0x13:
  140. case 0x14:
  141. case 0x15:
  142. case 0x16:
  143. case 0x17:
  144. case 0x18:
  145. case 0x19:
  146. case 0x1A:
  147. case 0x1B:
  148. case 0x1C:
  149. case 0x1D:
  150. case 0x1E:
  151. case 0x1F:
  152. alarmOrEventTypeString = "用户自定义";
  153. break;
  154. }
  155. writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType);
  156. value.Speed = reader.ReadByte();
  157. writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed);
  158. value.Altitude = reader.ReadUInt16();
  159. writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude);
  160. value.Latitude = (int)reader.ReadUInt32();
  161. writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude);
  162. value.Longitude = (int)reader.ReadUInt32();
  163. writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude);
  164. value.AlarmTime = reader.ReadDateTime_yyMMddHHmmss();
  165. writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss"));
  166. value.VehicleState = reader.ReadUInt16();
  167. writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState);
  168. var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0');
  169. writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]");
  170. writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开");
  171. writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开");
  172. writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开");
  173. writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开");
  174. writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动");
  175. writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡");
  176. writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString());
  177. writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString());
  178. writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString());
  179. writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString());
  180. writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位");
  181. writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString());
  182. writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString());
  183. writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString());
  184. writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString());
  185. writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString());
  186. writer.WriteEndObject();
  187. value.AlarmIdentification = new AlarmIdentificationProperty();
  188. string terminalIDHex = reader.ReadVirtualArray(7).ToArray().ToHexString();
  189. value.AlarmIdentification.TerminalID = reader.ReadString(7);
  190. value.AlarmIdentification.Time = reader.ReadDateTime_yyMMddHHmmss();
  191. value.AlarmIdentification.SN = reader.ReadByte();
  192. value.AlarmIdentification.AttachCount = reader.ReadByte();
  193. value.AlarmIdentification.Retain = reader.ReadByte();
  194. writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalID);
  195. writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
  196. writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
  197. writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
  198. writer.WriteNumber($"[{value.AlarmIdentification.Retain.ReadNumber()}]预留", value.AlarmIdentification.Retain);
  199. }
  200. /// <summary>
  201. ///
  202. /// </summary>
  203. /// <param name="reader"></param>
  204. /// <param name="config"></param>
  205. /// <returns></returns>
  206. public override JT808_0x0200_0x67 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  207. {
  208. JT808_0x0200_0x67 value = new JT808_0x0200_0x67();
  209. value.AttachInfoId = reader.ReadByte();
  210. value.AttachInfoLength = reader.ReadByte();
  211. value.AlarmId = reader.ReadUInt32();
  212. value.FlagState = reader.ReadByte();
  213. value.AlarmOrEventType = reader.ReadByte();
  214. value.Speed = reader.ReadByte();
  215. value.Altitude = reader.ReadUInt16();
  216. value.Latitude = (int)reader.ReadUInt32();
  217. value.Longitude = (int)reader.ReadUInt32();
  218. value.AlarmTime = reader.ReadDateTime_yyMMddHHmmss();
  219. value.VehicleState = reader.ReadUInt16();
  220. value.AlarmIdentification = new AlarmIdentificationProperty
  221. {
  222. TerminalID = reader.ReadString(7),
  223. Time = reader.ReadDateTime_yyMMddHHmmss(),
  224. SN = reader.ReadByte(),
  225. AttachCount = reader.ReadByte(),
  226. Retain = reader.ReadByte()
  227. };
  228. return value;
  229. }
  230. /// <summary>
  231. ///
  232. /// </summary>
  233. /// <param name="writer"></param>
  234. /// <param name="value"></param>
  235. /// <param name="config"></param>
  236. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x67 value, IJT808Config config)
  237. {
  238. writer.WriteByte(value.AttachInfoId);
  239. writer.Skip(1, out int AttachInfoLengthPosition);
  240. writer.WriteUInt32(value.AlarmId);
  241. writer.WriteByte(value.FlagState);
  242. writer.WriteByte(value.AlarmOrEventType);
  243. writer.WriteByte(value.Speed);
  244. writer.WriteUInt16(value.Altitude);
  245. writer.WriteUInt32((uint)value.Latitude);
  246. writer.WriteUInt32((uint)value.Longitude);
  247. writer.WriteDateTime_yyMMddHHmmss(value.AlarmTime);
  248. writer.WriteUInt16(value.VehicleState);
  249. if (value.AlarmIdentification == null)
  250. {
  251. throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
  252. }
  253. writer.WriteString(value.AlarmIdentification.TerminalID);
  254. writer.WriteDateTime_yyMMddHHmmss(value.AlarmIdentification.Time);
  255. writer.WriteByte(value.AlarmIdentification.SN);
  256. writer.WriteByte(value.AlarmIdentification.AttachCount);
  257. writer.WriteByte(value.AlarmIdentification.Retain);
  258. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - AttachInfoLengthPosition - 1), AttachInfoLengthPosition);
  259. }
  260. }
  261. }