From 72f74b39f23090711b436e675fb72e6b9bee20e8 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Thu, 16 Jan 2020 00:01:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A00107=E3=80=810108=E3=80=81030?= =?UTF-8?q?1=E3=80=810302=E3=80=810303=E5=8D=8F=E8=AE=AE=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=8F=8A=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JT808.Protocol.Test.csproj | 2 +- .../MessageBody/JT808_0x0107Test.cs | 7 ++ .../MessageBody/JT808_0x0108Test.cs | 7 ++ src/JT808.Protocol/JT808.Protocol.csproj | 4 +- .../MessageBody/JT808_0x0107.cs | 81 ++++++++++++++++++- .../MessageBody/JT808_0x0108.cs | 15 +++- .../MessageBody/JT808_0x0301.cs | 13 ++- .../MessageBody/JT808_0x0302.cs | 14 +++- .../MessageBody/JT808_0x0303.cs | 16 +++- 9 files changed, 149 insertions(+), 10 deletions(-) diff --git a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj index 443dce6..f62de82 100644 --- a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj +++ b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj @@ -111,7 +111,7 @@ - + diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0107Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0107Test.cs index 4d5691a..05b155a 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0107Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0107Test.cs @@ -59,5 +59,12 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(7, jT808_0X0107.GNSSModule); Assert.Equal(9, jT808_0X0107.CommunicationModule); } + + [Fact] + public void Test3() + { + byte[] bytes = "7E0107004111223344556622B8000531303630313130343535353435393535313033303030303030346436613133301234567890123456789007616263646566670A706F69757974726577710709DA7E".ToHexBytes(); + string json = JT808Serializer.Analyze(bytes); + } } } diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0108Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0108Test.cs index b7881f0..9d4fee3 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0108Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0108Test.cs @@ -28,5 +28,12 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(JT808UpgradeResult.成功, jT808_0X0108.UpgradeResult); Assert.Equal(JT808UpgradeType.北斗卫星定位模块, jT808_0X0108.UpgradeType); } + + [Fact] + public void Test3() + { + byte[] bytes = "34 00".ToHexBytes(); + string json = JT808Serializer.Analyze(bytes); + } } } diff --git a/src/JT808.Protocol/JT808.Protocol.csproj b/src/JT808.Protocol/JT808.Protocol.csproj index b1f5de9..5ea26a5 100644 --- a/src/JT808.Protocol/JT808.Protocol.csproj +++ b/src/JT808.Protocol/JT808.Protocol.csproj @@ -14,7 +14,7 @@ https://github.com/SmallChi/JT808/blob/master/LICENSE https://github.com/SmallChi/JT808/blob/master/LICENSE false - 2.2.5 + 2.2.6 LICENSE @@ -71,7 +71,7 @@ - + diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0107.cs b/src/JT808.Protocol/MessageBody/JT808_0x0107.cs index cf02556..7c29c55 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0107.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0107.cs @@ -1,14 +1,18 @@ using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System; +using System.Collections; +using System.Text.Json; namespace JT808.Protocol.MessageBody { /// /// 查询终端属性应答 /// - public class JT808_0x0107 : JT808Bodies,IJT808MessagePackFormatter, IJT808_2019_Version + public class JT808_0x0107 : JT808Bodies,IJT808MessagePackFormatter, IJT808_2019_Version,IJT808Analyze { public override ushort MsgId { get; } = 0x0107; @@ -133,5 +137,80 @@ namespace JT808.Protocol.MessageBody writer.WriteByte(value.GNSSModule); writer.WriteByte(value.CommunicationModule); } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0107 jT808_0X0107 = new JT808_0x0107(); + jT808_0X0107.TerminalType = reader.ReadUInt16(); + writer.WriteNumber($"[{jT808_0X0107.TerminalType.ReadNumber()}]终端类型", jT808_0X0107.TerminalType); + ReadOnlySpan terminalTypeBits = Convert.ToString(jT808_0X0107.TerminalType, 2).PadLeft(16, '0').AsSpan(); + writer.WriteStartObject("终端类型"); + writer.WriteString("bit0", terminalTypeBits[0] == '0' ? "不适用客运车辆" : "适用客运车辆"); + writer.WriteString("bit1", terminalTypeBits[1] == '0' ? "不适用危险品车辆" : "适用危险品车辆"); + writer.WriteString("bit2", terminalTypeBits[2] == '0' ? "不适用普通货运车辆" : "适用普通货运车辆"); + writer.WriteString("bit3", terminalTypeBits[3] == '0' ? "不适用出租车辆" : "适用出租车辆"); + writer.WriteString("bit6", terminalTypeBits[6] == '0' ? "不支持硬盘录像" : "支持硬盘录像"); + writer.WriteString("bit7", terminalTypeBits[7] == '0' ? "一体机" : "分体机"); + writer.WriteEndObject(); + if (reader.Version == JT808Version.JTT2019) + { + ReadOnlySpan makerIdSpan = reader.ReadVirtualArray(11); + jT808_0X0107.MakerId = reader.ReadString(11); + writer.WriteString($"[{makerIdSpan.ToArray().ToHexString()}]制造商ID", jT808_0X0107.MakerId); + ReadOnlySpan terminalModelSpan = reader.ReadVirtualArray(30); + jT808_0X0107.TerminalModel = reader.ReadString(30); + writer.WriteString($"[{terminalModelSpan.ToArray().ToHexString()}]终端型号", jT808_0X0107.TerminalModel); + ReadOnlySpan terminalIdSpan = reader.ReadVirtualArray(30); + jT808_0X0107.TerminalId = reader.ReadString(30); + writer.WriteString($"[{terminalIdSpan.ToArray().ToHexString()}]终端ID", jT808_0X0107.TerminalId); + } + else + { + ReadOnlySpan makerIdSpan = reader.ReadVirtualArray(5); + jT808_0X0107.MakerId = reader.ReadString(5); + writer.WriteString($"[{makerIdSpan.ToArray().ToHexString()}]制造商ID", jT808_0X0107.MakerId); + ReadOnlySpan terminalModelSpan = reader.ReadVirtualArray(20); + jT808_0X0107.TerminalModel = reader.ReadString(20); + writer.WriteString($"[{terminalModelSpan.ToArray().ToHexString()}]终端型号", jT808_0X0107.TerminalModel); + ReadOnlySpan terminalIdSpan = reader.ReadVirtualArray(7); + jT808_0X0107.TerminalId = reader.ReadString(7); + writer.WriteString($"[{terminalIdSpan.ToArray().ToHexString()}]终端ID", jT808_0X0107.TerminalId); + } + ReadOnlySpan iccidSpan = reader.ReadVirtualArray(20); + jT808_0X0107.Terminal_SIM_ICCID = reader.ReadBCD(20, config.Trim); + writer.WriteString($"[{iccidSpan.ToArray().ToHexString()}]终端SIM卡ICCID", jT808_0X0107.Terminal_SIM_ICCID); + jT808_0X0107.Terminal_Hardware_Version_Length = reader.ReadByte(); + writer.WriteNumber($"[{jT808_0X0107.Terminal_Hardware_Version_Length.ReadNumber()}]终端硬件版本号长度", jT808_0X0107.Terminal_Hardware_Version_Length); + ReadOnlySpan hardwareVersionNumSpan = reader.ReadVirtualArray(jT808_0X0107.Terminal_Hardware_Version_Length); + jT808_0X0107.Terminal_Hardware_Version_Num = reader.ReadString(jT808_0X0107.Terminal_Hardware_Version_Length); + writer.WriteString($"[{hardwareVersionNumSpan.ToArray().ToHexString()}]终端硬件版本号", jT808_0X0107.Terminal_Hardware_Version_Num); + jT808_0X0107.Terminal_Firmware_Version_Length = reader.ReadByte(); + writer.WriteNumber($"[{jT808_0X0107.Terminal_Firmware_Version_Length.ReadNumber()}]终端硬件版本号长度", jT808_0X0107.Terminal_Firmware_Version_Length); + ReadOnlySpan firmwareVersionNumSpan = reader.ReadVirtualArray(jT808_0X0107.Terminal_Firmware_Version_Length); + jT808_0X0107.Terminal_Firmware_Version_Num = reader.ReadString(jT808_0X0107.Terminal_Firmware_Version_Length); + writer.WriteString($"[{firmwareVersionNumSpan.ToArray().ToHexString()}]终端固件版本号", jT808_0X0107.Terminal_Firmware_Version_Num); + jT808_0X0107.GNSSModule = reader.ReadByte(); + ReadOnlySpan gNSSModuleBits = Convert.ToString(jT808_0X0107.GNSSModule, 2).PadLeft(8,'0').AsSpan(); + writer.WriteNumber($"[{jT808_0X0107.GNSSModule.ReadNumber()}]GNSS模块属性", jT808_0X0107.GNSSModule); + writer.WriteStartObject("GNSS模块属性"); + writer.WriteString("bit0", gNSSModuleBits[0] == '0' ? "不支持GPS定位" : "支持GPS定位"); + writer.WriteString("bit1", gNSSModuleBits[1] == '0' ? "不支持北斗定位" : "支持北斗定位"); + writer.WriteString("bit2", gNSSModuleBits[2] == '0' ? "不支持GLONASS定位" : "支持GLONASS定位"); + writer.WriteString("bit3", gNSSModuleBits[3] == '0' ? "不支持Galileo定位" : "支持Galileo定位"); + writer.WriteEndObject(); + jT808_0X0107.CommunicationModule = reader.ReadByte(); + ReadOnlySpan communicationModuleBits=Convert.ToString(jT808_0X0107.CommunicationModule, 2).PadLeft(8, '0').AsSpan(); + writer.WriteNumber($"[{jT808_0X0107.CommunicationModule.ReadNumber()}]通信模块属性", jT808_0X0107.CommunicationModule); + writer.WriteStartObject("通信模块属性"); + writer.WriteString("bit0", communicationModuleBits[0] == '0' ? "不支持GPRS通信" : "支持GPRS通信"); + writer.WriteString("bit1", communicationModuleBits[1] == '0' ? "不支持CDMA通信" : "支持CDMA通信"); + writer.WriteString("bit2", communicationModuleBits[2] == '0' ? "不支持TD-SCDMA通信" : "支持TD-SCDMA通信"); + writer.WriteString("bit3", communicationModuleBits[3] == '0' ? "不支持WCDMA通信" : "支持WCDMA通信"); + writer.WriteString("bit4", communicationModuleBits[4] == '0' ? "不支持CDMA2000通信" : "支持CDMA2000通信"); + writer.WriteString("bit5", communicationModuleBits[5] == '0' ? "不支持TD-LTE通信" : "支持TD-LTE通信"); + writer.WriteString("bit6", "保留"); + writer.WriteString("bit7", communicationModuleBits[7] == '0' ? "不支持其他通信方式" : "不支持其他通信方式"); + writer.WriteEndObject(); + } } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0108.cs b/src/JT808.Protocol/MessageBody/JT808_0x0108.cs index 1c1f633..49ea819 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0108.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0108.cs @@ -1,13 +1,16 @@ using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System.Text.Json; namespace JT808.Protocol.MessageBody { /// /// 终端升级结果通知 /// - public class JT808_0x0108 : JT808Bodies, IJT808MessagePackFormatter + public class JT808_0x0108 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze { public override ushort MsgId { get; } = 0x0108; public override string Description => "终端升级结果通知"; @@ -22,6 +25,7 @@ namespace JT808.Protocol.MessageBody /// 0:成功,1:失败,2:取消 /// public JT808UpgradeResult UpgradeResult { get; set; } + public JT808_0x0108 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0108 jT808_0X0108 = new JT808_0x0108(); @@ -35,5 +39,14 @@ namespace JT808.Protocol.MessageBody writer.WriteByte((byte)value.UpgradeType); writer.WriteByte((byte)value.UpgradeResult); } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0108 jT808_0X0108 = new JT808_0x0108(); + jT808_0X0108.UpgradeType = (JT808UpgradeType)reader.ReadByte(); + jT808_0X0108.UpgradeResult = (JT808UpgradeResult)reader.ReadByte(); + writer.WriteString($"[{((byte)jT808_0X0108.UpgradeType).ReadNumber()}]升级类型", jT808_0X0108.UpgradeType.ToString()); + writer.WriteString($"[{((byte)jT808_0X0108.UpgradeResult).ReadNumber()}]升级结果", jT808_0X0108.UpgradeResult.ToString()); + } } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0301.cs b/src/JT808.Protocol/MessageBody/JT808_0x0301.cs index fc6c605..6369697 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0301.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0301.cs @@ -1,7 +1,9 @@ -using JT808.Protocol.Formatters; +using JT808.Protocol.Extensions; +using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; +using System.Text.Json; namespace JT808.Protocol.MessageBody { @@ -10,7 +12,7 @@ namespace JT808.Protocol.MessageBody /// 0x0301 /// [Obsolete("2019版本已作删除")] - public class JT808_0x0301 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version + public class JT808_0x0301 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version, IJT808Analyze { public override ushort MsgId { get; } = 0x0301; public override string Description => "事件报告"; @@ -18,6 +20,13 @@ namespace JT808.Protocol.MessageBody /// 事件 ID /// public byte EventId { get; set; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + var eventId = reader.ReadByte(); + writer.WriteNumber($"[{eventId.ReadNumber()}]事件ID", eventId); + } + public JT808_0x0301 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0301 jT808_0X0301 = new JT808_0x0301(); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0302.cs b/src/JT808.Protocol/MessageBody/JT808_0x0302.cs index fa11004..198336c 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0302.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0302.cs @@ -1,8 +1,10 @@ using JT808.Protocol.Attributes; +using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; +using System.Text.Json; namespace JT808.Protocol.MessageBody { @@ -11,7 +13,7 @@ namespace JT808.Protocol.MessageBody /// 0x0302 /// [Obsolete("2019版本已作删除")] - public class JT808_0x0302 : JT808Bodies, IJT808MessagePackFormatter,IJT808_2019_Version + public class JT808_0x0302 : JT808Bodies, IJT808MessagePackFormatter,IJT808_2019_Version, IJT808Analyze { public override ushort MsgId { get; } = 0x0302; public override string Description => "提问应答"; @@ -25,6 +27,16 @@ namespace JT808.Protocol.MessageBody /// 提问下发中附带的答案 ID /// public byte AnswerId { get; set; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0302 jT808_0X0302 = new JT808_0x0302(); + jT808_0X0302.ReplySNo = reader.ReadUInt16(); + jT808_0X0302.AnswerId = reader.ReadByte(); + writer.WriteNumber($"[{jT808_0X0302.ReplySNo.ReadNumber()}]应答流水号", jT808_0X0302.ReplySNo); + writer.WriteNumber($"[{jT808_0X0302.AnswerId.ReadNumber()}]答案ID", jT808_0X0302.AnswerId); + } + public JT808_0x0302 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0302 jT808_0X0302 = new JT808_0x0302(); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0303.cs b/src/JT808.Protocol/MessageBody/JT808_0x0303.cs index 90600d5..638483d 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0303.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0303.cs @@ -1,7 +1,9 @@ -using JT808.Protocol.Formatters; +using JT808.Protocol.Extensions; +using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; +using System.Text.Json; namespace JT808.Protocol.MessageBody { @@ -10,7 +12,7 @@ namespace JT808.Protocol.MessageBody /// 0x0303 /// [Obsolete("2019版本已作删除")] - public class JT808_0x0303 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version + public class JT808_0x0303 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version, IJT808Analyze { public override ushort MsgId { get; } = 0x0303; public override string Description => "信息点播_取消"; @@ -22,6 +24,16 @@ namespace JT808.Protocol.MessageBody /// 点播/取消标志 /// public byte Flag { get; set; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0303 jT808_0X0303 = new JT808_0x0303(); + jT808_0X0303.InformationType = reader.ReadByte(); + jT808_0X0303.Flag = reader.ReadByte(); + writer.WriteNumber($"[{jT808_0X0303.InformationType.ReadNumber()}]信息类型", jT808_0X0303.InformationType); + writer.WriteNumber($"[{jT808_0X0303.Flag.ReadNumber()}]{(jT808_0X0303.Flag==1? "点播" : "取消")}", jT808_0X0303.Flag); + } + public JT808_0x0303 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0303 jT808_0X0303 = new JT808_0x0303();