您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

317 行
16 KiB

  1. using JT808.Protocol.Extensions.YueBiao.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.YueBiao.MessageBody
  11. {
  12. /// <summary>
  13. /// 胎压监测系统报警信息
  14. /// </summary>
  15. public class JT808_0x0200_0x66 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x66>, IJT808Analyze
  16. {
  17. /// <summary>
  18. /// 胎压监测系统报警信息Id
  19. /// </summary>
  20. public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x66;
  21. /// <summary>
  22. /// 胎压监测系统报警信息长度
  23. /// </summary>
  24. public override 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 Speed { get; set; }
  37. /// <summary>
  38. /// 高程
  39. /// </summary>
  40. public ushort Altitude { get; set; }
  41. /// <summary>
  42. /// 纬度
  43. /// </summary>
  44. public int Latitude { get; set; }
  45. /// <summary>
  46. /// 经度
  47. /// </summary>
  48. public int Longitude { get; set; }
  49. /// <summary>
  50. /// 日期时间
  51. /// YYMMDDhhmmss
  52. /// BCD[6]
  53. /// </summary>
  54. public DateTime AlarmTime { get; set; }
  55. /// <summary>
  56. /// 车辆状态
  57. /// </summary>
  58. public ushort VehicleState { get; set; }
  59. /// <summary>
  60. /// 报警标识号
  61. /// </summary>
  62. public AlarmIdentificationProperty AlarmIdentification { get; set; }
  63. /// <summary>
  64. /// 报警/事件列表总数
  65. /// </summary>
  66. public byte AlarmOrEventCount { get; set; }
  67. /// <summary>
  68. /// 报警/事件信息列表
  69. /// </summary>
  70. public List<AlarmOrEventProperty> AlarmOrEvents { 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_0x66 value = new JT808_0x0200_0x66();
  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.Speed = reader.ReadByte();
  102. writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed);
  103. value.Altitude = reader.ReadUInt16();
  104. writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude);
  105. value.Latitude = (int)reader.ReadUInt32();
  106. writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude);
  107. value.Longitude = (int)reader.ReadUInt32();
  108. writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude);
  109. value.AlarmTime = reader.ReadDateTime6();
  110. writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss"));
  111. value.VehicleState = reader.ReadUInt16();
  112. writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState);
  113. var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0');
  114. writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]");
  115. writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开");
  116. writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开");
  117. writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开");
  118. writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开");
  119. writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动");
  120. writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡");
  121. writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString());
  122. writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString());
  123. writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString());
  124. writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString());
  125. writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位");
  126. writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString());
  127. writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString());
  128. writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString());
  129. writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString());
  130. writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString());
  131. writer.WriteEndObject();
  132. value.AlarmIdentification = new AlarmIdentificationProperty();
  133. string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
  134. value.AlarmIdentification.TerminalId = reader.ReadString(30);
  135. value.AlarmIdentification.Time = reader.ReadDateTime6();
  136. value.AlarmIdentification.SN = reader.ReadByte();
  137. value.AlarmIdentification.AttachCount = reader.ReadByte();
  138. value.AlarmIdentification.Retain1 = reader.ReadByte();
  139. value.AlarmIdentification.Retain2 = reader.ReadByte();
  140. writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId);
  141. writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
  142. writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
  143. writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
  144. writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
  145. writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
  146. value.AlarmOrEventCount = reader.ReadByte();
  147. writer.WriteNumber($"[{value.AlarmOrEventCount.ReadNumber()}]报警_事件列表总数", value.AlarmOrEventCount);
  148. if (value.AlarmOrEventCount > 0)
  149. {
  150. writer.WriteStartArray("报警_事件列表");
  151. for (int i = 0; i < value.AlarmOrEventCount; i++)
  152. {
  153. writer.WriteStartObject();
  154. AlarmOrEventProperty item = new AlarmOrEventProperty();
  155. item.TirePressureAlarmPosition = reader.ReadByte();
  156. writer.WriteNumber($"[{item.TirePressureAlarmPosition.ReadNumber()}]胎压报警位置", item.TirePressureAlarmPosition);
  157. item.AlarmOrEventType = reader.ReadUInt16();
  158. string alarmOrEventTypeString = "";
  159. switch (item.AlarmOrEventType)
  160. {
  161. case 0x01:
  162. alarmOrEventTypeString = "前向碰撞报警";
  163. break;
  164. case 0x02:
  165. alarmOrEventTypeString = "车道偏离报警";
  166. break;
  167. case 0x03:
  168. alarmOrEventTypeString = "车距过近报警";
  169. break;
  170. case 0x04:
  171. alarmOrEventTypeString = "行人碰撞报警";
  172. break;
  173. case 0x05:
  174. alarmOrEventTypeString = "频繁变道报警";
  175. break;
  176. case 0x06:
  177. alarmOrEventTypeString = "道路标识超限报警";
  178. break;
  179. case 0x07:
  180. alarmOrEventTypeString = "障碍物报警";
  181. break;
  182. case 0x08:
  183. case 0x09:
  184. case 0x0A:
  185. case 0x0B:
  186. case 0x0C:
  187. case 0x0D:
  188. case 0x0E:
  189. case 0x0F:
  190. alarmOrEventTypeString = "用户自定义";
  191. break;
  192. case 0x10:
  193. alarmOrEventTypeString = "道路标志识别事件";
  194. break;
  195. case 0x11:
  196. alarmOrEventTypeString = "主动抓拍事件";
  197. break;
  198. case 0x12:
  199. case 0x13:
  200. case 0x14:
  201. case 0x15:
  202. case 0x16:
  203. case 0x17:
  204. case 0x18:
  205. case 0x19:
  206. case 0x1A:
  207. case 0x1B:
  208. case 0x1C:
  209. case 0x1D:
  210. case 0x1E:
  211. case 0x1F:
  212. alarmOrEventTypeString = "用户自定义";
  213. break;
  214. }
  215. writer.WriteNumber($"[{item.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", item.AlarmOrEventType);
  216. item.TirePressure = reader.ReadUInt16();
  217. writer.WriteNumber($"[{item.TirePressure.ReadNumber()}]胎压Kpa", item.TirePressure);
  218. item.TireTemperature = reader.ReadUInt16();
  219. writer.WriteNumber($"[{item.TireTemperature.ReadNumber()}]胎温℃", item.TireTemperature);
  220. item.BatteryLevel = reader.ReadUInt16();
  221. writer.WriteNumber($"[{item.BatteryLevel.ReadNumber()}]电池电量%", item.BatteryLevel);
  222. writer.WriteEndObject();
  223. }
  224. writer.WriteEndArray();
  225. }
  226. }
  227. /// <summary>
  228. ///
  229. /// </summary>
  230. /// <param name="reader"></param>
  231. /// <param name="config"></param>
  232. /// <returns></returns>
  233. public JT808_0x0200_0x66 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  234. {
  235. JT808_0x0200_0x66 value = new JT808_0x0200_0x66();
  236. value.AttachInfoId = reader.ReadByte();
  237. value.AttachInfoLength = reader.ReadByte();
  238. value.AlarmId = reader.ReadUInt32();
  239. value.FlagState = reader.ReadByte();
  240. value.Speed = reader.ReadByte();
  241. value.Altitude = reader.ReadUInt16();
  242. value.Latitude = (int)reader.ReadUInt32();
  243. value.Longitude = (int)reader.ReadUInt32();
  244. value.AlarmTime = reader.ReadDateTime6();
  245. value.VehicleState = reader.ReadUInt16();
  246. value.AlarmIdentification = new AlarmIdentificationProperty
  247. {
  248. TerminalId = reader.ReadString(30),
  249. Time = reader.ReadDateTime6(),
  250. SN = reader.ReadByte(),
  251. AttachCount = reader.ReadByte(),
  252. Retain1 = reader.ReadByte(),
  253. Retain2 = reader.ReadByte()
  254. };
  255. value.AlarmOrEventCount = reader.ReadByte();
  256. if (value.AlarmOrEventCount > 0)
  257. {
  258. value.AlarmOrEvents = new List<AlarmOrEventProperty>();
  259. for (int i = 0; i < value.AlarmOrEventCount; i++)
  260. {
  261. AlarmOrEventProperty alarmOrEventProperty = new AlarmOrEventProperty();
  262. alarmOrEventProperty.TirePressureAlarmPosition = reader.ReadByte();
  263. alarmOrEventProperty.AlarmOrEventType = reader.ReadUInt16();
  264. alarmOrEventProperty.TirePressure = reader.ReadUInt16();
  265. alarmOrEventProperty.TireTemperature = reader.ReadUInt16();
  266. alarmOrEventProperty.BatteryLevel = reader.ReadUInt16();
  267. value.AlarmOrEvents.Add(alarmOrEventProperty);
  268. }
  269. }
  270. return value;
  271. }
  272. /// <summary>
  273. ///
  274. /// </summary>
  275. /// <param name="writer"></param>
  276. /// <param name="value"></param>
  277. /// <param name="config"></param>
  278. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x66 value, IJT808Config config)
  279. {
  280. writer.WriteByte(value.AttachInfoId);
  281. writer.Skip(1, out int AttachInfoLengthPosition);
  282. writer.WriteUInt32(value.AlarmId);
  283. writer.WriteByte(value.FlagState);
  284. writer.WriteByte(value.Speed);
  285. writer.WriteUInt16(value.Altitude);
  286. writer.WriteUInt32((uint)value.Latitude);
  287. writer.WriteUInt32((uint)value.Longitude);
  288. writer.WriteDateTime6(value.AlarmTime);
  289. writer.WriteUInt16(value.VehicleState);
  290. if (value.AlarmIdentification == null)
  291. {
  292. throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
  293. }
  294. writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
  295. writer.WriteDateTime6(value.AlarmIdentification.Time);
  296. writer.WriteByte(value.AlarmIdentification.SN);
  297. writer.WriteByte(value.AlarmIdentification.AttachCount);
  298. writer.WriteByte(value.AlarmIdentification.Retain1);
  299. writer.WriteByte(value.AlarmIdentification.Retain2);
  300. if (value.AlarmOrEvents.Count > 0)
  301. {
  302. writer.WriteByte((byte)value.AlarmOrEvents.Count);
  303. foreach (var item in value.AlarmOrEvents)
  304. {
  305. writer.WriteByte(item.TirePressureAlarmPosition);
  306. writer.WriteUInt16(item.AlarmOrEventType);
  307. writer.WriteUInt16(item.TirePressure);
  308. writer.WriteUInt16(item.TireTemperature);
  309. writer.WriteUInt16(item.BatteryLevel);
  310. }
  311. }
  312. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - AttachInfoLengthPosition - 1), AttachInfoLengthPosition);
  313. }
  314. }
  315. }