瀏覽代碼

v2.2.14

完善数据包分析器的解析及对应的异常输出
tags/v2.2.14
SmallChi(Koike) 4 年之前
父節點
當前提交
5a1206f50a
共有 3 個檔案被更改,包括 54 行新增14 行删除
  1. +7
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs
  2. +1
    -1
      src/JT808.Protocol/JT808.Protocol.csproj
  3. +46
    -13
      src/JT808.Protocol/JT808Package.cs

+ 7
- 0
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()
{


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

@@ -14,7 +14,7 @@
<licenseUrl>https://github.com/SmallChi/JT808/blob/master/LICENSE</licenseUrl>
<license>https://github.com/SmallChi/JT808/blob/master/LICENSE</license>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>2.2.13</Version>
<Version>2.2.14</Version>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">


+ 46
- 13
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
/// <summary>
/// JT808数据包
/// </summary>
public class JT808Package:IJT808MessagePackFormatter<JT808Package>, IJT808Analyze
public class JT808Package : IJT808MessagePackFormatter<JT808Package>, IJT808Analyze
{
/// <summary>
/// 起始符
@@ -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<char> 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();
}
}
}
}

Loading…
取消
儲存