From 5712c5e5dbd8f9dd3bf42b98a37f883298f9d391 Mon Sep 17 00:00:00 2001 From: SmallChi <564952747@qq.com> Date: Sun, 23 Sep 2018 16:32:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A00x1203=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8F=8A=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../JT809_0x1200_0x1203Test.cs | 136 ++++++++++++++++++ .../JT809Enums/JT809SubBusinessType.cs | 1 + .../JT809_0x1200_0x1203Formatter.cs | 71 +++++++++ .../JT809_0x1200_0x1203.cs | 31 ++++ 5 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs create mode 100644 src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1203Formatter.cs create mode 100644 src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1203.cs diff --git a/README.md b/README.md index 50c527e..b8a8355 100644 --- a/README.md +++ b/README.md @@ -45,4 +45,5 @@ |:------:|:------:|:------:|:------:| | 1 | 0x1200 | √ | 主链路动态信息交换消息 | | 2 | 0x1201 | √ | 上传车辆注册信息 | -| 3 | 0x1202 | √ | 实时上传车辆定位信息 | \ No newline at end of file +| 3 | 0x1202 | √ | 实时上传车辆定位信息 | +| 4 | 0x1203 | √ | 车辆定位信息自动补报 | \ No newline at end of file diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs new file mode 100644 index 0000000..6835727 --- /dev/null +++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JT809.Protocol; +using JT809.Protocol.JT809Extensions; +using JT809.Protocol.JT809MessageBody; +using JT809.Protocol.JT809Exceptions; +using JT809.Protocol.JT809SubMessageBody; + +namespace JT809.Protocol.Test.JT809SubMessageBody +{ + public class JT809_0x1200_0x1203Test + { + [Fact] + public void Test1() + { + JT809_0x1200_0x1203 jT809_0X1200_0X1203 = new JT809_0x1200_0x1203(); + jT809_0X1200_0X1203.GNSS = new List(); + + JT809_0x1200_0x1202 jT809_0X1200_0X1202_1 = new JT809_0x1200_0x1202(); + jT809_0X1200_0X1202_1.VehiclePosition.Day = 19; + jT809_0X1200_0X1202_1.VehiclePosition.Month = 7; + jT809_0X1200_0X1202_1.VehiclePosition.Year = 2012; + jT809_0X1200_0X1202_1.VehiclePosition.Hour = 15; + jT809_0X1200_0X1202_1.VehiclePosition.Minute = 15; + jT809_0X1200_0X1202_1.VehiclePosition.Second = 15; + jT809_0X1200_0X1202_1.VehiclePosition.Lon = 133123456; + jT809_0X1200_0X1202_1.VehiclePosition.Lat = 24123456; + jT809_0X1200_0X1202_1.VehiclePosition.Vec1 = 50; + jT809_0X1200_0X1202_1.VehiclePosition.Vec2 = 51; + jT809_0X1200_0X1202_1.VehiclePosition.Vec3 = 150; + jT809_0X1200_0X1202_1.VehiclePosition.Direction = 45; + jT809_0X1200_0X1202_1.VehiclePosition.Altitude = 45; + jT809_0X1200_0X1202_1.VehiclePosition.State = 3; + jT809_0X1200_0X1202_1.VehiclePosition.Alarm = 257; + + JT809_0x1200_0x1202 jT809_0X1200_0X1202_2 = new JT809_0x1200_0x1202(); + jT809_0X1200_0X1202_2.VehiclePosition.Day = 19; + jT809_0X1200_0X1202_2.VehiclePosition.Month = 7; + jT809_0X1200_0X1202_2.VehiclePosition.Year = 2012; + jT809_0X1200_0X1202_2.VehiclePosition.Hour = 16; + jT809_0X1200_0X1202_2.VehiclePosition.Minute = 16; + jT809_0X1200_0X1202_2.VehiclePosition.Second = 16; + jT809_0X1200_0X1202_2.VehiclePosition.Lon = 133123456; + jT809_0X1200_0X1202_2.VehiclePosition.Lat = 24123456; + jT809_0X1200_0X1202_2.VehiclePosition.Vec1 = 50; + jT809_0X1200_0X1202_2.VehiclePosition.Vec2 = 51; + jT809_0X1200_0X1202_2.VehiclePosition.Vec3 = 150; + jT809_0X1200_0X1202_2.VehiclePosition.Direction = 45; + jT809_0X1200_0X1202_2.VehiclePosition.Altitude = 45; + jT809_0X1200_0X1202_2.VehiclePosition.State = 3; + jT809_0X1200_0X1202_2.VehiclePosition.Alarm = 257; + + JT809_0x1200_0x1202 jT809_0X1200_0X1202_3 = new JT809_0x1200_0x1202(); + jT809_0X1200_0X1202_3.VehiclePosition.Day = 19; + jT809_0X1200_0X1202_3.VehiclePosition.Month = 7; + jT809_0X1200_0X1202_3.VehiclePosition.Year = 2012; + jT809_0X1200_0X1202_3.VehiclePosition.Hour = 17; + jT809_0X1200_0X1202_3.VehiclePosition.Minute = 17; + jT809_0X1200_0X1202_3.VehiclePosition.Second = 17; + jT809_0X1200_0X1202_3.VehiclePosition.Lon = 133123456; + jT809_0X1200_0X1202_3.VehiclePosition.Lat = 24123456; + jT809_0X1200_0X1202_3.VehiclePosition.Vec1 = 50; + jT809_0X1200_0X1202_3.VehiclePosition.Vec2 = 51; + jT809_0X1200_0X1202_3.VehiclePosition.Vec3 = 150; + jT809_0X1200_0X1202_3.VehiclePosition.Direction = 45; + jT809_0X1200_0X1202_3.VehiclePosition.Altitude = 45; + jT809_0X1200_0X1202_3.VehiclePosition.State = 3; + jT809_0X1200_0X1202_3.VehiclePosition.Alarm = 257; + + + jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_1); + jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_2); + jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_3); + + var hex = JT809Serializer.Serialize(jT809_0X1200_0X1203).ToHexString(); + //"03 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 10 10 10 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 11 11 11 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01" + } + + [Fact] + public void Test2() + { + var bytes = "03 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 10 10 10 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 11 11 11 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01".ToHexBytes(); + JT809_0x1200_0x1203 jT809_0X1200_0X1203 = JT809Serializer.Deserialize(bytes); + + Assert.Equal(3, jT809_0X1200_0X1203.GNSSCount); + + + Assert.Equal(19, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Day); + Assert.Equal(7, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Month); + Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Year); + Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Hour); + Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Minute); + Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Second); + Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Lon); + Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Lat); + Assert.Equal(50, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Vec1); + Assert.Equal(51, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Vec2); + Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Direction); + Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Altitude); + Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.State); + Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Alarm); + + Assert.Equal(19, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Day); + Assert.Equal(7, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Month); + Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Year); + Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Hour); + Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Minute); + Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Second); + Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Lon); + Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Lat); + Assert.Equal(50, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Vec1); + Assert.Equal(51, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Vec2); + Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Direction); + Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Altitude); + Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.State); + Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Alarm); + + Assert.Equal(19, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Day); + Assert.Equal(7, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Month); + Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Year); + Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Hour); + Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Minute); + Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Second); + Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Lon); + Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Lat); + Assert.Equal(50, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Vec1); + Assert.Equal(51, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Vec2); + Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Direction); + Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Altitude); + Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.State); + Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Alarm); + } + } +} diff --git a/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs b/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs index d2a0f3b..5fa67da 100644 --- a/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs +++ b/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs @@ -26,6 +26,7 @@ namespace JT809.Protocol.JT809Enums ///车辆定位信息自动补报 /// [Description("车辆定位信息自动补报")] + [JT809BodiesType(typeof(JT809_0x1200_0x1203))] UP_EXG_MSG_HISTORY_LOCATION = 0x1203, /// ///启动车辆定位信息交换应答 diff --git a/src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1203Formatter.cs b/src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1203Formatter.cs new file mode 100644 index 0000000..f0a1048 --- /dev/null +++ b/src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1203Formatter.cs @@ -0,0 +1,71 @@ +using JT809.Protocol.JT809Enums; +using JT809.Protocol.JT809Extensions; +using JT809.Protocol.JT809Properties; +using JT809.Protocol.JT809SubMessageBody; +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Text; + +namespace JT809.Protocol.JT809Formatters.JT809SubMessageBodyFormatters +{ + public class JT809_0x1200_0x1203Formatter : IJT809Formatter + { + public JT809_0x1200_0x1203 Deserialize(ReadOnlySpan bytes, out int readSize) + { + int offset = 0; + JT809_0x1200_0x1203 jT809_0X1200_0X1203 = new JT809_0x1200_0x1203(); + jT809_0X1200_0X1203.GNSSCount= JT809BinaryExtensions.ReadByteLittle(bytes, ref offset); + if (jT809_0X1200_0X1203.GNSSCount > 0) + { + jT809_0X1200_0X1203.GNSS = new List(); + int bufReadSize; + int tempOffset = 0; + for (int i = 0; i < jT809_0X1200_0X1203.GNSSCount; i++) + { + try + { + if (i == 0) + { + tempOffset = offset + 36; + JT809_0x1200_0x1202 jT809_0x1200_0x1202 = JT809FormatterExtensions.GetFormatter() + .Deserialize(bytes.Slice(offset, 36), out bufReadSize); + jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202); + } + else + { + JT809_0x1200_0x1202 jT809_0x1200_0x1202 = JT809FormatterExtensions.GetFormatter() + .Deserialize(bytes.Slice(tempOffset, 36), out bufReadSize); + tempOffset += 36; + jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202); + } + } + catch (Exception) + { + tempOffset += 36; + } + } + } + readSize = jT809_0X1200_0X1203.GNSSCount * 36 + 1; + return jT809_0X1200_0X1203; + } + + public int Serialize(IMemoryOwner memoryOwner, int offset, JT809_0x1200_0x1203 value) + { + offset += JT809BinaryExtensions.WriteByteLittle(memoryOwner, offset, (byte)value.GNSS.Count); + foreach(var item in value.GNSS) + { + try + { + int positionOffset = JT809FormatterExtensions.GetFormatter().Serialize(memoryOwner, offset, item); + offset = positionOffset; + } + catch (Exception ex) + { + + } + } + return offset; + } + } +} diff --git a/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1203.cs b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1203.cs new file mode 100644 index 0000000..97207f9 --- /dev/null +++ b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1203.cs @@ -0,0 +1,31 @@ +using JT809.Protocol.JT809Attributes; +using JT809.Protocol.JT809Formatters.JT809SubMessageBodyFormatters; +using JT809.Protocol.JT809Properties; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT809.Protocol.JT809SubMessageBody +{ + /// + /// 车辆定位信息自动补报请求消息 + /// 子业务类型标识:UP_EXG_MSG_HISTORY_LOCATION + /// 描述:如果平台间传输链路中断,下级平台重新登录并与上级平台建立通信链路后,下级平台应将中断期间内车载终端上传的车辆定位信息自动补报到上级平台。 + /// 如果系统断线期间,该车需发送的数据包条数大于 5,则以每包五条进行补发,直到补发完毕。 + /// 多条数据以卫星定位时间先后顺序排列。 + /// 本条消息上级平台采用定量回复,即收到一定数量的数据后,即通过从链路应答数据量。 + /// + /// + [JT809Formatter(typeof(JT809_0x1200_0x1203Formatter))] + public class JT809_0x1200_0x1203 : JT809SubBodies + { + /// + /// 卫星定位数据个数 1<=GNSS_CNT<=5。 + /// + public byte GNSSCount { get; set; } + /// + /// 卫星定位数据集合 + /// + public IList GNSS { get; set; } + } +}