瀏覽代碼

2.3.4

支持分包组包之后根据消息Id进行分析解析
tags/v2.3.4
SmallChi(Koike) 4 年之前
父節點
當前提交
75c4bcf230
共有 4 個文件被更改,包括 115 次插入5 次删除
  1. +12
    -3
      src/JT808.Protocol.Test/JT808HeaderPackageTest.cs
  2. +2
    -2
      src/JT808.Protocol/JT808.Protocol.csproj
  3. +22
    -0
      src/JT808.Protocol/JT808.Protocol.xml
  4. +79
    -0
      src/JT808.Protocol/JT808Serializer.cs

+ 12
- 3
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);
}
}
}

+ 2
- 2
src/JT808.Protocol/JT808.Protocol.csproj 查看文件

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net5;</TargetFrameworks>
<TargetFrameworks>netstandard2.0;netstandard2.1;net5.0;</TargetFrameworks>
<LangVersion>9.0</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<Authors>SmallChi</Authors>
@@ -15,7 +15,7 @@
<license>https://github.com/SmallChi/JT808/blob/master/LICENSE</license>
<DocumentationFile>JT808.Protocol.xml</DocumentationFile>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>2.3.3</Version>
<Version>2.3.4</Version>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<AnalysisLevel>latest</AnalysisLevel>
<EnableNETAnalyzers>true</EnableNETAnalyzers>


+ 22
- 0
src/JT808.Protocol/JT808.Protocol.xml 查看文件

@@ -3477,6 +3477,28 @@
<param name="bytes"></param>
<returns></returns>
</member>
<member name="M:JT808.Protocol.JT808Serializer.Analyze(System.UInt16,System.ReadOnlySpan{System.Byte},JT808.Protocol.Enums.JT808Version,System.Text.Json.JsonWriterOptions,System.Int32)">
<summary>
用于分包组合
</summary>
<param name="msgid">对应消息id</param>
<param name="bytes">组合的数据体</param>
<param name="version">对应版本号</param>
<param name="options">序列化选项</param>
<param name="minBufferSize">默认65535</param>
<returns></returns>
</member>
<member name="M:JT808.Protocol.JT808Serializer.AnalyzeJsonBuffer(System.UInt16,System.ReadOnlySpan{System.Byte},JT808.Protocol.Enums.JT808Version,System.Text.Json.JsonWriterOptions,System.Int32)">
<summary>
用于分包组合
</summary>
<param name="msgid">对应消息id</param>
<param name="bytes">组合的数据体</param>
<param name="version">对应版本号</param>
<param name="options">序列化选项</param>
<param name="minBufferSize">默认65535</param>
<returns></returns>
</member>
<member name="T:JT808.Protocol.MessageBody.CarDVR.JT808_CarDVR_Down_0x00">
<summary>
采集记录仪执行标准版本


+ 79
- 0
src/JT808.Protocol/JT808Serializer.cs 查看文件

@@ -213,6 +213,85 @@ namespace JT808.Protocol
}
}

/// <summary>
/// 用于分包组合
/// </summary>
/// <param name="msgid">对应消息id</param>
/// <param name="bytes">组合的数据体</param>
/// <param name="version">对应版本号</param>
/// <param name="options">序列化选项</param>
/// <param name="minBufferSize">默认65535</param>
/// <returns></returns>
public string Analyze(ushort msgid,ReadOnlySpan<byte> 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);
}
}

/// <summary>
/// 用于分包组合
/// </summary>
/// <param name="msgid">对应消息id</param>
/// <param name="bytes">组合的数据体</param>
/// <param name="version">对应版本号</param>
/// <param name="options">序列化选项</param>
/// <param name="minBufferSize">默认65535</param>
/// <returns></returns>
public byte[] AnalyzeJsonBuffer(ushort msgid, ReadOnlySpan<byte> 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<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 8096)
{
byte[] buffer = JT808ArrayPool.Rent(minBufferSize);


Loading…
取消
儲存