浏览代码

1.通过大兄弟提供的809的2019版本的1200下的1205和1206测试数据进行协议修复

2.完善一下9200_9201的协议
3.增加对应协议的测试
tags/v2.2.0
SmallChi(Koike) 4 年前
父节点
当前提交
0cf2dcf20a
共有 11 个文件被更改,包括 207 次插入33 次删除
  1. +45
    -0
      src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1205Test.cs
  2. +45
    -0
      src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1206Test.cs
  3. +8
    -0
      src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9200_0x9201Test.cs
  4. +1
    -0
      src/JT809.Protocol/Enums/JT809ErrorCode.cs
  5. +5
    -0
      src/JT809.Protocol/JT809SubBodies.cs
  6. +35
    -12
      src/JT809.Protocol/MessageBody/JT809_0x1200.cs
  7. +32
    -5
      src/JT809.Protocol/MessageBody/JT809_0x9200.cs
  8. +6
    -2
      src/JT809.Protocol/MessagePack/JT809MessagePackReader.cs
  9. +14
    -7
      src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1205.cs
  10. +7
    -7
      src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1206.cs
  11. +9
    -0
      src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9201.cs

+ 45
- 0
src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1205Test.cs 查看文件

@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using JT809.Protocol;
using JT809.Protocol.Extensions;
using JT809.Protocol.MessageBody;
using JT809.Protocol.Exceptions;
using JT809.Protocol.SubMessageBody;
using JT809.Protocol.Enums;
using JT809.Protocol.Internal;

namespace JT809.Protocol.Test.JT809SubMessageBody
{
public class JT809_0x1200_0x1205Test
{
private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 });

/// <summary>
/// 1078qq群808432702:大兄弟提供的
/// </summary>
[Fact]
public void Test1()
{
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD43131313100000000000000000000000000041205040000000400000000001B735D".ToHexBytes();
JT809Package jT809Package = JT809_2019_Serializer.Deserialize(bytes);
var body = jT809Package.Bodies as JT809_0x1200;
var subBody = body.SubBodies as JT809_0x1200_0x1205;
Assert.NotNull(body);
Assert.NotNull(subBody);
Assert.Equal("测试1111", body.VehicleNo);
Assert.Equal(JT809VehicleColorType.白色, body.VehicleColor);
Assert.Equal(1024u, subBody.SourceDataType);
Assert.Equal(1024u, subBody.SourceMsgSN);
Assert.Equal(0u, subBody.DataLength);
}

[Fact]
public void Test2()
{
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD43131313100000000000000000000000000041205040000000400000000001B735D".ToHexBytes();
string json = JT809_2019_Serializer.Analyze(bytes);
}
}
}

+ 45
- 0
src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1206Test.cs 查看文件

@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using JT809.Protocol;
using JT809.Protocol.Extensions;
using JT809.Protocol.MessageBody;
using JT809.Protocol.Exceptions;
using JT809.Protocol.SubMessageBody;
using JT809.Protocol.Enums;
using JT809.Protocol.Internal;

namespace JT809.Protocol.Test.JT809SubMessageBody
{
public class JT809_0x1200_0x1206Test
{
private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 });

/// <summary>
/// 1078qq群808432702:大兄弟提供的
/// </summary>
[Fact]
public void Test1()
{
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD431313131000000000000000000000000000412060400000004000000000063895D".ToHexBytes();
JT809Package jT809Package = JT809_2019_Serializer.Deserialize(bytes);
var body = jT809Package.Bodies as JT809_0x1200;
var subBody = body.SubBodies as JT809_0x1200_0x1206;
Assert.NotNull(body);
Assert.NotNull(subBody);
Assert.Equal("测试1111", body.VehicleNo);
Assert.Equal(JT809VehicleColorType.白色, body.VehicleColor);
Assert.Equal(1024u, subBody.SourceDataType);
Assert.Equal(1024u, subBody.SourceMsgSN);
Assert.Equal(0u, subBody.DataLength);
}

[Fact]
public void Test2()
{
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD431313131000000000000000000000000000412060400000004000000000063895D".ToHexBytes();
string json = JT809_2019_Serializer.Analyze(bytes);
}
}
}

+ 8
- 0
src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9200_0x9201Test.cs 查看文件

@@ -25,6 +25,14 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
{
var bytes = "5B0000002F000004579200000004570101010000000000000000004EBC924F9201000000070400000004000189DA5D".ToHexBytes();
JT809Package jT809_0X9200_0X9201 = JT809_2019_Serializer.Deserialize(bytes);
var body = jT809_0X9200_0X9201.Bodies as JT809_0x9200;
var subBody = body.SubBodies as JT809_0x9200_0x9201;
Assert.NotNull(body);
Assert.NotNull(subBody);
Assert.Equal(JT809VehicleColorType.其他, body.VehicleColor);
Assert.Equal(JT809_0x9201_Result.审核通过_完成注册, subBody.Result);
Assert.Equal(1024u, subBody.MsgSn);
Assert.Equal(1024u, subBody.DataType);
}

/// <summary>


+ 1
- 0
src/JT809.Protocol/Enums/JT809ErrorCode.cs 查看文件

@@ -15,6 +15,7 @@ namespace JT809.Protocol.Enums
BodiesParseError=1007,
SubBodiesParseError = 1008,
GetAttributeError=1009,
ReaderRemainContentLengthError = 1010,
NotGlobalRegisterFormatterAssembly=1011,
}
}

+ 5
- 0
src/JT809.Protocol/JT809SubBodies.cs 查看文件

@@ -13,6 +13,11 @@ namespace JT809.Protocol
/// 当数据体为空的时候,使用null作为空包感觉不适合,所以就算使用空包也需要new一下来表达意思。
/// </summary>
public virtual bool SkipSerialization { get; set; } = false;
/// <summary>
/// 2019文档导致需要兼容
/// 是否跳过后续的长度
/// </summary>
public virtual bool SkipDataLength { get; set; } = false;

public abstract ushort SubMsgId { get; }



+ 35
- 12
src/JT809.Protocol/MessageBody/JT809_0x1200.cs 查看文件

@@ -5,6 +5,7 @@ using JT809.Protocol.Formatters;
using JT809.Protocol.Interfaces;
using JT809.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text.Json;

namespace JT809.Protocol.MessageBody
@@ -32,14 +33,17 @@ namespace JT809.Protocol.MessageBody
writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString());
value.SubBusinessType = reader.ReadUInt16();
writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString());
value.DataLength = reader.ReadUInt32();
writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength);
try
{
if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
{
if (instance is JT809SubBodies subBodies)
{
if (!subBodies.SkipDataLength)
{
value.DataLength = reader.ReadUInt32();
writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength);
}
if (!subBodies.SkipSerialization)
{
writer.WriteStartObject("子业务类型");
@@ -61,13 +65,16 @@ namespace JT809.Protocol.MessageBody
value.VehicleNo = reader.ReadString(21);
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
value.SubBusinessType = reader.ReadUInt16();
value.DataLength = reader.ReadUInt32();
try
{
if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
{
if (instance is JT809SubBodies subBodies)
{
if (!subBodies.SkipDataLength)
{
value.DataLength = reader.ReadUInt32();
}
if (!subBodies.SkipSerialization)
{
value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(
@@ -91,19 +98,35 @@ namespace JT809.Protocol.MessageBody
writer.WriteUInt16(value.SubBusinessType);
try
{
// 先写入内容,然后在根据内容反写内容长度
writer.Skip(4, out int subContentLengthPosition);
if (value.SubBodies != null)
if (value.SubBodies.SkipDataLength)
{
if (value.SubBodies != null)
{
if (!value.SubBodies.SkipSerialization)
{
JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
value.SubBodies,
ref writer, value.SubBodies,
config);
}
}
}
else
{
if (!value.SubBodies.SkipSerialization)
// 先写入内容,然后在根据内容反写内容长度
writer.Skip(4, out int subContentLengthPosition);
if (value.SubBodies != null)
{
JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
value.SubBodies,
ref writer, value.SubBodies,
config);
if (!value.SubBodies.SkipSerialization)
{
JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
value.SubBodies,
ref writer, value.SubBodies,
config);
}
}
writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition);
}
writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition);
}
catch(Exception ex)
{


+ 32
- 5
src/JT809.Protocol/MessageBody/JT809_0x9200.cs 查看文件

@@ -26,8 +26,19 @@ namespace JT809.Protocol.MessageBody
JT809_0x9200 value = new JT809_0x9200();
//1078qq群808432702:大兄弟提供的
//由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过
var subBusinessType = reader.ReadVirtualUInt16();
if (subBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value())
if (config.Version == JT809Version.JTT2019)
{
var subBusinessType = reader.ReadVirtualUInt16();
if (subBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value())
{
var virtualHex = reader.ReadVirtualArray(21);
value.VehicleNo = reader.ReadString(21);
writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo);
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString());
}
}
else
{
var virtualHex = reader.ReadVirtualArray(21);
value.VehicleNo = reader.ReadString(21);
@@ -63,10 +74,18 @@ namespace JT809.Protocol.MessageBody
public JT809_0x9200 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
{
JT809_0x9200 value = new JT809_0x9200();
var subBusinessType = reader.ReadVirtualUInt16();
//1078qq群808432702:大兄弟提供的
//由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过
if (subBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value())
if(config.Version== JT809Version.JTT2019)
{
var subBusinessType = reader.ReadVirtualUInt16();
if (subBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value())
{
value.VehicleNo = reader.ReadString(21);
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
}
}
else
{
value.VehicleNo = reader.ReadString(21);
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
@@ -99,7 +118,15 @@ namespace JT809.Protocol.MessageBody
{
//1078qq群808432702:大兄弟提供的
//由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过
if (value.SubBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value())
if (config.Version == JT809Version.JTT2019)
{
if (value.SubBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value())
{
writer.WriteStringPadRight(value.VehicleNo, 21);
writer.WriteByte((byte)value.VehicleColor);
}
}
else
{
writer.WriteStringPadRight(value.VehicleNo, 21);
writer.WriteByte((byte)value.VehicleColor);


+ 6
- 2
src/JT809.Protocol/MessagePack/JT809MessagePackReader.cs 查看文件

@@ -1,4 +1,5 @@
using JT809.Protocol.Buffers;
using JT809.Protocol.Exceptions;
using JT809.Protocol.Extensions;
using System;
using System.Buffers;
@@ -445,15 +446,18 @@ namespace JT809.Protocol.MessagePack
}
public int ReadCurrentRemainContentLength()
{
int len = 0;
if (_decoded)
{
len = Reader.Length - ReaderCount - 3;
//内容长度=总长度-读取的长度-3(校验码2位+终止符1位)
return Reader.Length - ReaderCount - 3;
}
else
{
return Reader.Length - ReaderCount;
len= Reader.Length - ReaderCount;
}
if (len < 0) throw new JT809Exception(Enums.JT809ErrorCode.ReaderRemainContentLengthError);
return len;
}
public void Skip(int count=1)
{


+ 14
- 7
src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1205.cs 查看文件

@@ -22,6 +22,11 @@ namespace JT809.Protocol.SubMessageBody
public override string Description => "启动车辆定位信息交换应答消息";

public override bool SkipSerialization => false;
public override bool SkipDataLength => true;
/// <summary>
/// 子业务类型标识
/// </summary>
public ushort DataType { get; set; }
/// <summary>
/// 对应启动车辆定位信息交换请求消息源子业务类型标识
/// </summary>
@@ -29,7 +34,7 @@ namespace JT809.Protocol.SubMessageBody
/// <summary>
/// 对应启动车辆定位信息交换请求消息源报文序列号
/// </summary>
public uint SourceMsgSn { get; set; }
public uint SourceMsgSN { get; set; }
/// <summary>
/// 后续数据长度 值为0x00
/// </summary>
@@ -42,8 +47,8 @@ namespace JT809.Protocol.SubMessageBody
{
value.SourceDataType = reader.ReadUInt16();
writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
value.SourceMsgSn = reader.ReadUInt32();
writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
value.SourceMsgSN = reader.ReadUInt32();
writer.WriteNumber($"[{value.SourceMsgSN.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSN);
value.DataLength = reader.ReadUInt32();
writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength);
}
@@ -52,9 +57,10 @@ namespace JT809.Protocol.SubMessageBody
public JT809_0x1200_0x1205 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
{
var value = new JT809_0x1200_0x1205();
if (config.Version == JT809Version.JTT2019) {
if (config.Version == JT809Version.JTT2019)
{
value.SourceDataType = reader.ReadUInt16();
value.SourceMsgSn = reader.ReadUInt32();
value.SourceMsgSN = reader.ReadUInt32();
value.DataLength = reader.ReadUInt32();
}
return value;
@@ -62,9 +68,10 @@ namespace JT809.Protocol.SubMessageBody

public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1205 value, IJT809Config config)
{
if (config.Version == JT809Version.JTT2019) {
if (config.Version == JT809Version.JTT2019)
{
writer.WriteUInt16(value.SourceDataType);
writer.WriteUInt32(value.SourceMsgSn);
writer.WriteUInt32(value.SourceMsgSN);
writer.WriteUInt32(value.DataLength);
}
}


+ 7
- 7
src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1206.cs 查看文件

@@ -20,7 +20,7 @@ namespace JT809.Protocol.SubMessageBody
public override ushort SubMsgId => JT809SubBusinessType.结束车辆定位信息交换应答消息.ToUInt16Value();

public override string Description => "结束车辆定位信息交换应答消息";
public override bool SkipDataLength => true;
public override bool SkipSerialization => false;
/// <summary>
/// 对应结束车辆定位信息交换请求消息源子业务类型标识
@@ -29,7 +29,7 @@ namespace JT809.Protocol.SubMessageBody
/// <summary>
/// 对应结束车辆定位信息交换请求消息源报文序列号
/// </summary>
public uint SourceMsgSn { get; set; }
public uint SourceMsgSN { get; set; }
/// <summary>
/// 后续数据长度 值为0x00
/// </summary>
@@ -41,9 +41,9 @@ namespace JT809.Protocol.SubMessageBody
if (config.Version == JT809Version.JTT2019)
{
value.SourceDataType = reader.ReadUInt16();
writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
value.SourceMsgSn = reader.ReadUInt32();
writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应结束车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
value.SourceMsgSN = reader.ReadUInt32();
writer.WriteNumber($"[{value.SourceMsgSN.ReadNumber()}对应结束车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSN);
value.DataLength = reader.ReadUInt32();
writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength);
}
@@ -55,7 +55,7 @@ namespace JT809.Protocol.SubMessageBody
if (config.Version == JT809Version.JTT2019)
{
value.SourceDataType = reader.ReadUInt16();
value.SourceMsgSn = reader.ReadUInt32();
value.SourceMsgSN = reader.ReadUInt32();
value.DataLength = reader.ReadUInt32();
}
return value;
@@ -66,7 +66,7 @@ namespace JT809.Protocol.SubMessageBody
if (config.Version == JT809Version.JTT2019)
{
writer.WriteUInt16(value.SourceDataType);
writer.WriteUInt32(value.SourceMsgSn);
writer.WriteUInt32(value.SourceMsgSN);
writer.WriteUInt32(value.DataLength);
}
}


+ 9
- 0
src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9201.cs 查看文件

@@ -18,6 +18,10 @@ namespace JT809.Protocol.SubMessageBody

public override string Description => "车辆注册信息应答消息";
/// <summary>
/// 车辆注册醒醒消息源子业务类型标识
/// </summary>
public ushort DataType { get; set; }
/// <summary>
/// 车辆注册信息消息源报文序号
/// </summary>
public uint MsgSn { get; set; }
@@ -26,9 +30,12 @@ namespace JT809.Protocol.SubMessageBody
/// </summary>
public JT809_0x9201_Result Result { get; set; }


public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
{
var value = new JT809_0x9200_0x9201();
value.DataType = reader.ReadUInt16();
writer.WriteNumber($"[{value.DataType.ReadNumber()}]车辆注册醒醒消息源子业务类型标识", value.DataType);
value.MsgSn = reader.ReadUInt32();
writer.WriteNumber($"[{value.MsgSn.ReadNumber()}]车辆注册信息消息源报文序号", value.MsgSn);
value.Result = (JT809_0x9201_Result)reader.ReadByte();
@@ -38,6 +45,7 @@ namespace JT809.Protocol.SubMessageBody
public JT809_0x9200_0x9201 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
{
var value = new JT809_0x9200_0x9201();
value.DataType = reader.ReadUInt16();
value.MsgSn = reader.ReadUInt32();
value.Result = (JT809_0x9201_Result)reader.ReadByte();
return value;
@@ -45,6 +53,7 @@ namespace JT809.Protocol.SubMessageBody

public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9201 value, IJT809Config config)
{
writer.WriteUInt16(value.DataType);
writer.WriteUInt32(value.MsgSn);
writer.WriteByte((byte)value.Result);
}


正在加载...
取消
保存