Browse Source

1.修复0x8103_0x0032参数不能解析

2.修复0x8103_0x0110解析报错
tags/v2.3.2
waterliu99 4 years ago
parent
commit
5cd465ab64
5 changed files with 114 additions and 19 deletions
  1. +46
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs
  2. +1
    -0
      src/JT808.Protocol/Internal/JT808_0x8103_Factory.cs
  3. +23
    -3
      src/JT808.Protocol/JT808.Protocol.xml
  4. +4
    -0
      src/JT808.Protocol/JT808Constants.cs
  5. +40
    -16
      src/JT808.Protocol/MessageBody/JT808_0x8103_0x0110.cs

+ 46
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs View File

@@ -176,5 +176,51 @@ namespace JT808.Protocol.Test.MessageBody
string json = JT808Serializer.Analyze<JT808_0x8103>(bytes);
}

[Fact]
public void Test4()
{
var JT808_0x8103 = new JT808_0x8103
{
ParamList = new List<JT808_0x8103_BodyBase>() {
new JT808_0x8103_0x0110() {
CollectTimeInterval= 1000,
ChannelNo=1,
FrameType=1,
CollectWay=0,
BusId=56789
}
},
};
var hex = JT808Serializer.Serialize(JT808_0x8103).ToHexString();
Assert.Equal("010000011008000003E8C000DDD5", hex);
}
[Fact]
public void Test4_1()
{
byte[] bytes = "010000011008000003E8C000DDD5".ToHexBytes();
var jT808_0x8103 = JT808Serializer.Deserialize<JT808_0x8103>(bytes);
var jT808_0x8103_0x0110 = jT808_0x8103.ParamList[0] as JT808_0x8103_0x0110;
Assert.Equal(8, jT808_0x8103_0x0110.ParamLength);
Assert.Equal(1000u, jT808_0x8103_0x0110.CollectTimeInterval);
Assert.Equal(1, jT808_0x8103_0x0110.ChannelNo);
Assert.Equal(1, jT808_0x8103_0x0110.FrameType);
Assert.Equal(0, jT808_0x8103_0x0110.CollectWay);
Assert.Equal(56789, jT808_0x8103_0x0110.BusId);
}
[Fact]
public void Test4_2()
{
byte[] bytes = "7E8103000e0135123443213039010000011008ffffffffffffffffed7E".ToHexBytes();
var jT808= JT808Serializer.Deserialize<JT808Package>(bytes);
var jT808_0x8103 = jT808.Bodies as JT808_0x8103;
var jT808_0x8103_0x0110 = jT808_0x8103.ParamList[0] as JT808_0x8103_0x0110;
Assert.Equal(8, jT808_0x8103_0x0110.ParamLength);
}
[Fact]
public void Test4_3()
{
byte[] bytes = "010000011008000003E8C000DDD5".ToHexBytes();
string json = JT808Serializer.Analyze<JT808_0x8103>(bytes);
}
}
}

+ 1
- 0
src/JT808.Protocol/Internal/JT808_0x8103_Factory.cs View File

@@ -46,6 +46,7 @@ namespace JT808.Protocol.Interfaces
Map.Add(JT808Constants.JT808_0x8103_0x002F, new JT808_0x8103_0x002F());
Map.Add(JT808Constants.JT808_0x8103_0x0030, new JT808_0x8103_0x0030());
Map.Add(JT808Constants.JT808_0x8103_0x0031, new JT808_0x8103_0x0031());
Map.Add(JT808Constants.JT808_0x8103_0x0032, new JT808_0x8103_0x0032());
Map.Add(JT808Constants.JT808_0x8103_0x0040, new JT808_0x8103_0x0040());
Map.Add(JT808Constants.JT808_0x8103_0x0041, new JT808_0x8103_0x0041());
Map.Add(JT808Constants.JT808_0x8103_0x0042, new JT808_0x8103_0x0042());


+ 23
- 3
src/JT808.Protocol/JT808.Protocol.xml View File

@@ -3024,6 +3024,11 @@
电子围栏半径(非法位移阈值),单位为米
</summary>
</member>
<member name="F:JT808.Protocol.JT808Constants.JT808_0x8103_0x0032">
<summary>
电子围栏半径(非法位移阈值),单位为米
</summary>
</member>
<member name="F:JT808.Protocol.JT808Constants.JT808_0x8103_0x0040">
<summary>
监控平台电话号码
@@ -6926,13 +6931,28 @@
数据 长度
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8103_0x0110.ParamValue">
<member name="P:JT808.Protocol.MessageBody.JT808_0x8103_0x0110.CollectTimeInterval">
<summary>
CAN 总线 ID 单独采集设置:
bit63-bit32 表示此 ID 采集时间间隔(ms),0 表示不采集;
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8103_0x0110.ChannelNo">
<summary>
bit31 表示 CAN 通道号,0:CAN1,1:CAN2;
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8103_0x0110.FrameType">
<summary>
bit30 表示帧类型,0:标准帧,1:扩展帧;
bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值;
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8103_0x0110.CollectWay">
<summary>
bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值;
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8103_0x0110.BusId">
<summary>
bit28-bit0 表示 CAN 总线 ID。
</summary>
</member>


+ 4
- 0
src/JT808.Protocol/JT808Constants.cs View File

@@ -165,6 +165,10 @@ namespace JT808.Protocol
/// </summary>
public const uint JT808_0x8103_0x0031 = 0x0031;
/// <summary>
/// 电子围栏半径(非法位移阈值),单位为米
/// </summary>
public const uint JT808_0x8103_0x0032 = 0x0032;
/// <summary>
/// 监控平台电话号码
/// </summary>
public const uint JT808_0x8103_0x0040 = 0x0040;


+ 40
- 16
src/JT808.Protocol/MessageBody/JT808_0x8103_0x0110.cs View File

@@ -23,32 +23,49 @@ namespace JT808.Protocol.MessageBody
/// <summary>
/// 数据 长度
/// </summary>
public override byte ParamLength { get; set; }
public override byte ParamLength { get; set; } = 8;
/// <summary>
/// CAN 总线 ID 单独采集设置:
/// bit63-bit32 表示此 ID 采集时间间隔(ms),0 表示不采集;
/// </summary>
public uint CollectTimeInterval { get; set; }
/// <summary>
/// bit31 表示 CAN 通道号,0:CAN1,1:CAN2;
/// </summary>
public byte ChannelNo { get; set; }
/// <summary>
/// bit30 表示帧类型,0:标准帧,1:扩展帧;
/// bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值;
/// </summary>
public byte FrameType { get; set; }
/// <summary>
/// bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值;
/// </summary>
public byte CollectWay { get; set; }
/// <summary>
/// bit28-bit0 表示 CAN 总线 ID。
/// </summary>
public byte[] ParamValue { get; set; }
public long BusId { get; set; }

public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8103_0x0110 jT808_0x8103_0x0110 = new JT808_0x8103_0x0110();
jT808_0x8103_0x0110.ParamId = reader.ReadUInt32();
jT808_0x8103_0x0110.ParamLength = reader.ReadByte();
jT808_0x8103_0x0110.ParamValue = reader.ReadArray(jT808_0x8103_0x0110.ParamLength).ToArray();
writer.WriteNumber($"[ { jT808_0x8103_0x0110.ParamId.ReadNumber()}]参数ID", jT808_0x8103_0x0110.ParamId);

jT808_0x8103_0x0110.CollectTimeInterval = reader.ReadUInt32();
var temp = reader.ReadUInt32();
jT808_0x8103_0x0110.ChannelNo = (byte)((temp >> 31) & 0x01);
jT808_0x8103_0x0110.FrameType = (byte)((temp >> 30) & 0x01);
jT808_0x8103_0x0110.CollectWay = (byte)((temp >> 29) & 0x01);
jT808_0x8103_0x0110.BusId = temp & 0x01FFFFFF;
writer.WriteNumber($"[{jT808_0x8103_0x0110.ParamId.ReadNumber()}]参数ID", jT808_0x8103_0x0110.ParamId);
writer.WriteNumber($"[{jT808_0x8103_0x0110.ParamLength.ReadNumber()}]参数长度", jT808_0x8103_0x0110.ParamLength);
writer.WriteStartArray($"[{ jT808_0x8103_0x0110.ParamValue.ToHexString()}]参数值[CAN总线ID单独采集设置]");
writer.WriteNumber("此 ID 采集时间间隔(ms)", BinaryPrimitives.ReadUInt32BigEndian( jT808_0x8103_0x0110.ParamValue.AsSpan().Slice(0,4)));
writer.WriteString("CAN通道号", (jT808_0x8103_0x0110.ParamValue.AsSpan().Slice(4, 1).ToArray()[0]&0x01)==0? "CAN1" : "CAN2");
writer.WriteString("帧类型", (jT808_0x8103_0x0110.ParamValue.AsSpan().Slice(4, 1).ToArray()[0] & 0x02) == 0 ? "标准帧" : "扩展帧");
writer.WriteString("数据采集方式", (jT808_0x8103_0x0110.ParamValue.AsSpan().Slice(4, 1).ToArray()[0] & 0x04) == 0 ? "原始数据" : "采集区间的计算值");
writer.WriteNumber("CAN 总线 ID", BinaryPrimitives.ReadUInt32BigEndian(jT808_0x8103_0x0110.ParamValue.AsSpan().Slice(4, 4)) & 0x01FFFFFF);
writer.WriteEndArray();
writer.WriteStartObject($"CAN总线ID单独采集设置");
writer.WriteNumber($"[{ jT808_0x8103_0x0110.CollectTimeInterval.ReadNumber()}]此 ID 采集时间间隔(ms)", jT808_0x8103_0x0110.CollectTimeInterval) ;
writer.WriteString($"[{ jT808_0x8103_0x0110.ChannelNo.ReadBinary()[0]}]CAN通道号", jT808_0x8103_0x0110.ChannelNo == 0? "CAN1" : "CAN2");
writer.WriteString($"[{ jT808_0x8103_0x0110.FrameType.ReadBinary()[0]}]帧类型", jT808_0x8103_0x0110.FrameType == 0 ? "标准帧" : "扩展帧");
writer.WriteString($"[{ jT808_0x8103_0x0110.CollectWay.ReadBinary()[0]}]数据采集方式", jT808_0x8103_0x0110.CollectWay== 0 ? "原始数据" : "采集区间的计算值");
writer.WriteNumber($"[{ jT808_0x8103_0x0110.BusId.ReadNumber()}]CAN 总线 ID", jT808_0x8103_0x0110.BusId);
writer.WriteEndObject();
}

public JT808_0x8103_0x0110 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
@@ -56,15 +73,22 @@ namespace JT808.Protocol.MessageBody
JT808_0x8103_0x0110 jT808_0x8103_0x0110 = new JT808_0x8103_0x0110();
jT808_0x8103_0x0110.ParamId = reader.ReadUInt32();
jT808_0x8103_0x0110.ParamLength = reader.ReadByte();
jT808_0x8103_0x0110.ParamValue = reader.ReadArray(jT808_0x8103_0x0110.ParamLength).ToArray();
jT808_0x8103_0x0110.CollectTimeInterval= reader.ReadUInt32();
var temp= reader.ReadUInt32();
jT808_0x8103_0x0110.ChannelNo =(byte)( (temp >> 31) & 0x01);
jT808_0x8103_0x0110.FrameType = (byte)((temp >> 30) & 0x01);
jT808_0x8103_0x0110.CollectWay = (byte)((temp >> 29) & 0x01);
jT808_0x8103_0x0110.BusId = temp & 0x01FFFFFF;
return jT808_0x8103_0x0110;
}

public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0110 value, IJT808Config config)
{
writer.WriteUInt32(value.ParamId);
writer.WriteByte((byte)value.ParamValue.Length);
writer.WriteArray(value.ParamValue);
writer.WriteByte((byte)value.ParamLength);
writer.WriteUInt32(value.CollectTimeInterval);
var temp = (uint)((value.ChannelNo << 31) | (value.FrameType << 30) | (value.CollectWay )<< 29 | (value.BusId& 0x01FFFFFF));
writer.WriteUInt32(temp);
}
}
}

Loading…
Cancel
Save