diff --git a/src/JT808.Protocol.Test/JT808HeaderPackageTest.cs b/src/JT808.Protocol.Test/JT808HeaderPackageTest.cs index 6a7ba34..4e14d24 100644 --- a/src/JT808.Protocol.Test/JT808HeaderPackageTest.cs +++ b/src/JT808.Protocol.Test/JT808HeaderPackageTest.cs @@ -19,9 +19,9 @@ namespace JT808.Protocol.Test var data1_1 = data1.Bodies; var data2 = JT808Serializer.HeaderDeserialize("7E1205203804066657506200EC000200020120121900163320121900360700000000000000000001010F0CE4CD0120121900002220121900163300000000000000000001010C6F9E7B5D7E".ToHexBytes()); var data2_1 = data2.Bodies; - Assert.Equal(data1.Bodies.ToArray(), data1_1); - Assert.Equal(data2.Bodies.ToArray(), data2_1); - var realBody = data1.Bodies.ToArray().Concat(data2.Bodies.ToArray()).ToArray(); + Assert.Equal(data1.Bodies, data1_1); + Assert.Equal(data2.Bodies, data2_1); + var realBody = data1.Bodies.Concat(data2.Bodies).ToArray(); } [Fact] @@ -30,5 +30,14 @@ namespace JT808.Protocol.Test var json1 = JT808Serializer.Analyze("7E120523A204066657506200EB00020001015A00000023012012191042052012191050190000000000000000000101064446D10120121910221720121910420500000000000000000001010F1FE8EB0120121910023420121910221700000000000000000001010F182D5C0120121909471120121910015500000000000000000001010B38F2430120121909274020121909471100000000000000000001010F056DB40120121909080920121909274000000000000000000001010F0724380120121908483820121909080900000000000000000001010F0530AB0120121908290720121908483800000000000000000001010F05896C0120121908093720121908290700000000000000000001010F02CD3B0120121907500520121908093700000000000000000001010F056FEF0120121907303420121907500500000000000000000001010F043C3401201219072541201219073034000000000000000000010103C26C5F0120121907061120121907254100000000000000000001010F03F0C10120121906464220121907061100000000000000000001010F02F6330120121906271220121906464200000000000000000001010F02E43B0120121906074220121906271200000000000000000001010F033D670120121905481120121906074200000000000000000001010F088BF20120121905284120121905481100000000000000000001010F03F9FE0120121905091020121905284100000000000000000001010F05B1040120121904494020121905091000000000000000000001010F02B3540120121904301020121904494000000000000000000001010F0417B00120121904103920121904301000000000000000000001010F0538970120121903510820121904103900000000000000000001010F054E9E0120121903313820121903510800000000000000000001010F016ECB0120121903120820121903313800000000000000000001010F0333C00120121902523820121903120700000000000000000001010F029D230120121902330720121902523700000000000000000001010F0354E40120121902133720121902330700000000000000000001010F03303D0120121901540720121902133700000000000000000001010F04981E0120121901343720121901540700000000000000000001010F02AD940120121901150820121901343700000000000000000001010EFFD7CF0120121900553720121901150800000000000000000001010F07D9330120121900360720121900553700000000000000000001010F040E740C7E".ToHexBytes()); var json2 = JT808Serializer.Analyze("7E1205203804066657506200EC000200020120121900163320121900360700000000000000000001010F0CE4CD0120121900002220121900163300000000000000000001010C6F9E7B5D7E".ToHexBytes()); } + + [Fact] + public void Test3() + { + var pack1 = JT808Serializer.HeaderDeserialize("7E120523A204066657506200EB00020001015A00000023012012191042052012191050190000000000000000000101064446D10120121910221720121910420500000000000000000001010F1FE8EB0120121910023420121910221700000000000000000001010F182D5C0120121909471120121910015500000000000000000001010B38F2430120121909274020121909471100000000000000000001010F056DB40120121909080920121909274000000000000000000001010F0724380120121908483820121909080900000000000000000001010F0530AB0120121908290720121908483800000000000000000001010F05896C0120121908093720121908290700000000000000000001010F02CD3B0120121907500520121908093700000000000000000001010F056FEF0120121907303420121907500500000000000000000001010F043C3401201219072541201219073034000000000000000000010103C26C5F0120121907061120121907254100000000000000000001010F03F0C10120121906464220121907061100000000000000000001010F02F6330120121906271220121906464200000000000000000001010F02E43B0120121906074220121906271200000000000000000001010F033D670120121905481120121906074200000000000000000001010F088BF20120121905284120121905481100000000000000000001010F03F9FE0120121905091020121905284100000000000000000001010F05B1040120121904494020121905091000000000000000000001010F02B3540120121904301020121904494000000000000000000001010F0417B00120121904103920121904301000000000000000000001010F0538970120121903510820121904103900000000000000000001010F054E9E0120121903313820121903510800000000000000000001010F016ECB0120121903120820121903313800000000000000000001010F0333C00120121902523820121903120700000000000000000001010F029D230120121902330720121902523700000000000000000001010F0354E40120121902133720121902330700000000000000000001010F03303D0120121901540720121902133700000000000000000001010F04981E0120121901343720121901540700000000000000000001010F02AD940120121901150820121901343700000000000000000001010EFFD7CF0120121900553720121901150800000000000000000001010F07D9330120121900360720121900553700000000000000000001010F040E740C7E".ToHexBytes()); + var pack2 = JT808Serializer.HeaderDeserialize("7E1205203804066657506200EC000200020120121900163320121900360700000000000000000001010F0CE4CD0120121900002220121900163300000000000000000001010C6F9E7B5D7E".ToHexBytes()); + var realBody = pack1.Bodies.Concat(pack2.Bodies).ToArray(); + var json=JT808Serializer.Analyze(pack1.Header.MsgId, realBody); + } } } diff --git a/src/JT808.Protocol/JT808.Protocol.csproj b/src/JT808.Protocol/JT808.Protocol.csproj index b834baa..38902e1 100644 --- a/src/JT808.Protocol/JT808.Protocol.csproj +++ b/src/JT808.Protocol/JT808.Protocol.csproj @@ -1,6 +1,6 @@  - netstandard2.0;netstandard2.1;net5; + netstandard2.0;netstandard2.1;net5.0; 9.0 Copyright 2018. SmallChi @@ -15,7 +15,7 @@ https://github.com/SmallChi/JT808/blob/master/LICENSE JT808.Protocol.xml false - 2.3.3 + 2.3.4 LICENSE latest true diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index 1ae4886..693c551 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -3477,6 +3477,28 @@ + + + 用于分包组合 + + 对应消息id + 组合的数据体 + 对应版本号 + 序列化选项 + 默认65535 + + + + + 用于分包组合 + + 对应消息id + 组合的数据体 + 对应版本号 + 序列化选项 + 默认65535 + + 采集记录仪执行标准版本 diff --git a/src/JT808.Protocol/JT808Serializer.cs b/src/JT808.Protocol/JT808Serializer.cs index 4367199..bd5b07d 100644 --- a/src/JT808.Protocol/JT808Serializer.cs +++ b/src/JT808.Protocol/JT808Serializer.cs @@ -213,6 +213,85 @@ namespace JT808.Protocol } } + /// + /// 用于分包组合 + /// + /// 对应消息id + /// 组合的数据体 + /// 对应版本号 + /// 序列化选项 + /// 默认65535 + /// + public string Analyze(ushort msgid,ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 65535) + { + byte[] buffer = JT808ArrayPool.Rent(minBufferSize); + try + { + if(jT808Config.MsgIdFactory.TryGetValue(msgid,out object msgHandle)) + { + if (jT808Config.FormatterFactory.FormatterDict.TryGetValue(msgHandle.GetType().GUID, out object instance)) + { + using (MemoryStream memoryStream = new MemoryStream()) + using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) + { + JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); + utf8JsonWriter.WriteStartObject(); + instance.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); + utf8JsonWriter.WriteEndObject(); + utf8JsonWriter.Flush(); + string value = Encoding.UTF8.GetString(memoryStream.ToArray()); + return value; + } + } + return $"未找到对应的0x{msgid.ToString("X2")}消息数据体类型"; + } + return $"未找到对应的0x{msgid.ToString("X2")}消息数据体类型"; + } + finally + { + JT808ArrayPool.Return(buffer); + } + } + + /// + /// 用于分包组合 + /// + /// 对应消息id + /// 组合的数据体 + /// 对应版本号 + /// 序列化选项 + /// 默认65535 + /// + public byte[] AnalyzeJsonBuffer(ushort msgid, ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 65535) + { + byte[] buffer = JT808ArrayPool.Rent(minBufferSize); + try + { + if (jT808Config.MsgIdFactory.TryGetValue(msgid, out object msgHandle)) + { + if (jT808Config.FormatterFactory.FormatterDict.TryGetValue(msgHandle.GetType().GUID, out object instance)) + { + using (MemoryStream memoryStream = new MemoryStream()) + using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) + { + JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); + utf8JsonWriter.WriteStartObject(); + instance.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); + utf8JsonWriter.WriteEndObject(); + utf8JsonWriter.Flush(); + return memoryStream.ToArray(); + } + } + return Encoding.UTF8.GetBytes($"未找到对应的0x{msgid.ToString("X2")}消息数据体类型"); + } + return Encoding.UTF8.GetBytes($"未找到对应的0x{msgid.ToString("X2")}消息数据体类型"); + } + finally + { + JT808ArrayPool.Return(buffer); + } + } + public byte[] AnalyzeJsonBuffer(ReadOnlySpan bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 8096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize);