From b4e6bf9733790428ee9ee6992d9f0ee5b85288e6 Mon Sep 17 00:00:00 2001 From: yedajiang44 <602830483@qq.com> Date: Thu, 20 Apr 2023 00:02:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=90=88=E5=B9=B6=E5=88=86?= =?UTF-8?q?=E5=8C=85=E5=8A=9F=E8=83=BD=E5=85=BC=E5=AE=B9=E4=B9=B1=E5=BA=8F?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dotnetcore.yml | 2 +- README.md | 4 ++ .../JT808SerializerTest.cs | 8 +++- src/JT808.Protocol/Internal/DefaultMerger.cs | 38 +++++++++++-------- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 0fb89ca..7a045f5 100755 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -12,7 +12,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@master with: - dotnet-version: 7.0.5 + dotnet-version: 7.0.203 - name: dotnet info run: dotnet --info - name: dotnet restore diff --git a/README.md b/README.md index c1fee64..6036e89 100644 --- a/README.md +++ b/README.md @@ -374,8 +374,12 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); 场景: 由于接入很多不同设备厂商的协议,但是每个协议对接又比较少,想同时放在一个类库下面进行统一管理,那么在各个厂家不冲突的情况下使用程序集方式的注册是没有问题的,一旦有冲突,那么使用程序集的方式进行注册会报 Id 冲突,本身库不支持这种方式进行隔离的,所以遇到这种情况自己使用 SetMap 的方式进行管理。 +## 实验功能 + ### 自动合并分包 +> 启用该选项存在一定风险,请谨慎使用。 + 场景: 当数据体超过协议规定的 1023 个字节时,设备将会以分包的形式发送给服务,此时服务需要进行合并后才能正常解析 diff --git a/src/JT808.Protocol.Test/JT808SerializerTest.cs b/src/JT808.Protocol.Test/JT808SerializerTest.cs index 7e66f8c..80ba596 100644 --- a/src/JT808.Protocol.Test/JT808SerializerTest.cs +++ b/src/JT808.Protocol.Test/JT808SerializerTest.cs @@ -49,17 +49,21 @@ namespace JT808.Protocol.Test [Fact] public void MergerTest() { + var index = 0; new List { + //分包数据第二包 + "7E010420D301127540038104E2000200020000007A04000000000000007B0200000000007C1400000000000000000000000000000000000000000000F364381E06000E1007D003020101FFFFFFFFFFFFFFFFFF0000000302000000060302320503021B320503021E320503020A320503020302FFFFFFFF0000F365311E06000E1007D003020101FFFFFFFF00000007012C0078FFFFFF320503023205030232050302320503023205030200FFFF0000FF010537303231380000FF02144B352D50000000000000000000000000000000000000F373040BB80BB80000FF0006FEEA4C0510BD1F7E", + //分包数据第一包 "7E010423F001127540038104D10002000100006B00000001040000025800000002040000000A00000003040000000500000004040000000A0000000504000000050000000604000000000000000704000000000000001005434D4E455400000011000000001200000000130D3232322E3138342E32362E323200000014000000001500000000160000000017000000001804000007E50000001904000007E50000002304000000000000002404000000000000002504000000000000002604000000000000003204000005000000001A000000001B04000000000000001C04000000000000001D0000000020040000000000000021040000000000000022040000012C000000270400001C2000000028040000001E00000029040000001E0000002C04000001F40000002D04000001F40000002E04000001F40000002F04000000C800000030040000001E000000310201F4000000400000000041000000004200000000430000000044000000004504000000010000004604FFFFFFFF0000004704FFFFFFFF0000004800000000490000000050040363160800000051040000000000000052040000000100000053040000000000000054040000000000000055040000000000000056040000001E0000005704000038400000005804000070800000005904000004B00000005A0400000E100000005B0200000000005C0207080000005D0224000000005E02001E00000064040000010100000065040000000000000070040000000500000071040000007F00000072040000004000000073040000004000000074040000007F00000080040004B9930000008102000000000082020000000000830CB2E2CAD4CAD3C6B5B3B5C1BE00000084010000000090010300000091010100000092010000000093040000000100000094010000000095040000000000000100040000000000000101020000000001020400000000000001030200000000C11204000000050000C11304000000050000C11404000000030000C11504000000000000C1160200000000C1170200000000C118033200030000C119030000000000CB00040000000200000075150103001E0F00000100000300191900000400002B00000000761B05000101010000020200000303000004040000050500000606020000000077A908010103001E0F00000100000300191900000400002B020103001E0F00000100000300191900000400002B030103001E0F00000100000300191900000400002B040103001E0F00000100000300191900000400002B050103001E0F00000100000300191900000400002B060103001E0F00000100000300191900000400002B070103001E0F00000100000300191900000400002B080103001E0F00000100000300191900000400002B0000007903140501C17E", - "7E010420D301127540038104E2000200020000007A04000000000000007B0200000000007C1400000000000000000000000000000000000000000000F364381E06000E1007D003020101FFFFFFFFFFFFFFFFFF0000000302000000060302320503021B320503021E320503020A320503020302FFFFFFFF0000F365311E06000E1007D003020101FFFFFFFF00000007012C0078FFFFFF320503023205030232050302320503023205030200FFFF0000FF010537303231380000FF02144B352D50000000000000000000000000000000000000F373040BB80BB80000FF0006FEEA4C0510BD1F7E" } .ForEach(data => { + index++; var config = new DefaultGlobalConfig(); config.EnableAutoMerge = true; var package = config.GetSerializer().Deserialize(data.ToHexBytes()); - if (package.Header.PackageIndex == package.Header.PackgeCount) + if (index == package.Header.PackgeCount) { Assert.NotNull(package.Bodies); } diff --git a/src/JT808.Protocol/Internal/DefaultMerger.cs b/src/JT808.Protocol/Internal/DefaultMerger.cs index c7e2b1a..6bf4b03 100644 --- a/src/JT808.Protocol/Internal/DefaultMerger.cs +++ b/src/JT808.Protocol/Internal/DefaultMerger.cs @@ -18,29 +18,35 @@ namespace JT808.Protocol.Internal /// public bool TryMerge(JT808Header header, byte[] data, IJT808Config config, out JT808Bodies body) { + // TODO: 添加SplitPackages缓存超时,达到阈值时移除该项缓存 body = null; - if (header.PackageIndex == header.PackgeCount) + + if (SplitPackages.TryGetValue(header.TerminalPhoneNo, out var item) && item.TryGetValue(header.MsgId, out var packages)) { - if (SplitPackages.TryRemove(header.TerminalPhoneNo, out var item) && item.TryRemove(header.MsgId, out var packages)) + packages.Add((header.PackageIndex, data)); + if (packages.Count != header.PackgeCount) { - var mateData = packages.OrderBy(x => x.index).SelectMany(x => x.data).Concat(data).ToArray(); + return false; + } + item.TryRemove(header.MsgId, out _); + SplitPackages.TryRemove(header.TerminalPhoneNo, out _); - byte[] buffer = JT808ArrayPool.Rent(mateData.Length); - try - { - var reader = new JT808MessagePackReader(mateData, (Enums.JT808Version)header.ProtocolVersion); - if (config.MsgIdFactory.TryGetValue(header.MsgId, out var value) && value is JT808Bodies instance) - { - body = instance.DeserializeExt(ref reader, config); - return true; - } - } - finally + var mateData = packages.OrderBy(x => x.index).SelectMany(x => x.data).Concat(data).ToArray(); + + byte[] buffer = JT808ArrayPool.Rent(mateData.Length); + try + { + var reader = new JT808MessagePackReader(mateData, (Enums.JT808Version)header.ProtocolVersion); + if (config.MsgIdFactory.TryGetValue(header.MsgId, out var value) && value is JT808Bodies instance) { - JT808ArrayPool.Return(buffer); + body = instance.DeserializeExt(ref reader, config); + return true; } } - return default; + finally + { + JT808ArrayPool.Return(buffer); + } } else {