From 5cd465ab64a3b8b0f6cc5699e9990d59144a0d98 Mon Sep 17 00:00:00 2001 From: waterliu99 Date: Thu, 10 Dec 2020 23:13:19 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D0x8103=5F0x0032=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=B8=8D=E8=83=BD=E8=A7=A3=E6=9E=90=202.=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D0x8103=5F0x0110=E8=A7=A3=E6=9E=90=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageBody/JT808_0x8103Test.cs | 46 +++++++++++++++ .../Internal/JT808_0x8103_Factory.cs | 1 + src/JT808.Protocol/JT808.Protocol.xml | 26 ++++++++- src/JT808.Protocol/JT808Constants.cs | 4 ++ .../MessageBody/JT808_0x8103_0x0110.cs | 56 +++++++++++++------ 5 files changed, 114 insertions(+), 19 deletions(-) diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs index bfda7fb..1dd850b 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs @@ -176,5 +176,51 @@ namespace JT808.Protocol.Test.MessageBody string json = JT808Serializer.Analyze(bytes); } + [Fact] + public void Test4() + { + var JT808_0x8103 = new JT808_0x8103 + { + ParamList = new List() { + 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(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(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(bytes); + } } } diff --git a/src/JT808.Protocol/Internal/JT808_0x8103_Factory.cs b/src/JT808.Protocol/Internal/JT808_0x8103_Factory.cs index 4b3f54a..28afaa7 100644 --- a/src/JT808.Protocol/Internal/JT808_0x8103_Factory.cs +++ b/src/JT808.Protocol/Internal/JT808_0x8103_Factory.cs @@ -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()); diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index d4f0026..0527e63 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -3024,6 +3024,11 @@ 电子围栏半径(非法位移阈值),单位为米 + + + 电子围栏半径(非法位移阈值),单位为米 + + 监控平台电话号码 @@ -6926,13 +6931,28 @@ 数据 长度 - + - CAN 总线 ID 单独采集设置: bit63-bit32 表示此 ID 采集时间间隔(ms),0 表示不采集; + + + + bit31 表示 CAN 通道号,0:CAN1,1:CAN2; + + + + bit30 表示帧类型,0:标准帧,1:扩展帧; - bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值; + + + + + bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值; + + + + bit28-bit0 表示 CAN 总线 ID。 diff --git a/src/JT808.Protocol/JT808Constants.cs b/src/JT808.Protocol/JT808Constants.cs index 8cc4c5f..456c9aa 100644 --- a/src/JT808.Protocol/JT808Constants.cs +++ b/src/JT808.Protocol/JT808Constants.cs @@ -165,6 +165,10 @@ namespace JT808.Protocol /// public const uint JT808_0x8103_0x0031 = 0x0031; /// + /// 电子围栏半径(非法位移阈值),单位为米 + /// + public const uint JT808_0x8103_0x0032 = 0x0032; + /// /// 监控平台电话号码 /// public const uint JT808_0x8103_0x0040 = 0x0040; diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0110.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0110.cs index 30cdc59..8b8e9a4 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0110.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0110.cs @@ -23,32 +23,49 @@ namespace JT808.Protocol.MessageBody /// /// 数据 长度 /// - public override byte ParamLength { get; set; } + public override byte ParamLength { get; set; } = 8; /// - /// CAN 总线 ID 单独采集设置: /// bit63-bit32 表示此 ID 采集时间间隔(ms),0 表示不采集; + /// + public uint CollectTimeInterval { get; set; } + /// /// bit31 表示 CAN 通道号,0:CAN1,1:CAN2; + /// + public byte ChannelNo { get; set; } + /// /// bit30 表示帧类型,0:标准帧,1:扩展帧; - /// bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值; + /// + public byte FrameType { get; set; } + /// + /// bit29 表示数据采集方式,0:原始数据,1:采集区间的计算值; + /// + public byte CollectWay { get; set; } + /// /// bit28-bit0 表示 CAN 总线 ID。 /// - 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); } } }