Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

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