Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

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