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.

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