diff --git a/README.md b/README.md index 50c527e..2c28799 100644 --- a/README.md +++ b/README.md @@ -45,4 +45,8 @@ |:------:|:------:|:------:|:------:| | 1 | 0x1200 | √ | 主链路动态信息交换消息 | | 2 | 0x1201 | √ | 上传车辆注册信息 | -| 3 | 0x1202 | √ | 实时上传车辆定位信息 | \ No newline at end of file +| 3 | 0x1202 | √ | 实时上传车辆定位信息 | +| 4 | 0x1203 | √ | 车辆定位信息自动补报 | +| 5 | 0x1205 | √ | 启动车辆定位信息交换应答消息 | +| 6 | 0x1206 | √ | 结束车辆定位信息交换应答消息 | +| 7 | 0x1207 | √ | 申请交换指定车辆定位信息请求消息 | \ 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.Test/JT809SubMessageBody/JT809_0x1200_0x1207Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1207Test.cs new file mode 100644 index 0000000..7d13e3d --- /dev/null +++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1207Test.cs @@ -0,0 +1,36 @@ +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_0x1207Test + { + [Fact] + public void Test1() + { + JT809_0x1200_0x1207 jT809_0X1200_0X1201 = new JT809_0x1200_0x1207 + { + StartTime = DateTime.Parse("2018-09-24 14:14:14"), + EndTime = DateTime.Parse("2018-09-24 23:23:23") + }; + var hex = JT809Serializer.Serialize(jT809_0X1200_0X1201).ToHexString(); + //"00 00 00 00 5B A8 80 B6 00 00 00 00 5B A9 01 6B" + } + + [Fact] + public void Test2() + { + var bytes = "00 00 00 00 5B A8 80 B6 00 00 00 00 5B A9 01 6B".ToHexBytes(); + JT809_0x1200_0x1207 jT809_0X1200_0X1201 = JT809Serializer.Deserialize(bytes); + Assert.Equal(DateTime.Parse("2018-09-24 14:14:14"), jT809_0X1200_0X1201.StartTime); + Assert.Equal(DateTime.Parse("2018-09-24 23:23:23"), jT809_0X1200_0X1201.EndTime); + } + } +} diff --git a/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs b/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs index d2a0f3b..2d67fc8 100644 --- a/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs +++ b/src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs @@ -26,21 +26,25 @@ namespace JT809.Protocol.JT809Enums ///车辆定位信息自动补报 /// [Description("车辆定位信息自动补报")] + [JT809BodiesType(typeof(JT809_0x1200_0x1203))] UP_EXG_MSG_HISTORY_LOCATION = 0x1203, /// ///启动车辆定位信息交换应答 /// [Description("启动车辆定位信息交换应答")] + [JT809BodiesType(typeof(JT809_0x1200_0x1205))] UP_EXG_MSG_RETURN_STARTUP_ACK = 0x1205, /// ///结束车辆定位信息交换应答 /// [Description("结束车辆定位信息交换应答")] + [JT809BodiesType(typeof(JT809_0x1200_0x1206))] UP_EXG_MSG_RETURN_END_ACK = 0x1206, /// ///申请交换指定车辆定位信息请求 /// [Description("申请交换指定车辆定位信息请求")] + [JT809BodiesType(typeof(JT809_0x1200_0x1207))] UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP = 0x1207, /// ///取消交换指定车辆定位信息请求 diff --git a/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs index d6a4cc6..a5177d3 100644 --- a/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs +++ b/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs @@ -18,6 +18,8 @@ namespace JT809.Protocol.JT809Extensions private static ulong[] CRC = new ulong[256]; //建立CRC16表 + private static readonly DateTime UTCBaseTime = new DateTime(1970, 1, 1); + static JT809BinaryExtensions() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); @@ -117,6 +119,18 @@ namespace JT809.Protocol.JT809Extensions return dateTime; } + public static DateTime ReadUTCDateTimeLittle(ReadOnlySpan buf, ref int offset) + { + ulong result = 0; + for (int i = 0; i < 8; i++) + { + ulong currentData = (ulong)buf[offset+i] << (8 * (8 - i - 1)); + result += currentData; + } + offset += 8; + return UTCBaseTime.AddSeconds(result).AddHours(8); + } + public static int ReadInt32Little(ReadOnlySpan read, ref int offset) { int value = (read[offset] << 24) | (read[offset + 1] << 16) | (read[offset + 2] << 8) | read[offset + 3]; @@ -367,6 +381,18 @@ namespace JT809.Protocol.JT809Extensions return len; } + public static int WriteUTCDateTimeLittle(IMemoryOwner memoryOwner, int offset, DateTime date) + { + ulong totalSecends = (ulong)(date.AddHours(-8) - UTCBaseTime).TotalSeconds; + //高位在前 + for (int i = 7; i >= 0; i--) + { + memoryOwner.Memory.Span[offset+i] = (byte)(totalSecends & 0xFF); //取低8位 + totalSecends = totalSecends >> 8; + } + return 8; + } + public static IEnumerable ToBytes(this string data, Encoding coding) { return coding.GetBytes(data); 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/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1207Formatter.cs b/src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1207Formatter.cs new file mode 100644 index 0000000..2c489c0 --- /dev/null +++ b/src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1207Formatter.cs @@ -0,0 +1,29 @@ +using JT809.Protocol.JT809Extensions; +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_0x1207Formatter : IJT809Formatter + { + public JT809_0x1200_0x1207 Deserialize(ReadOnlySpan bytes, out int readSize) + { + int offset = 0; + JT809_0x1200_0x1207 jT809_0X1200_0X1207 = new JT809_0x1200_0x1207(); + jT809_0X1200_0X1207.StartTime = JT809BinaryExtensions.ReadUTCDateTimeLittle(bytes, ref offset); + jT809_0X1200_0X1207.EndTime = JT809BinaryExtensions.ReadUTCDateTimeLittle(bytes, ref offset); + readSize = offset; + return jT809_0X1200_0X1207; + } + + public int Serialize(IMemoryOwner memoryOwner, int offset, JT809_0x1200_0x1207 value) + { + offset += JT809BinaryExtensions.WriteUTCDateTimeLittle(memoryOwner, offset, value.StartTime); + offset += JT809BinaryExtensions.WriteUTCDateTimeLittle(memoryOwner, offset, value.EndTime); + 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; } + } +} diff --git a/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1205.cs b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1205.cs new file mode 100644 index 0000000..a846a94 --- /dev/null +++ b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1205.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT809.Protocol.JT809SubMessageBody +{ + /// + /// 启动车辆定位信息交换应答消息 + /// 子业务类型标识:UP_EXG_ MSG_ RETURN_ STARTUP ACK + /// 描述:本条消息是下级平台对上级平台下发的 DOWN_EXG_ MSG_ RETURN_STARTUP 消息的应答消息 + /// + public class JT809_0x1200_0x1205:JT809SubBodies + { + + } +} diff --git a/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1206.cs b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1206.cs new file mode 100644 index 0000000..86fa0a0 --- /dev/null +++ b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1206.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT809.Protocol.JT809SubMessageBody +{ + /// + /// 结束车辆定位信息交换应答消息 + /// 子业务类型标识:UP_EXG_MSG_RETURN_END_ACK + /// + public class JT809_0x1200_0x1206:JT809SubBodies + { + } +} diff --git a/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1207.cs b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1207.cs new file mode 100644 index 0000000..f484eb0 --- /dev/null +++ b/src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1207.cs @@ -0,0 +1,26 @@ +using JT809.Protocol.JT809Attributes; +using JT809.Protocol.JT809Formatters.JT809SubMessageBodyFormatters; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT809.Protocol.JT809SubMessageBody +{ + /// + /// 申请交换指定车辆定位信息请求消息 + /// 子业务类型标识:UP_EXG_MSG_APPLY-FOR_MONITOR_STARTUP + /// 描述:当下级平台需要在特定时问段内监控特殊车辆时,可上传此命令到上级平台申请对该车辆定位数据交换到下级平台,申请成功后,此车辆定位数据将在指定时间内交换到该平台(即使该车没有进入该平台所属区域也会交换) + /// + [JT809Formatter(typeof(JT809_0x1200_0x1207Formatter))] + public class JT809_0x1200_0x1207:JT809SubBodies + { + /// + /// 开始时间,用 UTC 时间表示 + /// + public DateTime StartTime { get; set; } + /// + /// 结束时间,用 UTC 时间表示 + /// + public DateTime EndTime { get; set; } + } +}