Преглед изворни кода

自动合并分包功能兼容乱序数据

tags/v2.6.2
yedajiang44 пре 2 година
родитељ
комит
b4e6bf9733
4 измењених фајлова са 33 додато и 19 уклоњено
  1. +1
    -1
      .github/workflows/dotnetcore.yml
  2. +4
    -0
      README.md
  3. +6
    -2
      src/JT808.Protocol.Test/JT808SerializerTest.cs
  4. +22
    -16
      src/JT808.Protocol/Internal/DefaultMerger.cs

+ 1
- 1
.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


+ 4
- 0
README.md Прегледај датотеку

@@ -374,8 +374,12 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config);
场景:
由于接入很多不同设备厂商的协议,但是每个协议对接又比较少,想同时放在一个类库下面进行统一管理,那么在各个厂家不冲突的情况下使用程序集方式的注册是没有问题的,一旦有冲突,那么使用程序集的方式进行注册会报 Id 冲突,本身库不支持这种方式进行隔离的,所以遇到这种情况自己使用 SetMap 的方式进行管理。

## 实验功能

### 自动合并分包

> 启用该选项存在一定风险,请谨慎使用。

场景:
当数据体超过协议规定的 1023 个字节时,设备将会以分包的形式发送给服务,此时服务需要进行合并后才能正常解析



+ 6
- 2
src/JT808.Protocol.Test/JT808SerializerTest.cs Прегледај датотеку

@@ -49,17 +49,21 @@ namespace JT808.Protocol.Test
[Fact]
public void MergerTest()
{
var index = 0;
new List<string>
{
//分包数据第二包
"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);
}


+ 22
- 16
src/JT808.Protocol/Internal/DefaultMerger.cs Прегледај датотеку

@@ -18,29 +18,35 @@ namespace JT808.Protocol.Internal
/// <inheritdoc/>
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<JT808Bodies>(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<JT808Bodies>(ref reader, config);
return true;
}
}
return default;
finally
{
JT808ArrayPool.Return(buffer);
}
}
else
{


Loading…
Откажи
Сачувај