From ec80771eea31e17852e78d2e64531f8794537350 Mon Sep 17 00:00:00 2001 From: "smallchi(Koike)" <564952747@qq.com> Date: Sat, 8 Feb 2020 19:14:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A00x0200=5F0x64=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JT808_0x0200_0x64_Test.cs | 6 + .../MessageBody/JT808_0x0200_0x64.cs | 202 ++++++++++++++++-- 2 files changed, 187 insertions(+), 21 deletions(-) diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x64_Test.cs b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x64_Test.cs index 2d77ed4..91f92d8 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x64_Test.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x64_Test.cs @@ -90,5 +90,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test Assert.Equal(18, jT808_0X0200_0X64.VehicleSpeed); Assert.Equal(19, jT808_0X0200_0X64.VehicleState); } + + [Fact] + public void Deserialize1() + { + var json = JT808Serializer.Analyze("000000010000000200BA7F0E07E4F11C0028003C00001807151010106420000000010C0605120A0B100F1100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); + } } } diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x64.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x64.cs index 4e5ca2d..52e21cd 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x64.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x64.cs @@ -1,17 +1,19 @@ using JT808.Protocol.Extensions.JTActiveSafety.Metadata; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessageBody; using JT808.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Text; +using System.Text.Json; namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody { /// /// 高级驾驶辅助系统报警信息 /// - public class JT808_0x0200_0x64 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter + public class JT808_0x0200_0x64 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze { public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x64; public override byte AttachInfoLength { get; set; } = 32; @@ -82,27 +84,185 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody /// public AlarmIdentificationProperty AlarmIdentification { get; set; } + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x64 value = new JT808_0x0200_0x64(); + value.AttachInfoId = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); + value.AttachInfoLength = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); + value.AlarmId = reader.ReadUInt32(); + writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId); + value.FlagState = reader.ReadByte(); + string flagStateString = "未知"; + switch (value.FlagState) + { + case 0: + flagStateString = "不可用"; + break; + case 1: + flagStateString = "开始标志"; + break; + case 2: + flagStateString = "结束标志"; + break; + } + writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState); + value.AlarmOrEventType = reader.ReadByte(); + string alarmOrEventTypeString = ""; + string vehicleSpeedString = "无效"; + string carOrPedestrianDistanceAheadString = "无效"; + string deviateTypeString = "无效"; + string roadSignIdentificationTypeString = "无效"; + switch (value.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "前向碰撞报警"; + vehicleSpeedString = "有效"; + carOrPedestrianDistanceAheadString = "有效"; + break; + case 0x02: + alarmOrEventTypeString = "车道偏离报警"; + vehicleSpeedString = "有效"; + carOrPedestrianDistanceAheadString = "有效"; + deviateTypeString = "有效"; + break; + case 0x03: + alarmOrEventTypeString = "车距过近报警"; + break; + case 0x04: + alarmOrEventTypeString = "行人碰撞报警"; + vehicleSpeedString = "有效"; + break; + case 0x05: + alarmOrEventTypeString = "频繁变道报警"; + break; + case 0x06: + alarmOrEventTypeString = "道路标识超限报警"; + roadSignIdentificationTypeString = "有效"; + break; + case 0x07: + alarmOrEventTypeString = "障碍物报警"; + break; + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + alarmOrEventTypeString = "用户自定义"; + break; + case 0x10: + roadSignIdentificationTypeString = "有效"; + alarmOrEventTypeString = "道路标志识别事件"; + break; + case 0x11: + alarmOrEventTypeString = "主动抓拍事件"; + break; + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + alarmOrEventTypeString = "用户自定义"; + break; + } + writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType); + value.AlarmLevel = reader.ReadByte(); + string alarmLevelString = "未知"; + switch (value.AlarmLevel) + { + case 0x01: + alarmLevelString = "一级报警"; + break; + case 0x02: + alarmLevelString = "二级报警"; + break; + } + writer.WriteNumber($"[{value.AlarmLevel.ReadNumber()}]报警级别-{alarmLevelString}", value.AlarmLevel); + value.VehicleSpeed = reader.ReadByte(); + writer.WriteNumber($"[{value.VehicleSpeed.ReadNumber()}]前车车速-{vehicleSpeedString}", value.VehicleSpeed); + value.CarOrPedestrianDistanceAhead = reader.ReadByte(); + writer.WriteNumber($"[{value.CarOrPedestrianDistanceAhead.ReadNumber()}]前车_行人距离-{carOrPedestrianDistanceAheadString}", value.CarOrPedestrianDistanceAhead); + value.DeviateType = reader.ReadByte(); + string deviateType = value.DeviateType == 0x01 ? "左侧偏离" : "右侧偏离"; + writer.WriteNumber($"[{value.DeviateType.ReadNumber()}]偏离类型-{deviateType}-{deviateTypeString}", value.DeviateType); + value.RoadSignIdentificationType = reader.ReadByte(); + string roadSignIdentificationType = "未知标志"; + if (value.RoadSignIdentificationType == 0x01) + { + roadSignIdentificationType = "限速标志"; + } + else if (value.RoadSignIdentificationType == 0x02) + { + roadSignIdentificationType = "限高标志"; + } + else if (value.RoadSignIdentificationType == 0x03) + { + roadSignIdentificationType = "限重标志"; + } + writer.WriteNumber($"[{value.RoadSignIdentificationType.ReadNumber()}]道路标志识别类型-{roadSignIdentificationType}-{roadSignIdentificationTypeString}", value.RoadSignIdentificationType); + value.RoadSignIdentificationData = reader.ReadByte(); + writer.WriteNumber($"[{value.RoadSignIdentificationData.ReadNumber()}]道路标志识别数据", value.RoadSignIdentificationData); + value.Speed = reader.ReadByte(); + writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed); + value.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); + value.Latitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude); + value.Longitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude); + value.AlarmTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.VehicleState = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState); + value.AlarmIdentification = new AlarmIdentificationProperty + { + TerminalID = reader.ReadString(7), + Time = reader.ReadDateTime6(), + SN = reader.ReadByte(), + AttachCount = reader.ReadByte(), + Retain = reader.ReadByte() + }; + writer.WriteString($"[{value.AlarmIdentification.TerminalID}]终端ID", value.AlarmIdentification.TerminalID); + writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN); + writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount); + writer.WriteNumber($"[{value.AlarmIdentification.Retain.ReadNumber()}]预留", value.AlarmIdentification.Retain); + } + public JT808_0x0200_0x64 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { - JT808_0x0200_0x64 jT808_0X0200_0X64 = new JT808_0x0200_0x64(); - jT808_0X0200_0X64.AttachInfoId = reader.ReadByte(); - jT808_0X0200_0X64.AttachInfoLength = reader.ReadByte(); - jT808_0X0200_0X64.AlarmId = reader.ReadUInt32(); - jT808_0X0200_0X64.FlagState = reader.ReadByte(); - jT808_0X0200_0X64.AlarmOrEventType = reader.ReadByte(); - jT808_0X0200_0X64.AlarmLevel = reader.ReadByte(); - jT808_0X0200_0X64.VehicleSpeed = reader.ReadByte(); - jT808_0X0200_0X64.CarOrPedestrianDistanceAhead = reader.ReadByte(); - jT808_0X0200_0X64.DeviateType = reader.ReadByte(); - jT808_0X0200_0X64.RoadSignIdentificationType = reader.ReadByte(); - jT808_0X0200_0X64.RoadSignIdentificationData = reader.ReadByte(); - jT808_0X0200_0X64.Speed = reader.ReadByte(); - jT808_0X0200_0X64.Altitude = reader.ReadUInt16(); - jT808_0X0200_0X64.Latitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X64.Longitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X64.AlarmTime = reader.ReadDateTime6(); - jT808_0X0200_0X64.VehicleState = reader.ReadUInt16(); - jT808_0X0200_0X64.AlarmIdentification = new AlarmIdentificationProperty + JT808_0x0200_0x64 value = new JT808_0x0200_0x64(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.AlarmId = reader.ReadUInt32(); + value.FlagState = reader.ReadByte(); + value.AlarmOrEventType = reader.ReadByte(); + value.AlarmLevel = reader.ReadByte(); + value.VehicleSpeed = reader.ReadByte(); + value.CarOrPedestrianDistanceAhead = reader.ReadByte(); + value.DeviateType = reader.ReadByte(); + value.RoadSignIdentificationType = reader.ReadByte(); + value.RoadSignIdentificationData = reader.ReadByte(); + value.Speed = reader.ReadByte(); + value.Altitude = reader.ReadUInt16(); + value.Latitude = (int)reader.ReadUInt32(); + value.Longitude = (int)reader.ReadUInt32(); + value.AlarmTime = reader.ReadDateTime6(); + value.VehicleState = reader.ReadUInt16(); + value.AlarmIdentification = new AlarmIdentificationProperty { TerminalID = reader.ReadString(7), Time = reader.ReadDateTime6(), @@ -110,7 +270,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody AttachCount = reader.ReadByte(), Retain = reader.ReadByte() }; - return jT808_0X0200_0X64; + return value; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x64 value, IJT808Config config)