diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x65_Test.cs b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x65_Test.cs index 761a7b0..f411197 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x65_Test.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x65_Test.cs @@ -84,5 +84,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test Assert.Equal(18, jT808_0X0200_0X65.Fatigue); Assert.Equal(19, jT808_0X0200_0X65.VehicleState); } + + [Fact] + public void Json() + { + var json = JT808Serializer.Analyze("000000010000000200BA7F0E07E4F11C0028003C00001807151010106520000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); + } } } diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x66_Test.cs b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x66_Test.cs index 3ba2c3f..76cb5ca 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x66_Test.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x66_Test.cs @@ -72,6 +72,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); Assert.Equal("000000010000000200BA7F0E07E4F11C0028003C0000180715101010663B000000010C1100070000000D0000000E191211183100001334343434343434191210183100030200020400010003000500020900060008000A0007", hex); } + [Fact] public void Deserialize() { @@ -103,5 +104,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test Assert.Equal(17, jT808_0X0200_0X66.Speed); Assert.Equal(19, jT808_0X0200_0X66.VehicleState); } + + [Fact] + public void Json() + { + var json = JT808Serializer.Analyze("000000010000000200BA7F0E07E4F11C0028003C0000180715101010663B000000010C1100070000000D0000000E191211183100001334343434343434191210183100030200020400010003000500020900060008000A0007".ToHexBytes()); + } } } diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x67_Test.cs b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x67_Test.cs index 280ad27..ac19c82 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x67_Test.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0200_0x67_Test.cs @@ -80,5 +80,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test Assert.Equal(17, jT808_0X0200_0X67.Speed); Assert.Equal(19, jT808_0X0200_0X67.VehicleState); } + [Fact] + public void Json() + { + var json = JT808Serializer.Analyze("000000010000000200BA7F0E07E4F11C0028003C0000180715101010671A000000010C09081100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); + } } } diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml b/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml index 4d2594c..6fe2caf 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml @@ -195,7 +195,7 @@ - 报警/事件类型 + 报警级别 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 52e21cd..f3c8e1d 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x64.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x64.cs @@ -227,6 +227,25 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody 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); + var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); value.AlarmIdentification = new AlarmIdentificationProperty { TerminalID = reader.ReadString(7), diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x65.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x65.cs index c01641c..7690bb9 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x65.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x65.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_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter + public class JT808_0x0200_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze { public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x65; public override byte AttachInfoLength { get; set; } = 32; @@ -28,7 +30,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody /// public byte AlarmOrEventType{ get; set; } /// - /// 报警/事件类型 + /// 报警级别 /// public byte AlarmLevel { get; set; } /// @@ -70,24 +72,169 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody /// public AlarmIdentificationProperty AlarmIdentification { get; set; } + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x65 value = new JT808_0x0200_0x65(); + 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 = ""; + switch (value.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "前向碰撞报警"; + break; + case 0x02: + alarmOrEventTypeString = "车道偏离报警"; + break; + case 0x03: + alarmOrEventTypeString = "车距过近报警"; + break; + case 0x04: + alarmOrEventTypeString = "行人碰撞报警"; + break; + case 0x05: + alarmOrEventTypeString = "频繁变道报警"; + break; + case 0x06: + alarmOrEventTypeString = "道路标识超限报警"; + 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: + 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.Fatigue = reader.ReadByte(); + writer.WriteNumber($"[{value.Fatigue.ReadNumber()}]疲劳程度", value.Fatigue); + value.Retain = reader.ReadArray(4).ToArray(); + writer.WriteString("预留", value.Retain.ToHexString()); + 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); + var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); + 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_0x65 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { - JT808_0x0200_0x65 jT808_0X0200_0X65 = new JT808_0x0200_0x65(); - jT808_0X0200_0X65.AttachInfoId = reader.ReadByte(); - jT808_0X0200_0X65.AttachInfoLength = reader.ReadByte(); - jT808_0X0200_0X65.AlarmId = reader.ReadUInt32(); - jT808_0X0200_0X65.FlagState = reader.ReadByte(); - jT808_0X0200_0X65.AlarmOrEventType = reader.ReadByte(); - jT808_0X0200_0X65.AlarmLevel = reader.ReadByte(); - jT808_0X0200_0X65.Fatigue = reader.ReadByte(); - jT808_0X0200_0X65.Retain = reader.ReadArray(4).ToArray(); - jT808_0X0200_0X65.Speed = reader.ReadByte(); - jT808_0X0200_0X65.Altitude = reader.ReadUInt16(); - jT808_0X0200_0X65.Latitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X65.Longitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X65.AlarmTime = reader.ReadDateTime6(); - jT808_0X0200_0X65.VehicleState = reader.ReadUInt16(); - jT808_0X0200_0X65.AlarmIdentification = new AlarmIdentificationProperty + JT808_0x0200_0x65 value = new JT808_0x0200_0x65(); + 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.Fatigue = reader.ReadByte(); + value.Retain = reader.ReadArray(4).ToArray(); + 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(), @@ -95,7 +242,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody AttachCount = reader.ReadByte(), Retain = reader.ReadByte() }; - return jT808_0X0200_0X65; + return value; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x65 value, IJT808Config config) diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x66.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x66.cs index c0c17d6..dcbd9fb 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x66.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x66.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_0x66 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter + public class JT808_0x0200_0x66 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze { public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x66; public override byte AttachInfoLength { get; set; } @@ -62,20 +64,170 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody /// public List AlarmOrEvents { get; set; } + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x66 value = new JT808_0x0200_0x66(); + 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.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); + var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); + 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); + value.AlarmOrEventCount = reader.ReadByte(); + writer.WriteNumber($"[{value.AlarmOrEventCount.ReadNumber()}]报警_事件列表总数", value.AlarmOrEventCount); + if (value.AlarmOrEventCount > 0) + { + writer.WriteStartArray("报警_事件列表"); + for (int i = 0; i < value.AlarmOrEventCount; i++) + { + writer.WriteStartObject(); + AlarmOrEventProperty item = new AlarmOrEventProperty(); + item.TirePressureAlarmPosition = reader.ReadByte(); + writer.WriteNumber($"[{item.TirePressureAlarmPosition.ReadNumber()}]胎压报警位置", item.TirePressureAlarmPosition); + item.AlarmOrEventType = reader.ReadUInt16(); + string alarmOrEventTypeString = ""; + switch (item.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "前向碰撞报警"; + break; + case 0x02: + alarmOrEventTypeString = "车道偏离报警"; + break; + case 0x03: + alarmOrEventTypeString = "车距过近报警"; + break; + case 0x04: + alarmOrEventTypeString = "行人碰撞报警"; + break; + case 0x05: + alarmOrEventTypeString = "频繁变道报警"; + break; + case 0x06: + alarmOrEventTypeString = "道路标识超限报警"; + 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: + 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($"[{item.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", item.AlarmOrEventType); + item.TirePressure = reader.ReadUInt16(); + writer.WriteNumber($"[{item.TirePressure.ReadNumber()}]胎压Kpa", item.TirePressure); + item.TireTemperature = reader.ReadUInt16(); + writer.WriteNumber($"[{item.TireTemperature.ReadNumber()}]胎温℃", item.TireTemperature); + item.BatteryLevel = reader.ReadUInt16(); + writer.WriteNumber($"[{item.BatteryLevel.ReadNumber()}]电池电量%", item.BatteryLevel); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + public JT808_0x0200_0x66 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { - JT808_0x0200_0x66 jT808_0X0200_0X66 = new JT808_0x0200_0x66(); - jT808_0X0200_0X66.AttachInfoId = reader.ReadByte(); - jT808_0X0200_0X66.AttachInfoLength = reader.ReadByte(); - jT808_0X0200_0X66.AlarmId = reader.ReadUInt32(); - jT808_0X0200_0X66.FlagState = reader.ReadByte(); - jT808_0X0200_0X66.Speed = reader.ReadByte(); - jT808_0X0200_0X66.Altitude = reader.ReadUInt16(); - jT808_0X0200_0X66.Latitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X66.Longitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X66.AlarmTime = reader.ReadDateTime6(); - jT808_0X0200_0X66.VehicleState = reader.ReadUInt16(); - jT808_0X0200_0X66.AlarmIdentification = new AlarmIdentificationProperty + JT808_0x0200_0x66 value = new JT808_0x0200_0x66(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.AlarmId = reader.ReadUInt32(); + value.FlagState = 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(), @@ -83,11 +235,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody AttachCount = reader.ReadByte(), Retain = reader.ReadByte() }; - jT808_0X0200_0X66.AlarmOrEventCount = reader.ReadByte(); - if (jT808_0X0200_0X66.AlarmOrEventCount > 0) + value.AlarmOrEventCount = reader.ReadByte(); + if (value.AlarmOrEventCount > 0) { - jT808_0X0200_0X66.AlarmOrEvents = new List(); - for (int i = 0; i < jT808_0X0200_0X66.AlarmOrEventCount; i++) + value.AlarmOrEvents = new List(); + for (int i = 0; i < value.AlarmOrEventCount; i++) { AlarmOrEventProperty alarmOrEventProperty = new AlarmOrEventProperty(); alarmOrEventProperty.TirePressureAlarmPosition = reader.ReadByte(); @@ -95,10 +247,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody alarmOrEventProperty.TirePressure = reader.ReadUInt16(); alarmOrEventProperty.TireTemperature = reader.ReadUInt16(); alarmOrEventProperty.BatteryLevel = reader.ReadUInt16(); - jT808_0X0200_0X66.AlarmOrEvents.Add(alarmOrEventProperty); + value.AlarmOrEvents.Add(alarmOrEventProperty); } } - return jT808_0X0200_0X66; + return value; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x66 value, IJT808Config config) diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x67.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x67.cs index d945cd1..b52dafc 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x67.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0200_0x67.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_0x67 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter + public class JT808_0x0200_0x67 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze { public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x67; public override byte AttachInfoLength { get; set; } = 26; @@ -62,22 +64,163 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody /// public AlarmIdentificationProperty AlarmIdentification { get; set; } + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x67 value = new JT808_0x0200_0x67(); + 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 = ""; + switch (value.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "前向碰撞报警"; + break; + case 0x02: + alarmOrEventTypeString = "车道偏离报警"; + break; + case 0x03: + alarmOrEventTypeString = "车距过近报警"; + break; + case 0x04: + alarmOrEventTypeString = "行人碰撞报警"; + break; + case 0x05: + alarmOrEventTypeString = "频繁变道报警"; + break; + case 0x06: + alarmOrEventTypeString = "道路标识超限报警"; + 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: + 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.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); + var vehicleStateBits=Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); + 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_0x67 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { - JT808_0x0200_0x67 jT808_0X0200_0X67 = new JT808_0x0200_0x67(); - jT808_0X0200_0X67.AttachInfoId = reader.ReadByte(); - jT808_0X0200_0X67.AttachInfoLength = reader.ReadByte(); - jT808_0X0200_0X67.AlarmId = reader.ReadUInt32(); - jT808_0X0200_0X67.FlagState = reader.ReadByte(); - jT808_0X0200_0X67.AlarmOrEventType = reader.ReadByte(); - jT808_0X0200_0X67.AlarmLevel = reader.ReadByte(); - jT808_0X0200_0X67.Speed = reader.ReadByte(); - jT808_0X0200_0X67.Altitude = reader.ReadUInt16(); - jT808_0X0200_0X67.Latitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X67.Longitude = (int)reader.ReadUInt32(); - jT808_0X0200_0X67.AlarmTime = reader.ReadDateTime6(); - jT808_0X0200_0X67.VehicleState = reader.ReadUInt16(); - jT808_0X0200_0X67.AlarmIdentification = new AlarmIdentificationProperty + JT808_0x0200_0x67 value = new JT808_0x0200_0x67(); + 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.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(), @@ -85,7 +228,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody AttachCount = reader.ReadByte(), Retain = reader.ReadByte() }; - return jT808_0X0200_0X67; + return value; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x67 value, IJT808Config config)