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.

280 líneas
13 KiB

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