Просмотр исходного кода

由于有些设备不按规矩来,明明是2013协议的,却在协议头部的版本标识中打上2019的标识,导致协议无法解析,此处添加协议强制解析成2013

tags/v2.4.1
waterliu99 3 лет назад
Родитель
Сommit
15f3b155d0
4 измененных файлов: 79 добавлений и 29 удалений
  1. +16
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs
  2. +4
    -0
      src/JT808.Protocol/Enums/JT808Version.cs
  3. +5
    -0
      src/JT808.Protocol/JT808.Protocol.xml
  4. +54
    -29
      src/JT808.Protocol/JT808Package.cs

+ 16
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs Просмотреть файл

@@ -310,6 +310,22 @@ namespace JT808.Protocol.Test.MessageBody
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil);
}
[Fact]
public void Test5_3()
{
byte[] bytes = "7e0100402d01003000067906ff000000003730393639455632350000000000000000000000000000000030303030363739090000000000000000cf7e".ToHexBytes();
var jT808Package = JT808Serializer.Deserialize<JT808Package>(bytes,JT808Version.JTT2013Force);
jT808Package.Header.ProtocolVersion = 0;//修改成 2013协议标识
var newBytes = JT808Serializer.Serialize(jT808Package);//重新序列化
var jt808PackageNew = JT808Serializer.Deserialize(newBytes);//验证是否修改标识符成功
Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId);
}
[Fact]
public void Test5_4()
{
byte[] bytes = "7e0200406c010030000681090e00000000000c0003026c936f074c794c0004036300d7210625155739010400000000052801cc00210625155739054145bbc91e4145a2fa1141450000004145bbc8194145a1370a4145000000240200002a0200002b04000000003001153101125f0a89860418231870850620757e".ToHexBytes();
var json = JT808Serializer.Analyze(bytes, JT808Version.JTT2013Force);
}
[Fact]
public void Test6()
{
JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200


+ 4
- 0
src/JT808.Protocol/Enums/JT808Version.cs Просмотреть файл

@@ -17,5 +17,9 @@ namespace JT808.Protocol.Enums
/// 2019
/// </summary>
JTT2019=2,
/// <summary>
/// 强制2013
/// </summary>
JTT2013Force = 99
}
}

+ 5
- 0
src/JT808.Protocol/JT808.Protocol.xml Просмотреть файл

@@ -1606,6 +1606,11 @@
2019
</summary>
</member>
<member name="F:JT808.Protocol.Enums.JT808Version.JTT2013Force">
<summary>
强制2013
</summary>
</member>
<member name="T:JT808.Protocol.Exceptions.JT808Exception">
<summary>
JT808异常处理类


+ 54
- 29
src/JT808.Protocol/JT808Package.cs Просмотреть файл

@@ -104,19 +104,26 @@ namespace JT808.Protocol
jT808Package.Header.MsgId = reader.ReadUInt16();
// 3.2.读取消息体属性
jT808Package.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(reader.ReadUInt16());
if (reader.Version == JT808Version.JTT2019 || jT808Package.Header.MessageBodyProperty.VersionFlag)
if (reader.Version == JT808Version.JTT2013Force)
{
//2019版本
jT808Package.Header.ProtocolVersion = reader.ReadByte();
// 3.4.读取终端手机号
jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim);
reader.Version = JT808Version.JTT2019;
}
else
{
//2013版本
// 3.3.读取终端手机号
jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim);
reader.Version = JT808Version.JTT2013;
}
else {
if (reader.Version == JT808Version.JTT2019 || jT808Package.Header.MessageBodyProperty.VersionFlag)
{
//2019版本
jT808Package.Header.ProtocolVersion = reader.ReadByte();
// 3.4.读取终端手机号
jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim);
reader.Version = JT808Version.JTT2019;
}
else
{
//2013版本
// 3.3.读取终端手机号
jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim);
}
}
// 3.4.读取消息流水号
jT808Package.Header.MsgNum = reader.ReadUInt16();
@@ -279,24 +286,7 @@ namespace JT808.Protocol
writer.WriteStartObject("消息体属性对象");
ReadOnlySpan<char> messageBodyPropertyReadOnlySpan = messageBodyPropertyValue.ReadBinary();
writer.WriteNumber($"[{messageBodyPropertyReadOnlySpan.ToString()}]消息体属性", messageBodyPropertyValue);
if (reader.Version == JT808Version.JTT2019 || headerMessageBodyProperty.VersionFlag)
{
reader.Version = JT808Version.JTT2019;
writer.WriteNumber("[bit15]保留", 0);
writer.WriteBoolean("[bit14]协议版本标识", headerMessageBodyProperty.VersionFlag);
writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage);
writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString());
writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength);
//消息体属性对象 结束
writer.WriteEndObject();
//2019版本
var protocolVersion = reader.ReadByte();
writer.WriteNumber($"[{protocolVersion.ReadNumber()}]协议版本号(2019)", protocolVersion);
// 3.4.读取终端手机号
var terminalPhoneNo = reader.ReadBCD(20, config.Trim);
writer.WriteString($"[{terminalPhoneNo.PadLeft(20, '0')}]终端手机号", terminalPhoneNo);
}
else
if (reader.Version == JT808Version.JTT2013Force)
{
reader.Version = JT808Version.JTT2013;
writer.WriteNumber("[bit15]保留", 0);
@@ -311,6 +301,41 @@ namespace JT808.Protocol
//消息体属性对象 结束
writer.WriteString($"[{terminalPhoneNo.PadLeft(config.TerminalPhoneNoLength, '0')}]终端手机号", terminalPhoneNo);
}
else {
if (reader.Version == JT808Version.JTT2019 || headerMessageBodyProperty.VersionFlag)
{
reader.Version = JT808Version.JTT2019;
writer.WriteNumber("[bit15]保留", 0);
writer.WriteBoolean("[bit14]协议版本标识", headerMessageBodyProperty.VersionFlag);
writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage);
writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString());
writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength);
//消息体属性对象 结束
writer.WriteEndObject();
//2019版本
var protocolVersion = reader.ReadByte();
writer.WriteNumber($"[{protocolVersion.ReadNumber()}]协议版本号(2019)", protocolVersion);
// 3.4.读取终端手机号
var terminalPhoneNo = reader.ReadBCD(20, config.Trim);
writer.WriteString($"[{terminalPhoneNo.PadLeft(20, '0')}]终端手机号", terminalPhoneNo);
}
else
{
reader.Version = JT808Version.JTT2013;
writer.WriteNumber("[bit15]保留", 0);
writer.WriteNumber("[bit14]保留", 0);
writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage);
writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString());
writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength);
writer.WriteEndObject();
//2013版本
// 3.3.读取终端手机号
var terminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, false);
//消息体属性对象 结束
writer.WriteString($"[{terminalPhoneNo.PadLeft(config.TerminalPhoneNoLength, '0')}]终端手机号", terminalPhoneNo);
}
}

// 3.4.读取消息流水号
var msgNum = reader.ReadUInt16();
writer.WriteNumber($"[{msgNum.ReadNumber()}]消息流水号", msgNum);


Загрузка…
Отмена
Сохранить