From 5a1206f50a086eabe7efd9ab8ddbf8072438590a Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Wed, 28 Oct 2020 15:08:01 +0800 Subject: [PATCH] =?UTF-8?q?v2.2.14=20=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8C=85=E5=88=86=E6=9E=90=E5=99=A8=E7=9A=84=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=8F=8A=E5=AF=B9=E5=BA=94=E7=9A=84=E5=BC=82=E5=B8=B8=E8=BE=93?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageBody/JT808_0x0100Test.cs | 7 +++ src/JT808.Protocol/JT808.Protocol.csproj | 2 +- src/JT808.Protocol/JT808Package.cs | 59 +++++++++++++++---- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs index 8925a07..ca8441b 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs @@ -54,6 +54,13 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal("smallchi123000000000", JT808Bodies.TerminalModel); } + [Fact] + public void Test1_2() + { + byte[] bytes = "7E01000022040666575073004A00000000373231303447354C00000000003430363636353702D5E3483137323030000F7E".ToHexBytes(); + string json = JT808Serializer.Analyze(bytes); + } + [Fact] public void Test2019_1() { diff --git a/src/JT808.Protocol/JT808.Protocol.csproj b/src/JT808.Protocol/JT808.Protocol.csproj index ca4a3cd..556fc4a 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.13 + 2.2.14 LICENSE diff --git a/src/JT808.Protocol/JT808Package.cs b/src/JT808.Protocol/JT808Package.cs index 7938d33..bff54fa 100644 --- a/src/JT808.Protocol/JT808Package.cs +++ b/src/JT808.Protocol/JT808Package.cs @@ -5,6 +5,7 @@ using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; +using System.Runtime.InteropServices; using System.Text.Json; namespace JT808.Protocol @@ -12,7 +13,7 @@ namespace JT808.Protocol /// /// JT808数据包 /// - public class JT808Package:IJT808MessagePackFormatter, IJT808Analyze + public class JT808Package : IJT808MessagePackFormatter, IJT808Analyze { /// /// 起始符 @@ -123,7 +124,7 @@ namespace JT808.Protocol // 4.1.判断有无数据体 if (jT808Package.Header.MessageBodyProperty.DataLength > 0) { - if(config.MsgIdFactory.TryGetValue(jT808Package.Header.MsgId,out object instance)) + if (config.MsgIdFactory.TryGetValue(jT808Package.Header.MsgId, out object instance)) { if (jT808Package.Header.MessageBodyProperty.IsPackage) { @@ -262,7 +263,7 @@ namespace JT808.Protocol var msgid = reader.ReadUInt16(); writer.WriteNumber($"[{msgid.ReadNumber()}]消息Id", msgid); ushort messageBodyPropertyValue = reader.ReadUInt16(); - var headerMessageBodyProperty=new JT808HeaderMessageBodyProperty(messageBodyPropertyValue); + var headerMessageBodyProperty = new JT808HeaderMessageBodyProperty(messageBodyPropertyValue); //消息体属性对象 开始 writer.WriteStartObject("消息体属性对象"); ReadOnlySpan messageBodyPropertyReadOnlySpan = messageBodyPropertyValue.ReadBinary(); @@ -270,7 +271,7 @@ namespace JT808.Protocol if (headerMessageBodyProperty.VersionFlag) { reader.Version = JT808Version.JTT2019; - writer.WriteNumber( "[bit15]保留", 0); + writer.WriteNumber("[bit15]保留", 0); writer.WriteBoolean("[bit14]协议版本标识", headerMessageBodyProperty.VersionFlag); writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage); writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString()); @@ -303,7 +304,7 @@ namespace JT808.Protocol var msgNum = reader.ReadUInt16(); writer.WriteNumber($"[{msgNum.ReadNumber()}]消息流水号", msgNum); // 3.5.判断有无分包 - uint packgeCount=0, packageIndex=0; + uint packgeCount = 0, packageIndex = 0; if (headerMessageBodyProperty.IsPackage) { //3.5.1.读取消息包总数 @@ -345,12 +346,21 @@ namespace JT808.Protocol { try { + //数据体长度正常 writer.WriteString($"[分包]{description}", reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength()).ToArray().ToHexString()); if (instance is IJT808Analyze analyze) { //4.2.处理消息体 analyze.Analyze(ref reader, writer, config); - } + } + } + catch (IndexOutOfRangeException ex) + { + writer.WriteString($"数据体解析异常,无可用数据体进行解析", ex.StackTrace); + } + catch (ArgumentOutOfRangeException ex) + { + writer.WriteString($"[分包]数据体解析异常,无可用数据体进行解析", ex.StackTrace); } catch (Exception ex) { @@ -362,6 +372,7 @@ namespace JT808.Protocol { try { + //数据体长度正常 writer.WriteString($"{description}", reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength()).ToArray().ToHexString()); if (instance is IJT808Analyze analyze) { @@ -369,6 +380,14 @@ namespace JT808.Protocol analyze.Analyze(ref reader, writer, config); } } + catch(IndexOutOfRangeException ex) + { + writer.WriteString($"数据体解析异常,无可用数据体进行解析", ex.StackTrace); + } + catch (ArgumentOutOfRangeException ex) + { + writer.WriteString($"数据体解析异常,无可用数据体进行解析", ex.StackTrace); + } catch (Exception ex) { writer.WriteString($"数据体异常", ex.StackTrace); @@ -403,13 +422,27 @@ namespace JT808.Protocol writer.WriteNull($"[Null]数据体"); } } - // 5.读取校验码 - reader.ReadByte(); - writer.WriteNumber($"[{reader.RealCheckXorCode.ReadNumber()}]校验码", reader.RealCheckXorCode); - // 6.读取终止位置 - byte end = reader.ReadEnd(); - writer.WriteNumber($"[{end.ReadNumber()}]结束", end); - writer.WriteEndObject(); + try + { + // 5.读取校验码 + reader.ReadByte(); + writer.WriteNumber($"[{reader.RealCheckXorCode.ReadNumber()}]校验码", reader.RealCheckXorCode); + // 6.读取终止位置 + byte end = reader.ReadEnd(); + writer.WriteNumber($"[{end.ReadNumber()}]结束", end); + } + catch (ArgumentOutOfRangeException ex) + { + writer.WriteString($"数据解析异常,无可用数据进行解析", ex.StackTrace); + } + catch (Exception ex) + { + writer.WriteString($"数据解析异常", ex.StackTrace); + } + finally + { + writer.WriteEndObject(); + } } } }