From 15f3b155d0f986578300ff58525c5e861cadd9bc Mon Sep 17 00:00:00 2001 From: waterliu99 Date: Fri, 25 Jun 2021 19:43:25 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=B1=E4=BA=8E=E6=9C=89=E4=BA=9B=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=B8=8D=E6=8C=89=E8=A7=84=E7=9F=A9=E6=9D=A5=EF=BC=8C?= =?UTF-8?q?=E6=98=8E=E6=98=8E=E6=98=AF2013=E5=8D=8F=E8=AE=AE=E7=9A=84?= =?UTF-8?q?=EF=BC=8C=E5=8D=B4=E5=9C=A8=E5=8D=8F=E8=AE=AE=E5=A4=B4=E9=83=A8?= =?UTF-8?q?=E7=9A=84=E7=89=88=E6=9C=AC=E6=A0=87=E8=AF=86=E4=B8=AD=E6=89=93?= =?UTF-8?q?=E4=B8=8A2019=E7=9A=84=E6=A0=87=E8=AF=86=EF=BC=8C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=8D=8F=E8=AE=AE=E6=97=A0=E6=B3=95=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=EF=BC=8C=E6=AD=A4=E5=A4=84=E6=B7=BB=E5=8A=A0=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E8=A7=A3=E6=9E=90=E6=88=902013?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageBody/JT808_0x0200Test.cs | 16 ++++ src/JT808.Protocol/Enums/JT808Version.cs | 4 + src/JT808.Protocol/JT808.Protocol.xml | 5 ++ src/JT808.Protocol/JT808Package.cs | 83 ++++++++++++------- 4 files changed, 79 insertions(+), 29 deletions(-) diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs index 101867a..c94c188 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs @@ -310,6 +310,22 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } [Fact] + public void Test5_3() + { + byte[] bytes = "7e0100402d01003000067906ff000000003730393639455632350000000000000000000000000000000030303030363739090000000000000000cf7e".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes,JT808Version.JTT2013Force); + jT808Package.Header.ProtocolVersion = 0;//修改成 2013协议标识 + var newBytes = JT808Serializer.Serialize(jT808Package);//重新序列化 + var jt808PackageNew = JT808Serializer.Deserialize(newBytes);//验证是否修改标识符成功 + Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); + } + [Fact] + public void Test5_4() + { + byte[] bytes = "7e0200406c010030000681090e00000000000c0003026c936f074c794c0004036300d7210625155739010400000000052801cc00210625155739054145bbc91e4145a2fa1141450000004145bbc8194145a1370a4145000000240200002a0200002b04000000003001153101125f0a89860418231870850620757e".ToHexBytes(); + var json = JT808Serializer.Analyze(bytes, JT808Version.JTT2013Force); + } + [Fact] public void Test6() { JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 diff --git a/src/JT808.Protocol/Enums/JT808Version.cs b/src/JT808.Protocol/Enums/JT808Version.cs index 1685029..77b341b 100644 --- a/src/JT808.Protocol/Enums/JT808Version.cs +++ b/src/JT808.Protocol/Enums/JT808Version.cs @@ -17,5 +17,9 @@ namespace JT808.Protocol.Enums /// 2019 /// JTT2019=2, + /// + /// 强制2013 + /// + JTT2013Force = 99 } } diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index ceb5f7e..56f5164 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -1606,6 +1606,11 @@ 2019 + + + 强制2013 + + JT808异常处理类 diff --git a/src/JT808.Protocol/JT808Package.cs b/src/JT808.Protocol/JT808Package.cs index 32ef8f7..abc348a 100644 --- a/src/JT808.Protocol/JT808Package.cs +++ b/src/JT808.Protocol/JT808Package.cs @@ -104,19 +104,26 @@ namespace JT808.Protocol jT808Package.Header.MsgId = reader.ReadUInt16(); // 3.2.读取消息体属性 jT808Package.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(reader.ReadUInt16()); - if (reader.Version == JT808Version.JTT2019 || jT808Package.Header.MessageBodyProperty.VersionFlag) + if (reader.Version == JT808Version.JTT2013Force) { - //2019版本 - jT808Package.Header.ProtocolVersion = reader.ReadByte(); - // 3.4.读取终端手机号 - jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim); - reader.Version = JT808Version.JTT2019; - } - else - { - //2013版本 - // 3.3.读取终端手机号 jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); + reader.Version = JT808Version.JTT2013; + } + else { + if (reader.Version == JT808Version.JTT2019 || jT808Package.Header.MessageBodyProperty.VersionFlag) + { + //2019版本 + jT808Package.Header.ProtocolVersion = reader.ReadByte(); + // 3.4.读取终端手机号 + jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim); + reader.Version = JT808Version.JTT2019; + } + else + { + //2013版本 + // 3.3.读取终端手机号 + jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); + } } // 3.4.读取消息流水号 jT808Package.Header.MsgNum = reader.ReadUInt16(); @@ -279,24 +286,7 @@ namespace JT808.Protocol writer.WriteStartObject("消息体属性对象"); ReadOnlySpan messageBodyPropertyReadOnlySpan = messageBodyPropertyValue.ReadBinary(); writer.WriteNumber($"[{messageBodyPropertyReadOnlySpan.ToString()}]消息体属性", messageBodyPropertyValue); - if (reader.Version == JT808Version.JTT2019 || headerMessageBodyProperty.VersionFlag) - { - reader.Version = JT808Version.JTT2019; - writer.WriteNumber("[bit15]保留", 0); - writer.WriteBoolean("[bit14]协议版本标识", headerMessageBodyProperty.VersionFlag); - writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage); - writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString()); - writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength); - //消息体属性对象 结束 - writer.WriteEndObject(); - //2019版本 - var protocolVersion = reader.ReadByte(); - writer.WriteNumber($"[{protocolVersion.ReadNumber()}]协议版本号(2019)", protocolVersion); - // 3.4.读取终端手机号 - var terminalPhoneNo = reader.ReadBCD(20, config.Trim); - writer.WriteString($"[{terminalPhoneNo.PadLeft(20, '0')}]终端手机号", terminalPhoneNo); - } - else + if (reader.Version == JT808Version.JTT2013Force) { reader.Version = JT808Version.JTT2013; writer.WriteNumber("[bit15]保留", 0); @@ -311,6 +301,41 @@ namespace JT808.Protocol //消息体属性对象 结束 writer.WriteString($"[{terminalPhoneNo.PadLeft(config.TerminalPhoneNoLength, '0')}]终端手机号", terminalPhoneNo); } + else { + if (reader.Version == JT808Version.JTT2019 || headerMessageBodyProperty.VersionFlag) + { + reader.Version = JT808Version.JTT2019; + writer.WriteNumber("[bit15]保留", 0); + writer.WriteBoolean("[bit14]协议版本标识", headerMessageBodyProperty.VersionFlag); + writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage); + writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString()); + writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength); + //消息体属性对象 结束 + writer.WriteEndObject(); + //2019版本 + var protocolVersion = reader.ReadByte(); + writer.WriteNumber($"[{protocolVersion.ReadNumber()}]协议版本号(2019)", protocolVersion); + // 3.4.读取终端手机号 + var terminalPhoneNo = reader.ReadBCD(20, config.Trim); + writer.WriteString($"[{terminalPhoneNo.PadLeft(20, '0')}]终端手机号", terminalPhoneNo); + } + else + { + reader.Version = JT808Version.JTT2013; + writer.WriteNumber("[bit15]保留", 0); + writer.WriteNumber("[bit14]保留", 0); + writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage); + writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString()); + writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength); + writer.WriteEndObject(); + //2013版本 + // 3.3.读取终端手机号 + var terminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, false); + //消息体属性对象 结束 + writer.WriteString($"[{terminalPhoneNo.PadLeft(config.TerminalPhoneNoLength, '0')}]终端手机号", terminalPhoneNo); + } + } + // 3.4.读取消息流水号 var msgNum = reader.ReadUInt16(); writer.WriteNumber($"[{msgNum.ReadNumber()}]消息流水号", msgNum);