From 41ae4ba8332095f0a9aad4905f0270d18a0b3c22 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Sat, 2 May 2020 22:40:15 +0800 Subject: [PATCH] =?UTF-8?q?809=E8=A7=A3=E6=9E=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageBody/JT809_0x9102.cs | 22 +++- .../MessageBody/JT809_0x9103.cs | 28 ++++- .../MessageBody/JT809_0x9200.cs | 35 +++++- .../MessageBody/JT809_0x9300.cs | 36 +++++- .../MessageBody/JT809_0x9400.cs | 38 +++++- .../MessageBody/JT809_0x9500.cs | 36 +++++- .../MessageBody/JT809_0x9600.cs | 35 +++++- .../MessageBody/JT809_2019_0x9101.cs | 30 +++-- .../Metadata/JT809ManageMsgSNInform.cs | 2 +- .../SubMessageBody/JT809_0x1200_0x1201.cs | 50 +++++++- .../SubMessageBody/JT809_0x1200_0x1202.cs | 75 +++++++++++- .../SubMessageBody/JT809_0x1200_0x1203.cs | 43 +++++-- .../SubMessageBody/JT809_0x1200_0x1205.cs | 17 ++- .../SubMessageBody/JT809_0x1200_0x1206.cs | 17 ++- .../SubMessageBody/JT809_0x1200_0x1207.cs | 22 +++- .../SubMessageBody/JT809_0x1200_0x1209.cs | 23 +++- .../SubMessageBody/JT809_0x1200_0x120A.cs | 51 ++++++-- .../SubMessageBody/JT809_0x1200_0x120B.cs | 22 +++- .../SubMessageBody/JT809_0x1200_0x120C.cs | 26 ++++- .../SubMessageBody/JT809_0x1200_0x120D.cs | 22 +++- .../SubMessageBody/JT809_0x1200_0x120E.cs | 12 +- .../SubMessageBody/JT809_0x1300_0x1301.cs | 41 ++++++- .../SubMessageBody/JT809_0x1300_0x1302.cs | 22 +++- .../SubMessageBody/JT809_0x1300_0x1303.cs | 22 +++- .../SubMessageBody/JT809_0x1400_0x1401.cs | 22 +++- .../SubMessageBody/JT809_0x1400_0x1402.cs | 57 ++++++++- .../SubMessageBody/JT809_0x1400_0x1403.cs | 51 +++++++- .../SubMessageBody/JT809_0x1400_0x1411.cs | 21 +++- .../SubMessageBody/JT809_0x1400_0x1412.cs | 21 +++- .../SubMessageBody/JT809_0x1400_0x1413.cs | 39 ++++++- .../SubMessageBody/JT809_0x1500_0x1501.cs | 18 ++- .../SubMessageBody/JT809_0x1500_0x1502.cs | 110 +++++++++++++----- 32 files changed, 954 insertions(+), 112 deletions(-) diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9102.cs b/src/JT809.Protocol/MessageBody/JT809_0x9102.cs index d5a2792..3dffa08 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9102.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9102.cs @@ -6,6 +6,7 @@ using JT809.Protocol.Interfaces; using System; using System.Collections.Generic; using System.Text; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -16,7 +17,7 @@ namespace JT809.Protocol.MessageBody /// 业务类型标识:DOWN_MANAGE_MSG_REQ /// 描述:上级平台向下级平台发送上报指定下级监控平台一段时间内链路连接情况与车辆定位消息传输情况请求 /// - public class JT809_0x9102 : JT809ExchangeMessageBodies, IJT809MessagePackFormatter,IJT809_2019_Version + public class JT809_0x9102 : JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort MsgId => JT809BusinessType.平台链路连接情况与车辆定位消息传输情况上报请求消息_2019.ToUInt16Value(); public override string Description => "平台链路连接情况与车辆定位消息传输情况上报请求消息"; @@ -38,10 +39,25 @@ namespace JT809.Protocol.MessageBody /// 注:采用 UTC 时间表示,如 2010-1-10 9:7:54 的 UTC 值为 1263085674,其在协议中表示为0x000000004B49286A. /// public DateTime EndTime { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x9102 value = new JT809_0x9102(); + var virtualHex = reader.ReadVirtualArray(11); + value.PlateformId = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]平台唯一编码", value.PlateformId); + virtualHex = reader.ReadVirtualArray(8); + value.StartTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]开始时间", value.StartTime); + virtualHex = reader.ReadVirtualArray(8); + value.EndTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]结束时间", value.EndTime); + } + public JT809_0x9102 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9102 value = new JT809_0x9102(); - value.PlateformId = reader.ReadBigNumber(11); + value.PlateformId = reader.ReadString(11); value.StartTime = reader.ReadUTCDateTime(); value.EndTime = reader.ReadUTCDateTime(); return value; @@ -49,7 +65,7 @@ namespace JT809.Protocol.MessageBody public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9102 value, IJT809Config config) { - writer.WriteBigNumber(value.PlateformId, 11); + writer.WriteStringPadRight(value.PlateformId, 11); writer.WriteUTCDateTime(value.StartTime); writer.WriteUTCDateTime(value.EndTime); } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9103.cs b/src/JT809.Protocol/MessageBody/JT809_0x9103.cs index b783c7a..b3c35f5 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9103.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9103.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Text; using JT809.Protocol.Metadata; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -17,7 +18,7 @@ namespace JT809.Protocol.MessageBody /// 业务类型标识:DOWN_MANAGE_MSG_SN_INFORM /// 描述:链路登录成功后,平台须发送链路断开之前所有子业务数据类型对应的消息序列号,发送方根据收到的消息序列号,在发送消息时,续编链路中断之前的消息序列号 /// - public class JT809_0x9103 : JT809ExchangeMessageBodies, IJT809MessagePackFormatter,IJT809_2019_Version + public class JT809_0x9103 : JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort MsgId => JT809BusinessType.下发平台间消息序列号通知消息_2019.ToUInt16Value(); public override string Description => "下发平台间消息序列号通知消息"; @@ -27,6 +28,31 @@ namespace JT809.Protocol.MessageBody public List ManageMsgSNInform { get; set; } = new List(); public byte Count { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x9103 value = new JT809_0x9103(); + value.SubBusinessType = reader.ReadUInt16(); + writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); + value.Count = reader.ReadByte(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]总数", value.Count); + writer.WriteStartArray(); + for (int i = 0; i < value.Count; i++) + { + writer.WriteStartObject("子业务数据类型"); + JT809ManageMsgSNInform item = new JT809ManageMsgSNInform(); + item.SubBusinessType = reader.ReadUInt16(); + writer.WriteString($"[{item.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)item.SubBusinessType).ToString()); + item.MsgSN = reader.ReadUInt32(); + writer.WriteNumber($"[{item.MsgSN.ReadNumber()}对应得子业务数据类型报文序列号]", item.MsgSN); + var virtualHex = reader.ReadVirtualArray(8); + item.Time = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]系统UTC时间", item.Time); + } + writer.WriteEndArray(); + } + public JT809_0x9103 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9103 value = new JT809_0x9103(); diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9200.cs b/src/JT809.Protocol/MessageBody/JT809_0x9200.cs index 268bdcd..99e8f11 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9200.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9200.cs @@ -2,7 +2,9 @@ using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; using JT809.Protocol.Formatters; +using JT809.Protocol.Interfaces; using JT809.Protocol.MessagePack; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -13,12 +15,43 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_EXG_MSG /// 描述:上级平台作为客户端向下级平台服务端发送车辆动态信息交换业务 /// - public class JT809_0x9200: JT809ExchangeMessageBodies, IJT809MessagePackFormatter + public class JT809_0x9200: JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort MsgId => JT809BusinessType.从链路车辆动态信息交换业务.ToUInt16Value(); public override string Description => "从链路车辆动态信息交换业务"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x9200 value = new JT809_0x9200(); + var virtualHex = reader.ReadVirtualArray(21); + value.VehicleNo = reader.ReadString(21); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); + value.SubBusinessType = reader.ReadUInt16(); + writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + instance.Analyze(ref reader, writer, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } + public JT809_0x9200 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9200 value = new JT809_0x9200(); diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9300.cs b/src/JT809.Protocol/MessageBody/JT809_0x9300.cs index 93c5dc0..3ec77cc 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9300.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9300.cs @@ -2,8 +2,10 @@ using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; using JT809.Protocol.Formatters; +using JT809.Protocol.Interfaces; using JT809.Protocol.MessagePack; using System; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -14,11 +16,43 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_PLATFORM_MSG /// 描述:上级平台向下级平台发送平台问交互信息 /// - public class JT809_0x9300: JT809ExchangeMessageBodies, IJT809MessagePackFormatter + public class JT809_0x9300: JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort MsgId => JT809BusinessType.从链路平台间信息交互业务.ToUInt16Value(); public override string Description => "从链路平台间信息交互业务"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x9300 value = new JT809_0x9300(); + var virtualHex = reader.ReadVirtualArray(21); + value.VehicleNo = reader.ReadString(21); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); + value.SubBusinessType = reader.ReadUInt16(); + writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + instance.Analyze(ref reader, writer, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } + public JT809_0x9300 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9300 value = new JT809_0x9300(); diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9400.cs b/src/JT809.Protocol/MessageBody/JT809_0x9400.cs index 8b07df2..c882962 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9400.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9400.cs @@ -5,6 +5,7 @@ using JT809.Protocol.Extensions; using JT809.Protocol.Formatters; using JT809.Protocol.Interfaces; using JT809.Protocol.MessagePack; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -15,11 +16,46 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_WARN_MSG /// 描述:上级平台向下级平台发送报瞥信息业务 /// - public class JT809_0x9400: JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x9400: JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort MsgId => JT809BusinessType.从链路报警信息交互消息.ToUInt16Value(); public override string Description => "从链路报警信息交互消息"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x9400 value = new JT809_0x9400(); + if (config.Version == JT809Version.JTT2011) + { + var virtualHex = reader.ReadVirtualArray(21); + value.VehicleNo = reader.ReadString(21); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); + } + value.SubBusinessType = reader.ReadUInt16(); + writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + instance.Analyze(ref reader, writer, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } + public JT809_0x9400 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9400 value = new JT809_0x9400(); diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9500.cs b/src/JT809.Protocol/MessageBody/JT809_0x9500.cs index 3927371..bedd69d 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9500.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9500.cs @@ -2,7 +2,9 @@ using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; using JT809.Protocol.Formatters; +using JT809.Protocol.Interfaces; using JT809.Protocol.MessagePack; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -13,11 +15,43 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_CTRL_MSG /// 描述:上级平台向下级平台发送车辆监监管业务 /// - public class JT809_0x9500: JT809ExchangeMessageBodies, IJT809MessagePackFormatter + public class JT809_0x9500: JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort MsgId => JT809BusinessType.从链路车辆监管消息.ToUInt16Value(); public override string Description => "从链路车辆监管消息"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x9500 value = new JT809_0x9500(); + var virtualHex = reader.ReadVirtualArray(21); + value.VehicleNo = reader.ReadString(21); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); + value.SubBusinessType = reader.ReadUInt16(); + writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + instance.Analyze(ref reader, writer, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } + public JT809_0x9500 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9500 value = new JT809_0x9500(); diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9600.cs b/src/JT809.Protocol/MessageBody/JT809_0x9600.cs index 0938a19..a055c3d 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9600.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9600.cs @@ -3,7 +3,9 @@ using JT809.Protocol.Enums; using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; using JT809.Protocol.Formatters; +using JT809.Protocol.Interfaces; using JT809.Protocol.MessagePack; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -14,12 +16,43 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_BASE_MSG /// 描述:上级平台向下级平台发送车辆静态信息交换业务 /// - public class JT809_0x9600: JT809ExchangeMessageBodies, IJT809MessagePackFormatter + public class JT809_0x9600: JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort MsgId => JT809BusinessType.从链路静态信息交换消息.ToUInt16Value(); public override string Description => "从链路静态信息交换消息"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x9600 value = new JT809_0x9600(); + var virtualHex = reader.ReadVirtualArray(21); + value.VehicleNo = reader.ReadString(21); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); + value.SubBusinessType = reader.ReadUInt16(); + writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + instance.Analyze(ref reader, writer, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } + public JT809_0x9600 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9600 value = new JT809_0x9600(); diff --git a/src/JT809.Protocol/MessageBody/JT809_2019_0x9101.cs b/src/JT809.Protocol/MessageBody/JT809_2019_0x9101.cs index ec99dbd..db3932f 100644 --- a/src/JT809.Protocol/MessageBody/JT809_2019_0x9101.cs +++ b/src/JT809.Protocol/MessageBody/JT809_2019_0x9101.cs @@ -1,10 +1,12 @@ using JT809.Protocol.Enums; using JT809.Protocol.Extensions; using JT809.Protocol.Formatters; +using JT809.Protocol.Interfaces; using JT809.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Text; +using System.Text.Json; namespace JT809.Protocol.MessageBody { @@ -16,7 +18,7 @@ namespace JT809.Protocol.MessageBody /// 描述:下级平台向上级平台定量通知已经上传的车辆定位信息数量(如:每收到10,000 条车辆定位信息通知一次) /// 本条消息不需下级平台应答。 /// - public class JT809_2019_0x9101 : JT809Bodies, IJT809MessagePackFormatter + public class JT809_2019_0x9101 : JT809Bodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort MsgId => JT809BusinessType.发送车辆定位信息数据量通知消息_2019.ToUInt16Value(); public override string Description => "发送车辆定位信息数据量通知消息_2019"; @@ -31,26 +33,40 @@ namespace JT809.Protocol.MessageBody /// 开始时间,用 UTC 时间表示 /// 注:采用 UTC 时间表示,如 2010-1-10 9:7:54 的 UTC 值为 1263085674,其在协议中表示为0x000000004B49286A. /// - public ulong StartTime { get; set; } + public DateTime StartTime { get; set; } /// /// 结束时间,用 UTC 时间表示 /// 注:采用 UTC 时间表示,如 2010-1-10 9:7:54 的 UTC 值为 1263085674,其在协议中表示为0x000000004B49286A. /// - public ulong EndTime { get; set; } + public DateTime EndTime { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_2019_0x9101 value = new JT809_2019_0x9101(); + value.DynamicInfoTotal = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DynamicInfoTotal.ReadNumber()}START_TIME_END_TIME共收到的车辆定位信息数量]", value.DynamicInfoTotal); + var virtualHex = reader.ReadVirtualArray(8); + value.StartTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}开始时间]", value.StartTime); + virtualHex = reader.ReadVirtualArray(8); + value.EndTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}结束时间]", value.EndTime); + } + public JT809_2019_0x9101 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_2019_0x9101 value = new JT809_2019_0x9101(); value.DynamicInfoTotal = reader.ReadUInt32(); - value.StartTime = reader.ReadUInt64(); - value.EndTime = reader.ReadUInt64(); + value.StartTime = reader.ReadUTCDateTime(); + value.EndTime = reader.ReadUTCDateTime(); return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_2019_0x9101 value, IJT809Config config) { writer.WriteUInt32(value.DynamicInfoTotal); - writer.WriteUInt64(value.StartTime); - writer.WriteUInt64(value.EndTime); + writer.WriteUTCDateTime(value.StartTime); + writer.WriteUTCDateTime(value.EndTime); } } } diff --git a/src/JT809.Protocol/Metadata/JT809ManageMsgSNInform.cs b/src/JT809.Protocol/Metadata/JT809ManageMsgSNInform.cs index 470ffb6..bf3440f 100644 --- a/src/JT809.Protocol/Metadata/JT809ManageMsgSNInform.cs +++ b/src/JT809.Protocol/Metadata/JT809ManageMsgSNInform.cs @@ -11,7 +11,7 @@ namespace JT809.Protocol.Metadata /// public ushort SubBusinessType { get; set; } /// - /// 对应得子夜吴数据类型报文序列号 + /// 对应得子业务数据类型报文序列号 /// public uint MsgSN { get; set; } /// diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs index fef1a73..e7a2aa6 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs @@ -3,6 +3,7 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -12,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody /// 描述:监控平台收到车载终端鉴权信息后,启动本命令向上级监管平台上传该车辆注册信息.各级监管平台再逐级向上级平台上传该信息 /// 本条消息服务端无需应答 /// - public class JT809_0x1200_0x1201:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x1201:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上传车辆注册信息.ToUInt16Value(); @@ -44,6 +45,53 @@ namespace JT809.Protocol.SubMessageBody /// public string TerminalSimCode { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x1201 value = new JT809_0x1200_0x1201(); + if (config.Version == JT809Version.JTT2011) + { + var virtualHex = reader.ReadVirtualArray(11); + value.PlateformId = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]平台唯一编码", value.PlateformId); + virtualHex = reader.ReadVirtualArray(11); + value.ProducerId = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端厂商唯一编码", value.ProducerId); +#warning 此处应该改成大端模式读取数据吧 + virtualHex = reader.ReadVirtualArray(20); + value.TerminalModelType = reader.ReadString(20); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端型号", value.TerminalModelType); + virtualHex = reader.ReadVirtualArray(7); + value.TerminalId = reader.ReadString(7); + value.TerminalId = value.TerminalId.ToUpper(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端编号", value.TerminalId); + virtualHex = reader.ReadVirtualArray(12); + value.TerminalSimCode = reader.ReadString(12); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端", value.TerminalSimCode); + } + else + { + var virtualHex = reader.ReadVirtualArray(11); + value.PlateformId = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]平台唯一编码", value.PlateformId); + virtualHex = reader.ReadVirtualArray(11); + value.ProducerId = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端厂商唯一编码", value.ProducerId); + virtualHex = reader.ReadVirtualArray(30); + value.TerminalModelType = reader.ReadString(30); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端型号", value.TerminalModelType); + virtualHex = reader.ReadVirtualArray(15); + value.IMIEId = reader.ReadString(15); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端通讯模块IMEI码", value.IMIEId); + virtualHex = reader.ReadVirtualArray(30); + value.TerminalId = reader.ReadString(30); + value.TerminalId = value.TerminalId.ToUpper(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端编号", value.TerminalId); + virtualHex = reader.ReadVirtualArray(13); + value.TerminalSimCode = reader.ReadString(13); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车载终端", value.TerminalSimCode); + } + } + public JT809_0x1200_0x1201 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x1200_0x1201 value = new JT809_0x1200_0x1201(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs index 8dc03f8..afb3e01 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Metadata; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -13,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody /// 车辆的实时定位信息 /// 无需应答 /// - public class JT809_0x1200_0x1202:JT809SubBodies, IJT809MessagePackFormatter,IJT809_2019_Version + public class JT809_0x1200_0x1202:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.实时上传车辆定位信息.ToUInt16Value(); @@ -25,6 +26,75 @@ namespace JT809.Protocol.SubMessageBody public JT809VehiclePositionProperties_2019 GNSSData { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202(); + writer.WriteStartObject("车辆定位信息"); + if (config.Version == JT809Version.JTT2011) + { + value.VehiclePosition = new JT809VehiclePositionProperties(); + value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); + writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString()); + value.VehiclePosition.Day = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Day.ReadNumber()}]日", value.VehiclePosition.Day); + value.VehiclePosition.Month = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Month.ReadNumber()}]月", value.VehiclePosition.Month); + value.VehiclePosition.Year = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Year.ReadNumber()}]年", value.VehiclePosition.Year); + value.VehiclePosition.Hour = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Hour.ReadNumber()}]时", value.VehiclePosition.Hour); + value.VehiclePosition.Minute = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Minute.ReadNumber()}]分", value.VehiclePosition.Minute); + value.VehiclePosition.Second = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Second.ReadNumber()}]秒", value.VehiclePosition.Second); + value.VehiclePosition.Lon = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Lon.ReadNumber()}]经度", value.VehiclePosition.Lon); + value.VehiclePosition.Lat = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Lat.ReadNumber()}]经度", value.VehiclePosition.Lat); + value.VehiclePosition.Vec1 = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Vec1.ReadNumber()}]速度", value.VehiclePosition.Vec1); + value.VehiclePosition.Vec2 = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Vec2.ReadNumber()}]行驶记录仪速度", value.VehiclePosition.Vec2); + value.VehiclePosition.Vec3 = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Vec3.ReadNumber()}]车辆当前总里程数", value.VehiclePosition.Vec3); + value.VehiclePosition.Direction = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Direction.ReadNumber()}]方向", value.VehiclePosition.Direction); + value.VehiclePosition.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Altitude.ReadNumber()}]海拔高度", value.VehiclePosition.Altitude); + value.VehiclePosition.State = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.State.ReadNumber()}]车辆状态", value.VehiclePosition.State); + value.VehiclePosition.Alarm = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Alarm.ReadNumber()}]报警", value.VehiclePosition.Alarm); + } + else + { + value.GNSSData = new JT809VehiclePositionProperties_2019(); + value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); + writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString()); + value.GNSSData.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.GNSSData.DataLength.ReadNumber()}]车辆定位信息数据长度", value.GNSSData.DataLength); + value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray(); +#warning 此处需要提供接口注入 + writer.WriteString($"[{value.GNSSData.GnssData.ToHexString()}]车辆定位信息内容",value.GNSSData.GnssData.ToHexString()); + var virtualHex = reader.ReadVirtualArray(11); + value.GNSSData.PlatformId1 = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监控平台唯一编码", value.GNSSData.PlatformId1); + value.GNSSData.Alarm1 = reader.ReadUInt32(); + writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1); + virtualHex = reader.ReadVirtualArray(11); + value.GNSSData.PlatformId2 = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]市级监控平台唯一编码", value.GNSSData.PlatformId2); + value.GNSSData.Alarm2 = reader.ReadUInt32(); + writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1); + virtualHex = reader.ReadVirtualArray(11); + value.GNSSData.PlatformId3 = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]省级监控平台唯一编码", value.GNSSData.PlatformId3); + value.GNSSData.Alarm3 = reader.ReadUInt32(); + writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1); + } + writer.WriteEndObject(); + } + public JT809_0x1200_0x1202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202(); @@ -53,7 +123,8 @@ namespace JT809.Protocol.SubMessageBody value.GNSSData = new JT809VehiclePositionProperties_2019(); value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); value.GNSSData.DataLength = reader.ReadUInt32(); - value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray(); +#warning 引用808的0x0200协议 + value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray(); value.GNSSData.PlatformId1 = reader.ReadString(11); value.GNSSData.Alarm1 = reader.ReadUInt32(); value.GNSSData.PlatformId2 = reader.ReadString(11); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs index d06a675..366df20 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Text; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -19,7 +20,7 @@ namespace JT809.Protocol.SubMessageBody /// 本条消息上级平台采用定量回复,即收到一定数量的数据后,即通过从链路应答数据量。 /// /// - public class JT809_0x1200_0x1203 : JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x1203 : JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.车辆定位信息自动补报请求消息.ToUInt16Value(); @@ -33,19 +34,45 @@ namespace JT809.Protocol.SubMessageBody /// public List GNSS { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x1203 value = new JT809_0x1200_0x1203(); + value.GNSSCount = reader.ReadByte(); + writer.WriteNumber($"[{value.GNSSCount.ReadNumber()}]卫星定位数据个数", value.GNSSCount); + value.GNSS = new List(); + writer.WriteStartArray("实时上传车辆定位信息消息"); + if (value.GNSSCount > 0) + { + for (int i = 0; i < value.GNSSCount; i++) + { + try + { + writer.WriteStartObject(); + config.GetMessagePackFormatter().Analyze(ref reader,writer, config); + writer.WriteEndObject(); + } + catch (Exception) + { + + } + } + } + writer.WriteEndArray(); + } + public JT809_0x1200_0x1203 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1200_0x1203 jT809_0X1200_0X1203 = new JT809_0x1200_0x1203(); - jT809_0X1200_0X1203.GNSSCount = reader.ReadByte(); - jT809_0X1200_0X1203.GNSS = new List(); - if (jT809_0X1200_0X1203.GNSSCount > 0) + JT809_0x1200_0x1203 value = new JT809_0x1200_0x1203(); + value.GNSSCount = reader.ReadByte(); + value.GNSS = new List(); + if (value.GNSSCount > 0) { - for (int i = 0; i < jT809_0X1200_0X1203.GNSSCount; i++) + for (int i = 0; i < value.GNSSCount; i++) { try { var jT809_0x1200_0x1202 = config.GetMessagePackFormatter().Deserialize(ref reader, config); - jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202); + value.GNSS.Add(jT809_0x1200_0x1202); } catch (Exception) { @@ -53,7 +80,7 @@ namespace JT809.Protocol.SubMessageBody } } } - return jT809_0X1200_0X1203; + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1203 value, IJT809Config config) diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1205.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1205.cs index 2b9eaa3..fa98ae5 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1205.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1205.cs @@ -6,6 +6,7 @@ using JT809.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Text; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -14,7 +15,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_RETURN_STARTUP_ACK /// 描述:本条消息是下级平台对上级平台下发的 DOWN_EXG_MSG_RETURN_STARTUP 消息的应答消息 /// - public class JT809_0x1200_0x1205:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x1205:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.启动车辆定位信息交换应答消息.ToUInt16Value(); @@ -34,6 +35,20 @@ namespace JT809.Protocol.SubMessageBody /// public uint DataLength { get; set; } = 0x00; + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1200_0x1205(); + if (config.Version == JT809Version.JTT2019) + { + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength); + } + } + public JT809_0x1200_0x1205 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1200_0x1205(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1206.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1206.cs index a148ab5..e6a8c36 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1206.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1206.cs @@ -6,6 +6,7 @@ using JT809.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Text; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -14,7 +15,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_RETURN_END_ACK /// 本条消息时下级平台对上级平台服务器下发的DOWN_EXG_MSG_RETURN_END消息的应答消息 /// - public class JT809_0x1200_0x1206:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x1206:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.结束车辆定位信息交换应答消息.ToUInt16Value(); @@ -34,6 +35,20 @@ namespace JT809.Protocol.SubMessageBody /// public uint DataLength { get; set; } = 0x00; + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1200_0x1206(); + if (config.Version == JT809Version.JTT2019) + { + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + value.DataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength); + } + } + public JT809_0x1200_0x1206 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1200_0x1206(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1207.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1207.cs index 32e17d7..45d0af3 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1207.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1207.cs @@ -3,6 +3,8 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using System; +using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -11,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_APPLY-FOR_MONITOR_STARTUP /// 描述:当下级平台需要在特定时问段内监控特殊车辆时,可上传此命令到上级平台申请对该车辆定位数据交换到下级平台,申请成功后,此车辆定位数据将在指定时间内交换到该平台(即使该车没有进入该平台所属区域也会交换) /// - public class JT809_0x1200_0x1207:JT809SubBodies, IJT809MessagePackFormatter + public class JT809_0x1200_0x1207:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort SubMsgId => JT809SubBusinessType.申请交换指定车辆定位信息请求消息.ToUInt16Value(); @@ -26,13 +28,23 @@ namespace JT809.Protocol.SubMessageBody /// public DateTime EndTime { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x1207 value = new JT809_0x1200_0x1207(); + var virtualHex = reader.ReadVirtualArray(8); + value.StartTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]开始时间", value.StartTime); + virtualHex = reader.ReadVirtualArray(8); + value.EndTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]结束时间", value.StartTime); + } public JT809_0x1200_0x1207 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1200_0x1207 jT809_0X1200_0X1207 = new JT809_0x1200_0x1207(); - jT809_0X1200_0X1207.StartTime = reader.ReadUTCDateTime(); - jT809_0X1200_0X1207.EndTime = reader.ReadUTCDateTime(); - return jT809_0X1200_0X1207; + JT809_0x1200_0x1207 value = new JT809_0x1200_0x1207(); + value.StartTime = reader.ReadUTCDateTime(); + value.EndTime = reader.ReadUTCDateTime(); + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1207 value, IJT809Config config) diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1209.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1209.cs index 302f2d8..b0b9dd2 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1209.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1209.cs @@ -3,6 +3,8 @@ using JT809.Protocol.Formatters; using JT809.Protocol.Extensions; using JT809.Protocol.MessagePack; using System; +using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -11,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_APPLY_HISGNSSDATA_REQ /// 描述:在平台间传输链路中断并重新建立连接后,下级平台向上级平台请求中断期间内上级平台需交换至下级平台的车辆定位信息时,向上级平台发出补发车辆定位信息请求,上级平台对请求应答后进行“补发车辆定位信息” /// - public class JT809_0x1200_0x1209:JT809SubBodies, IJT809MessagePackFormatter + public class JT809_0x1200_0x1209:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort SubMsgId => JT809SubBusinessType.补发车辆定位信息请求.ToUInt16Value(); @@ -25,12 +27,23 @@ namespace JT809.Protocol.SubMessageBody /// public DateTime EndTime { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x1209 value = new JT809_0x1200_0x1209(); + var virtualHex = reader.ReadVirtualArray(8); + value.StartTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]开始时间", value.StartTime); + virtualHex = reader.ReadVirtualArray(8); + value.EndTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]结束时间", value.StartTime); + } + public JT809_0x1200_0x1209 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1200_0x1209 jT809_0X1200_0X1207 = new JT809_0x1200_0x1209(); - jT809_0X1200_0X1207.StartTime = reader.ReadUTCDateTime(); - jT809_0X1200_0X1207.EndTime = reader.ReadUTCDateTime(); - return jT809_0X1200_0X1207; + JT809_0x1200_0x1209 value = new JT809_0x1200_0x1209(); + value.StartTime = reader.ReadUTCDateTime(); + value.EndTime = reader.ReadUTCDateTime(); + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1209 value, IJT809Config config) diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120A.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120A.cs index cf4eb92..ce9f673 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120A.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120A.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; using System; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -12,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_REPORT_DRIVER_INFO_ACK /// 描述:下级平台应答上级平台发送的上报驾驶员身份识别信息请求消息,上传指定车辆的驾驶员身份识别信息数据 /// - public class JT809_0x1200_0x120A:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x120A:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上报驾驶员身份识别信息应答消息.ToUInt16Value(); @@ -46,21 +47,51 @@ namespace JT809.Protocol.SubMessageBody /// public DateTime ValidDate { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x120A value = new JT809_0x1200_0x120A(); + if (config.Version == JT809Version.JTT2019) + { + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + } + var virtualHex = reader.ReadVirtualArray(16); + value.DriverName = reader.ReadString(16); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]驾驶员姓名", value.DriverName); + virtualHex = reader.ReadVirtualArray(20); + value.DriverID = reader.ReadString(20); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]身份证编号", value.DriverID); + virtualHex = reader.ReadVirtualArray(40); + value.Licence = reader.ReadString(40); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]从业资格证", value.Licence); + virtualHex = reader.ReadVirtualArray(200); + value.OrgName = reader.ReadString(200); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发证机构名称", value.OrgName); + if (config.Version == JT809Version.JTT2019) + { + virtualHex = reader.ReadVirtualArray(8); + value.ValidDate = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]证件有效期", value.ValidDate); + } + } + public JT809_0x1200_0x120A Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1200_0x120A jT809_0X1200_0X120A = new JT809_0x1200_0x120A(); + JT809_0x1200_0x120A value = new JT809_0x1200_0x120A(); if (config.Version == JT809Version.JTT2019) { - jT809_0X1200_0X120A.SourceDataType = reader.ReadUInt16(); - jT809_0X1200_0X120A.SourceMsgSn = reader.ReadUInt32(); + value.SourceDataType = reader.ReadUInt16(); + value.SourceMsgSn = reader.ReadUInt32(); } - jT809_0X1200_0X120A.DriverName = reader.ReadString(16); - jT809_0X1200_0X120A.DriverID = reader.ReadString(20); - jT809_0X1200_0X120A.Licence = reader.ReadString(40); - jT809_0X1200_0X120A.OrgName = reader.ReadString(200); + value.DriverName = reader.ReadString(16); + value.DriverID = reader.ReadString(20); + value.Licence = reader.ReadString(40); + value.OrgName = reader.ReadString(200); if (config.Version == JT809Version.JTT2019) { - jT809_0X1200_0X120A.ValidDate = reader.ReadUTCDateTime(); + value.ValidDate = reader.ReadUTCDateTime(); } - return jT809_0X1200_0X120A; + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x120A value, IJT809Config config) diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120B.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120B.cs index 4954ce9..071fd17 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120B.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120B.cs @@ -3,6 +3,7 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_TAKE_EWAYBILL_ACK /// 描述:下级平台应答上级平台发送的上报车辆电子运单请求消息,向上级平台上传车辆当前电子运单 /// - public class JT809_0x1200_0x120B:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x120B:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上报车辆电子运单应答消息.ToUInt16Value(); @@ -32,6 +33,25 @@ namespace JT809.Protocol.SubMessageBody /// 电子运单数据内容 /// public string EwaybillInfo { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1200_0x120B(); + if (config.Version == JT809Version.JTT2019) + { + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + + } + value.EwaybillLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.EwaybillLength.ReadNumber()}]电子运单数据体长度", value.EwaybillLength); + var virtualHex = reader.ReadVirtualArray((int)value.EwaybillLength); + value.EwaybillInfo = reader.ReadString((int)value.EwaybillLength); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}电子运单数据内容]", value.EwaybillInfo); + } + public JT809_0x1200_0x120B Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1200_0x120B(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120C.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120C.cs index 6a12ee9..10e2881 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120C.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120C.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; using System; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -12,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_REPORT_DRIVER_INFO /// 下级平台在接收到车载终端上传的驾驶员身份信息后,主动向上级平台上报该消息 /// - public class JT809_0x1200_0x120C:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x120C:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.主动上报驾驶员身份信息消息.ToUInt16Value(); @@ -38,6 +39,29 @@ namespace JT809.Protocol.SubMessageBody /// public DateTime ValidDate { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x120C value = new JT809_0x1200_0x120C(); + var virtualHex = reader.ReadVirtualArray(16); + value.DriverName = reader.ReadString(16); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]驾驶员姓名", value.DriverName); + virtualHex = reader.ReadVirtualArray(20); + value.DriverID = reader.ReadString(20); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]身份证编号", value.DriverID); + virtualHex = reader.ReadVirtualArray(40); + value.Licence = reader.ReadString(40); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]从业资格证", value.Licence); + virtualHex = reader.ReadVirtualArray(200); + value.OrgName = reader.ReadString(200); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发证机构名称", value.OrgName); + if (config.Version == JT809Version.JTT2019) + { + virtualHex = reader.ReadVirtualArray(8); + value.ValidDate = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]证件有效期", value.ValidDate); + } + } + public JT809_0x1200_0x120C Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x1200_0x120C value = new JT809_0x1200_0x120C(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120D.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120D.cs index f30e5fa..2a08fd2 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120D.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120D.cs @@ -3,6 +3,7 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_EXG_MSG_REPORT_EWAYBILL_INFO /// 描述:下级平台“主动上报车辆电子运单信息”,向上级平台上报车辆当前电子运单 /// - public class JT809_0x1200_0x120D:JT809SubBodies, IJT809MessagePackFormatter,IJT809_2019_Version + public class JT809_0x1200_0x120D:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.主动上报车辆电子运单信息.ToUInt16Value(); @@ -24,12 +25,23 @@ namespace JT809.Protocol.SubMessageBody /// 电子运单数据内容 /// public string EwaybillInfo { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1200_0x120D value = new JT809_0x1200_0x120D(); + value.EwaybillLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.EwaybillLength.ReadNumber()}]电子运单数据体长度", value.EwaybillLength); + var virtualHex = reader.ReadVirtualArray((int)value.EwaybillLength); + value.EwaybillInfo = reader.ReadString((int)value.EwaybillLength); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]电子运单数据内容", value.EwaybillInfo); + } + public JT809_0x1200_0x120D Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1200_0x120D jT809_0X1200_0X120D = new JT809_0x1200_0x120D(); - jT809_0X1200_0X120D.EwaybillLength = reader.ReadUInt32(); - jT809_0X1200_0X120D.EwaybillInfo = reader.ReadString((int)jT809_0X1200_0X120D.EwaybillLength); - return jT809_0X1200_0X120D; + JT809_0x1200_0x120D value = new JT809_0x1200_0x120D(); + value.EwaybillLength = reader.ReadUInt32(); + value.EwaybillInfo = reader.ReadString((int)value.EwaybillLength); + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x120D value, IJT809Config config) diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120E.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120E.cs index d545eea..34f4eed 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120E.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x120E.cs @@ -3,6 +3,7 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -10,7 +11,7 @@ namespace JT809.Protocol.SubMessageBody /// 主动上报车辆行驶路线信息 /// 子业务类型标识:UP_BASE_MSG_DRVLINE_INFO /// - public class JT809_0x1200_0x120E:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1200_0x120E:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.主动上报车辆行驶路线信息.ToUInt16Value(); @@ -19,6 +20,15 @@ namespace JT809.Protocol.SubMessageBody /// 路线信息 按照808-2019中8606规定的报文格式 /// public byte[] DRVLine { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1200_0x120E(); + var virtualHex = reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength()); + value.DRVLine = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]路线信息", value.DRVLine); + } + public JT809_0x1200_0x120E Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1200_0x120E(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1301.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1301.cs index b23b413..c4f112f 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1301.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1301.cs @@ -3,6 +3,7 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -12,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody /// 2011 描述:下级平台应答上级平台发送的不定期平台查岗消息 /// 2019 描述:下级平台根据查岗对象地类型将上级平台发送地不定期平台查岗消息发送到不同地查岗对象,并将不同地查岗对象地应答分别转发给上级平台 /// - public class JT809_0x1300_0x1301:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1300_0x1301:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.平台查岗应答消息.ToUInt16Value(); @@ -55,6 +56,44 @@ namespace JT809.Protocol.SubMessageBody /// 应答内容 /// public string InfoContent { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1300_0x1301(); + value.ObjectType = (JT809_0x1301_ObjectType)reader.ReadByte(); + writer.WriteString($"[{value.ObjectType.ToByteValue()}]查岗对象的类型", value.ObjectType.ToString()); + if (config.Version == JT809Version.JTT2011) + { + var virtualHex = reader.ReadVirtualArray(12); + value.ObjectID = reader.ReadString(12); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]查岗对象的ID", value.ObjectID); + value.InfoID = reader.ReadUInt32(); + writer.WriteNumber($"[{value.InfoID.ReadNumber()}]信息ID", value.InfoID); + } + else + { + var virtualHex = reader.ReadVirtualArray(16); + value.Responder = reader.ReadString(16); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]查岗应答人姓名", value.Responder); + virtualHex = reader.ReadVirtualArray(20); + value.ResponderTel = reader.ReadString(20); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]查岗应答人联系电话", value.ResponderTel); + virtualHex = reader.ReadVirtualArray(20); + value.ObjectID = reader.ReadString(20); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]查岗对象的ID", value.ObjectID); + virtualHex = reader.ReadVirtualArray(16); + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + } + value.InfoLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.InfoLength.ReadNumber()}]数据长度", value.InfoLength); + var hex = reader.ReadVirtualArray((int)value.InfoLength); + value.InfoContent = reader.ReadString((int)value.InfoLength); + writer.WriteString($"[{hex.ToArray().ToHexString()}]应答内容", value.InfoContent); + } + public JT809_0x1300_0x1301 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1300_0x1301(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs index 8c60364..9d84947 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs @@ -3,6 +3,7 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_PLATFORM_MSG_INFO_ACK /// 描述:下级平台收到上级平台发送的"下发平台间报文请求"消息后,根据相应的下发报文对象类型,进行转发,并向上级平台发送应答消息 /// - public class JT809_0x1300_0x1302:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1300_0x1302:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.下发平台间报文应答消息.ToUInt16Value(); @@ -28,6 +29,25 @@ namespace JT809.Protocol.SubMessageBody /// 信息ID /// public uint InfoID { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1300_0x1302 value = new JT809_0x1300_0x1302(); + if (config.Version == JT809Version.JTT2019) + { + var virtualHex = reader.ReadVirtualArray(16); + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + } + else + { + value.InfoID = reader.ReadUInt32(); + writer.WriteNumber($"[{value.InfoID.ReadNumber()}]信息ID", value.InfoID); + } + } + public JT809_0x1300_0x1302 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x1300_0x1302 value = new JT809_0x1300_0x1302(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1303.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1303.cs index 66a1ec3..4b5c347 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1303.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1303.cs @@ -5,6 +5,7 @@ using JT809.Protocol.Extensions; using System; using JT809.Protocol.Interfaces; using System.Collections.Generic; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -13,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_PLATFORM_MSG_RETRAN_REQ /// 描述:下级平台在接收消息时,如发现消息报文序列号不连续,则立即发送消息补传请求。上级平台收到消息补传请求后,根据请求的消息报文序列号或起始时间(当仅填写一项时。另一项全为0),重传相应的消息 /// - public class JT809_0x1300_0x1303:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1300_0x1303:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上传平台间消息补传请求消息.ToUInt16Value(); @@ -33,6 +34,25 @@ namespace JT809.Protocol.SubMessageBody /// 8位 /// public DateTime Time { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1300_0x1303(); + value.SerialCount = reader.ReadByte(); + writer.WriteNumber($"[{ value.SerialCount.ReadNumber()}]对应需要重传消息地子业务类型标识", value.SerialCount); + value.SerialList = new List(); + writer.WriteStartArray("重传消息地子业务类型标识列表"); + for (int i = 0; i < SerialCount; i++) + { + var array = reader.ReadArray(8).ToArray(); + writer.WriteString($"[{array.ToHexString()}]需要重传消息的起始报文序列号和结束的报文序列号", array); + } + writer.WriteEndArray(); + var virtualHex = reader.ReadVirtualArray(8); + value.Time = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]重传起始系统utc时间", value.Time); + } + public JT809_0x1300_0x1303 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value= new JT809_0x1300_0x1303(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1401.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1401.cs index 099eb96..a2490b9 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1401.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1401.cs @@ -2,6 +2,8 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; +using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_WARN_MSG_URGE_TODO_ACK /// 描述:下级平台应答上级平台下发的报警督办请求消息,向上.级平台上报车辆的报瞥处理结果 /// - public class JT809_0x1400_0x1401:JT809SubBodies, IJT809MessagePackFormatter + public class JT809_0x1400_0x1401:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort SubMsgId => JT809SubBusinessType.报警督办应答消息.ToUInt16Value(); @@ -23,12 +25,22 @@ namespace JT809.Protocol.SubMessageBody /// 报警处理结果 /// public JT809_0x1401_Result Result { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1400_0x1401 value = new JT809_0x1400_0x1401(); + value.SupervisionID = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SupervisionID.ReadNumber()}]报警督办ID", value.SupervisionID); + value.Result = (JT809_0x1401_Result)reader.ReadByte(); + writer.WriteString($"[{value.Result.ToByteValue()}]报警处理结果", value.Result.ToString()); + } + public JT809_0x1400_0x1401 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1400_0x1401 jT809_0X1400_0X1401 = new JT809_0x1400_0x1401(); - jT809_0X1400_0X1401.SupervisionID = reader.ReadUInt32(); - jT809_0X1400_0X1401.Result = (JT809_0x1401_Result)reader.ReadByte(); - return jT809_0X1400_0X1401; + JT809_0x1400_0x1401 value = new JT809_0x1400_0x1401(); + value.SupervisionID = reader.ReadUInt32(); + value.Result = (JT809_0x1401_Result)reader.ReadByte(); + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1400_0x1401 value, IJT809Config config) diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1402.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1402.cs index 87f2649..2c38eec 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1402.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1402.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using System; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -14,7 +15,7 @@ namespace JT809.Protocol.SubMessageBody /// 2019 描述:下级平台向上级平台“上报报警信息”。 /// 本条消息上级平台无需应答 /// - public class JT809_0x1400_0x1402:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1400_0x1402:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上报报警信息消息.ToUInt16Value(); @@ -68,9 +69,61 @@ namespace JT809.Protocol.SubMessageBody /// public uint InfoLength { get; set; } /// - /// 数据长度 + /// 信息内容 /// public string InfoContent { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1400_0x1402(); + if (config.Version == JT809Version.JTT2011) + { + value.WarnSrc = (JT809WarnSrc)reader.ReadByte(); + writer.WriteString($"[{value.WarnSrc.ToByteValue()}]报警信息来源", value.WarnSrc.ToString()); + } + else + { + var virtualHex = reader.ReadVirtualArray(11); + value.SourcePlatformId = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发起报警平台唯一编码", value.SourcePlatformId); + } + value.WarnType = (JT809WarnType)reader.ReadUInt16(); + writer.WriteString($"[{value.WarnType.ToByteValue()}]报警类型", value.WarnType.ToString()); + var hex = reader.ReadVirtualArray(8); + value.WarnTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]报警时间", value.WarnTime); + if (config.Version == JT809Version.JTT2011) + { + value.InfoID = reader.ReadUInt32(); + writer.WriteNumber($"[{value.InfoID.ReadNumber()}]信息ID", value.InfoID); + } + else + { + hex = reader.ReadVirtualArray(8); + value.StartTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]事件开始时间", value.StartTime); + hex = reader.ReadVirtualArray(8); + value.EndTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]事件结束时间", value.EndTime); +#warning 此处车牌号文档长度有误,使用旧版长度21 + hex = reader.ReadVirtualArray(21); + value.VehicleNo = reader.ReadString(21); + writer.WriteString($"[{hex.ToArray().ToHexString()}]车牌号码", value.VehicleNo); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); + hex = reader.ReadVirtualArray(11); + value.DestinationPlatformId = reader.ReadString(11); + writer.WriteString($"[{hex.ToArray().ToHexString()}]被报警平台唯一编码", value.DestinationPlatformId); + value.DRVLineId = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DRVLineId.ReadNumber()}]线路ID", value.DRVLineId); + } + value.InfoLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.InfoLength.ReadNumber()}]数据长度", value.InfoLength); + hex = reader.ReadVirtualArray((int)value.InfoLength); + value.InfoContent = reader.ReadString((int)value.InfoLength); + writer.WriteString($"[{hex.ToArray().ToHexString()}]信息内容", value.InfoContent); + } + public JT809_0x1400_0x1402 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1400_0x1402(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1403.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1403.cs index a939b15..396c51f 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1403.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1403.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; using System; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -16,7 +17,7 @@ namespace JT809.Protocol.SubMessageBody /// 描述:用于下级平台向上级平台上报相关报警预警或运行提示信息2019 /// 本条消息上级平台无需应答 /// - public class JT809_0x1400_0x1403:JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1400_0x1403:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.主动上报报警处理结果信息2013_上报报警预警信息2019.ToUInt16Value(); @@ -62,7 +63,7 @@ namespace JT809.Protocol.SubMessageBody /// public uint InfoLength { get; set; } /// - /// 数据长度 + /// 信息内容 /// public string InfoContent { get; set; } /// @@ -73,6 +74,52 @@ namespace JT809.Protocol.SubMessageBody /// 处理结果 /// public JT809_0x1403_Result Result { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1400_0x1403(); + if (config.Version == JT809Version.JTT2011) + { + value.InfoID = reader.ReadUInt32(); + writer.WriteNumber($"[{value.InfoID.ReadNumber()}]报警信息ID", value.InfoID); + value.Result = (JT809_0x1403_Result)reader.ReadByte(); + writer.WriteString($"[{value.Result.ToByteValue()}]处理结果", value.Result.ToString()); + } + else + { + var virtualHex = reader.ReadVirtualArray(11); + value.SourcePlatformId = reader.ReadBigNumber(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发起报警平台唯一编码", value.SourcePlatformId); + value.WarnType = (JT809WarnType)reader.ReadUInt16(); + writer.WriteString($"[{value.WarnType.ToUInt16Value()}]处理结果", value.WarnType.ToString()); + virtualHex = reader.ReadVirtualArray(8); + value.WarnTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警时间", value.WarnTime); + virtualHex = reader.ReadVirtualArray(8); + value.StartTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]事件开始时间", value.StartTime); + virtualHex = reader.ReadVirtualArray(8); + value.EndTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]事件结束时间", value.EndTime); +#warning 此处车牌号文档长度有误,使用旧版长度21 + virtualHex = reader.ReadVirtualArray(21); + value.VehicleNo = reader.ReadString(21); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号码", value.VehicleNo); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + writer.WriteString($"[{value.VehicleColor.ToByteValue()}]处理结果", value.VehicleColor.ToString()); + virtualHex = reader.ReadVirtualArray(11); + value.DestinationPlatformId = reader.ReadBigNumber(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]被报警平台唯一编码", value.DestinationPlatformId); + value.DRVLineId = reader.ReadUInt32(); + writer.WriteNumber($"[{value.DRVLineId.ReadNumber()}]线路ID", value.DRVLineId); + value.InfoLength = reader.ReadUInt32(); + writer.WriteNumber($"[{value.InfoLength.ReadNumber()}]数据长度", value.InfoLength); + virtualHex = reader.ReadVirtualArray((int)value.InfoLength); + value.InfoContent = reader.ReadString((int)value.InfoLength); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]信息内容", value.InfoContent); + } + } + public JT809_0x1400_0x1403 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1400_0x1403(); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1411.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1411.cs index bb29c20..5996e71 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1411.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1411.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using System; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -13,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody /// 描述:下级平台向上级平台上报某车辆的报警信息 /// 本条消息上级平台无需应答 /// - public class JT809_0x1400_0x1411 : JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1400_0x1411 : JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上报报警督办应答消息.ToUInt16Value(); @@ -21,7 +22,7 @@ namespace JT809.Protocol.SubMessageBody /// /// 对应报警督办请求消息源子业务类型标识 /// - public ushort SourceDateType { get; set; } + public ushort SourceDataType { get; set; } /// /// 对应报警督办请求消息源报文序列号 /// @@ -30,10 +31,22 @@ namespace JT809.Protocol.SubMessageBody /// 报警处理结果 /// public JT809_0x1411_Result Result { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1400_0x1411(); + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + value.Result = (JT809_0x1411_Result)reader.ReadByte(); + writer.WriteString($"[{value.Result.ToByteValue()}]报警处理结果", value.Result.ToString()); + } + public JT809_0x1400_0x1411 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1400_0x1411(); - value.SourceDateType = reader.ReadUInt16(); + value.SourceDataType = reader.ReadUInt16(); value.SourceMsgSn = reader.ReadUInt32(); value.Result = (JT809_0x1411_Result)reader.ReadByte(); return value; @@ -41,7 +54,7 @@ namespace JT809.Protocol.SubMessageBody public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1400_0x1411 value, IJT809Config config) { - writer.WriteUInt16(value.SourceDateType); + writer.WriteUInt16(value.SourceDataType); writer.WriteUInt32(value.SourceMsgSn); writer.WriteByte((byte)value.Result); } diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1412.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1412.cs index dca02bf..1e32eb4 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1412.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1412.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using System; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -13,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody /// 描述:下级平台主动向上级平台上报报警处理结果 /// 本条消息上级平台无需应答 /// - public class JT809_0x1400_0x1412 : JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1400_0x1412 : JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.主动上报报警处理结果消息.ToUInt16Value(); @@ -21,7 +22,7 @@ namespace JT809.Protocol.SubMessageBody /// /// 对应报警督办请求消息源子业务类型标识 /// - public ushort SourceDateType { get; set; } + public ushort SourceDataType { get; set; } /// /// 对应报警督办请求消息源报文序列号 /// @@ -30,10 +31,22 @@ namespace JT809.Protocol.SubMessageBody /// 报警处理结果 /// public JT809_0x1412_Result Result { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1400_0x1412(); + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + value.Result = (JT809_0x1412_Result)reader.ReadByte(); + writer.WriteString($"[{value.Result.ToByteValue()}]报警处理结果", value.Result.ToString()); + } + public JT809_0x1400_0x1412 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1400_0x1412(); - value.SourceDateType = reader.ReadUInt16(); + value.SourceDataType = reader.ReadUInt16(); value.SourceMsgSn = reader.ReadUInt32(); value.Result = (JT809_0x1412_Result)reader.ReadByte(); return value; @@ -41,7 +54,7 @@ namespace JT809.Protocol.SubMessageBody public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1400_0x1412 value, IJT809Config config) { - writer.WriteUInt16(value.SourceDateType); + writer.WriteUInt16(value.SourceDataType); writer.WriteUInt32(value.SourceMsgSn); writer.WriteByte((byte)value.Result); } diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1413.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1413.cs index b22370b..dca5eea 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1413.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1400_0x1413.cs @@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using System; using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -13,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody /// 描述:下级平台告知上级平台已对报警情况进行催办 /// 本条消息上级平台无需应答 /// - public class JT809_0x1400_0x1413 : JT809SubBodies, IJT809MessagePackFormatter, IJT809_2019_Version + public class JT809_0x1400_0x1413 : JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上报报警督办请求消息.ToUInt16Value(); @@ -29,7 +30,7 @@ namespace JT809.Protocol.SubMessageBody /// /// 对应报警督办请求消息源子业务类型标识 /// - public ushort SourceDateType { get; set; } + public ushort SourceDataType { get; set; } /// /// 对应报警督办请求消息源报文序列号 /// @@ -54,12 +55,42 @@ namespace JT809.Protocol.SubMessageBody /// 督办人联系电子邮件 /// public string SupervisorEmail { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + var value = new JT809_0x1400_0x1413(); + var virtualHex = reader.ReadVirtualArray(11); + value.SourcePlatformId = reader.ReadBigNumber(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发起报警平台唯一编码", value.SourcePlatformId); + virtualHex = reader.ReadVirtualArray(8); + value.WarnTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警时间", value.WarnTime); + value.SourceDataType = reader.ReadUInt16(); + writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); + value.SourceMsgSn = reader.ReadUInt32(); + writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); + virtualHex = reader.ReadVirtualArray(8); + value.SupervisionEndTime = reader.ReadUTCDateTime(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办截止时间", value.SupervisionEndTime); + value.SupervisionLevel = (JT809_0x1413_SupervisionLevel)reader.ReadByte(); + writer.WriteString($"[{value.SupervisionLevel.ToByteValue()}]督办级别", value.SupervisionLevel.ToString()); + virtualHex = reader.ReadVirtualArray(16); + value.Supervisor = reader.ReadString(16); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办人", value.Supervisor); + virtualHex = reader.ReadVirtualArray(20); + value.SupervisorTel = reader.ReadString(20); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办人联系电话", value.SupervisorTel); + virtualHex = reader.ReadVirtualArray(32); + value.SupervisorEmail = reader.ReadString(32); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办人联系电子邮件", value.SupervisorTel); + } + public JT809_0x1400_0x1413 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1400_0x1413(); value.SourcePlatformId = reader.ReadBigNumber(11); value.WarnTime = reader.ReadUTCDateTime(); - value.SourceDateType = reader.ReadUInt16(); + value.SourceDataType = reader.ReadUInt16(); value.SourceMsgSn = reader.ReadUInt32(); value.SupervisionEndTime = reader.ReadUTCDateTime(); value.SupervisionLevel=(JT809_0x1413_SupervisionLevel)reader.ReadByte(); @@ -73,7 +104,7 @@ namespace JT809.Protocol.SubMessageBody { writer.WriteBigNumber(value.SourcePlatformId,11); writer.WriteUTCDateTime(value.WarnTime); - writer.WriteUInt16(value.SourceDateType); + writer.WriteUInt16(value.SourceDataType); writer.WriteUInt32(value.SourceMsgSn); writer.WriteUTCDateTime(value.SupervisionEndTime); writer.WriteByte((byte)value.SupervisionLevel); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1501.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1501.cs index ae5900f..5e617a8 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1501.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1501.cs @@ -2,6 +2,8 @@ using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; +using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_CTRL_MSG_MONITOR_VEHTCLE_ACK /// 描述:下级平台向上级平台上传车辆单向监听请求消息的应答 /// - public class JT809_0x1500_0x1501:JT809SubBodies, IJT809MessagePackFormatter + public class JT809_0x1500_0x1501:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort SubMsgId => JT809SubBusinessType.车辆单向监听应答.ToUInt16Value(); @@ -19,11 +21,19 @@ namespace JT809.Protocol.SubMessageBody /// 应答结果 /// public JT809_0x1501_Result Result { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1500_0x1501 value = new JT809_0x1500_0x1501(); + value.Result = (JT809_0x1501_Result)reader.ReadByte(); + writer.WriteString($"[{value.Result.ToByteValue()}]应答结果", value.Result.ToString()); + } + public JT809_0x1500_0x1501 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1500_0x1501 jT809_0X1500_0X1501 = new JT809_0x1500_0x1501(); - jT809_0X1500_0X1501.Result = (JT809_0x1501_Result)reader.ReadByte(); - return jT809_0X1500_0X1501; + JT809_0x1500_0x1501 value = new JT809_0x1500_0x1501(); + value.Result = (JT809_0x1501_Result)reader.ReadByte(); + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1500_0x1501 value, IJT809Config config) diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs index d8277fc..e3eb8a8 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs @@ -6,6 +6,8 @@ using JT809.Protocol.Extensions; using System; using System.Collections.Generic; using System.Text; +using JT809.Protocol.Interfaces; +using System.Text.Json; namespace JT809.Protocol.SubMessageBody { @@ -14,7 +16,7 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_ CTRL_ MSG _TAKE_ PHOTO_ ACK /// 描述:下级平台应答上级平台发送的车辆拍照请求消息,上传图片信息到上级平台 /// - public class JT809_0x1500_0x1502:JT809SubBodies, IJT809MessagePackFormatter + public class JT809_0x1500_0x1502:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort SubMsgId => JT809SubBusinessType.车辆拍照应答.ToUInt16Value(); @@ -52,35 +54,90 @@ namespace JT809.Protocol.SubMessageBody /// 图片内容 /// public byte[] Photo { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + JT809_0x1500_0x1502 value = new JT809_0x1500_0x1502(); + value.PhotoRspFlag = (JT809_0x1502_PhotoRspFlag)reader.ReadByte(); + writer.WriteString($"[{value.PhotoRspFlag.ToByteValue()}]拍照应答标识", value.PhotoRspFlag.ToString()); + writer.WriteStartObject("车辆定位信息"); + value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); + writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString()); + value.VehiclePosition.Day = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Day}]日", value.VehiclePosition.Day); + value.VehiclePosition.Month = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Month}]月", value.VehiclePosition.Month); + value.VehiclePosition.Year = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Year}]年", value.VehiclePosition.Year); + value.VehiclePosition.Hour = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Hour}]时", value.VehiclePosition.Hour); + value.VehiclePosition.Minute = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Minute}]分", value.VehiclePosition.Minute); + value.VehiclePosition.Second = reader.ReadByte(); + writer.WriteNumber($"[{value.VehiclePosition.Second}]秒", value.VehiclePosition.Second); + value.VehiclePosition.Lon = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Lon}]经度", value.VehiclePosition.Lon); + value.VehiclePosition.Lat = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Lat}]纬度", value.VehiclePosition.Lat); + value.VehiclePosition.Vec1 = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Vec1}]速度", value.VehiclePosition.Vec1); + value.VehiclePosition.Vec2 = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Vec2}]行驶记录速度", value.VehiclePosition.Vec2); + value.VehiclePosition.Vec3 = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Vec3}]车辆当前总里程数", value.VehiclePosition.Vec3); + value.VehiclePosition.Direction = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Direction}]方向", value.VehiclePosition.Direction); + value.VehiclePosition.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehiclePosition.Altitude}]海拔高度", value.VehiclePosition.Altitude); + value.VehiclePosition.State = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.State}]车辆状态", value.VehiclePosition.State); + value.VehiclePosition.Alarm = reader.ReadUInt32(); + writer.WriteNumber($"[{value.VehiclePosition.Alarm}]报警状态", value.VehiclePosition.Alarm); + writer.WriteEndObject(); + value.LensID = reader.ReadByte(); + writer.WriteNumber($"[{value.LensID}]镜头ID", value.LensID); + value.PhotoLen = reader.ReadUInt32(); + writer.WriteNumber($"[{value.PhotoLen}]图片长度", value.PhotoLen); + value.SizeType = reader.ReadByte(); + writer.WriteNumber($"[{value.SizeType}]图片大小", value.SizeType); + value.Type = reader.ReadByte(); + writer.WriteNumber($"[{value.Type}]图像格式", value.Type); + if (value.PhotoLen > 0) + { + var virtualHex = reader.ReadVirtualArray((int)value.PhotoLen); + value.Photo = reader.ReadArray((int)value.PhotoLen).ToArray(); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]图片内容", value.Photo); + } + } public JT809_0x1500_0x1502 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1500_0x1502 jT809_0X1500_0X1502 = new JT809_0x1500_0x1502(); - jT809_0X1500_0X1502.PhotoRspFlag = (JT809_0x1502_PhotoRspFlag)reader.ReadByte(); - jT809_0X1500_0X1502.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - jT809_0X1500_0X1502.VehiclePosition.Day = reader.ReadByte(); - jT809_0X1500_0X1502.VehiclePosition.Month = reader.ReadByte(); - jT809_0X1500_0X1502.VehiclePosition.Year = reader.ReadUInt16(); - jT809_0X1500_0X1502.VehiclePosition.Hour = reader.ReadByte(); - jT809_0X1500_0X1502.VehiclePosition.Minute = reader.ReadByte(); - jT809_0X1500_0X1502.VehiclePosition.Second = reader.ReadByte(); - jT809_0X1500_0X1502.VehiclePosition.Lon = reader.ReadUInt32(); - jT809_0X1500_0X1502.VehiclePosition.Lat = reader.ReadUInt32(); - jT809_0X1500_0X1502.VehiclePosition.Vec1 = reader.ReadUInt16(); - jT809_0X1500_0X1502.VehiclePosition.Vec2 = reader.ReadUInt16(); - jT809_0X1500_0X1502.VehiclePosition.Vec3 = reader.ReadUInt32(); - jT809_0X1500_0X1502.VehiclePosition.Direction = reader.ReadUInt16(); - jT809_0X1500_0X1502.VehiclePosition.Altitude = reader.ReadUInt16(); - jT809_0X1500_0X1502.VehiclePosition.State = reader.ReadUInt32(); - jT809_0X1500_0X1502.VehiclePosition.Alarm = reader.ReadUInt32(); - jT809_0X1500_0X1502.LensID = reader.ReadByte(); - jT809_0X1500_0X1502.PhotoLen = reader.ReadUInt32(); - jT809_0X1500_0X1502.SizeType = reader.ReadByte(); - jT809_0X1500_0X1502.Type = reader.ReadByte(); - if (jT809_0X1500_0X1502.PhotoLen > 0) + JT809_0x1500_0x1502 value = new JT809_0x1500_0x1502(); + value.PhotoRspFlag = (JT809_0x1502_PhotoRspFlag)reader.ReadByte(); + value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); + value.VehiclePosition.Day = reader.ReadByte(); + value.VehiclePosition.Month = reader.ReadByte(); + value.VehiclePosition.Year = reader.ReadUInt16(); + value.VehiclePosition.Hour = reader.ReadByte(); + value.VehiclePosition.Minute = reader.ReadByte(); + value.VehiclePosition.Second = reader.ReadByte(); + value.VehiclePosition.Lon = reader.ReadUInt32(); + value.VehiclePosition.Lat = reader.ReadUInt32(); + value.VehiclePosition.Vec1 = reader.ReadUInt16(); + value.VehiclePosition.Vec2 = reader.ReadUInt16(); + value.VehiclePosition.Vec3 = reader.ReadUInt32(); + value.VehiclePosition.Direction = reader.ReadUInt16(); + value.VehiclePosition.Altitude = reader.ReadUInt16(); + value.VehiclePosition.State = reader.ReadUInt32(); + value.VehiclePosition.Alarm = reader.ReadUInt32(); + value.LensID = reader.ReadByte(); + value.PhotoLen = reader.ReadUInt32(); + value.SizeType = reader.ReadByte(); + value.Type = reader.ReadByte(); + if (value.PhotoLen > 0) { - jT809_0X1500_0X1502.Photo = reader.ReadArray((int)jT809_0X1500_0X1502.PhotoLen).ToArray(); + value.Photo = reader.ReadArray((int)value.PhotoLen).ToArray(); } - return jT809_0X1500_0X1502; + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1500_0x1502 value, IJT809Config config) @@ -112,5 +169,6 @@ namespace JT809.Protocol.SubMessageBody writer.WriteArray(value.Photo); } } + } }