From e56662a2c1e145300ddfd4ae8e480b62e6b061b0 Mon Sep 17 00:00:00 2001
From: TK <water617@outlook.com>
Date: Mon, 27 Apr 2020 23:09:32 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96809?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../MessageBody/JT809_0x1102.cs               |  7 ++--
 .../MessageBody/JT809_0x9102.cs               |  5 +--
 .../JT809VehiclePositionProperties_2019.cs    | 12 +++----
 .../SubMessageBody/JT809_0x1200_0x1201.cs     | 18 +++++-----
 .../SubMessageBody/JT809_0x1200_0x1202.cs     | 33 ++++++++++++++-----
 .../SubMessageBody/JT809_0x1200_0x1203.cs     | 12 +++----
 6 files changed, 50 insertions(+), 37 deletions(-)

diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1102.cs b/src/JT809.Protocol/MessageBody/JT809_0x1102.cs
index 772f517..75bde4e 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x1102.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x1102.cs
@@ -12,8 +12,9 @@ namespace JT809.Protocol.MessageBody
     /// <summary>
     ///  平台链路连接情况与车辆定位消息传输情况上报应答消息
     /// <para>链路类型:主链路</para>
-    /// <para>消息方向:上级平台往下级平台</para>
+    /// <para>消息方向:下级平台往上级平台</para>
     /// <para>业务类型标识:UP_MANAGE_MSG_RSP</para>
+    /// <para>下级平台收到上级平台下发的“平台链路连接情况与车辆定位消息传输情况上报请求消息”后,上报指定平台,指定时间段内的平台链路连接情况与车辆定位消息传输情况</para>
     /// </summary>
     public class JT809_0x1102 : JT809ExchangeMessageBodies, IJT809MessagePackFormatter<JT809_0x1102>,IJT809_2019_Version
     {
@@ -52,8 +53,6 @@ namespace JT809.Protocol.MessageBody
         public JT809_0x1102 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             JT809_0x1102 value = new JT809_0x1102();
-            value.SubBusinessType = reader.ReadUInt16();
-            value.DataLength = reader.ReadUInt32();
             value.PlateformId = reader.ReadBigNumber(11);
             value.StartTime = reader.ReadUTCDateTime();
             value.EndTime = reader.ReadUTCDateTime();
@@ -65,8 +64,6 @@ namespace JT809.Protocol.MessageBody
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1102 value, IJT809Config config)
         {
-            writer.WriteUInt16(value.SubBusinessType);
-            writer.WriteUInt32(36);
             writer.WriteBigNumber(value.PlateformId, 11);
             writer.WriteUTCDateTime(value.StartTime);
             writer.WriteUTCDateTime(value.EndTime);
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9102.cs b/src/JT809.Protocol/MessageBody/JT809_0x9102.cs
index 854b8d4..d5a2792 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9102.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9102.cs
@@ -14,6 +14,7 @@ namespace JT809.Protocol.MessageBody
     /// <para>链路类型:从链路</para>
     /// <para>消息方向:上级平台往下级平台</para>
     /// <para>业务类型标识:DOWN_MANAGE_MSG_REQ</para>
+    /// <para>描述:上级平台向下级平台发送上报指定下级监控平台一段时间内链路连接情况与车辆定位消息传输情况请求</para>
     /// </summary>
     public class JT809_0x9102 : JT809ExchangeMessageBodies, IJT809MessagePackFormatter<JT809_0x9102>,IJT809_2019_Version
     {
@@ -40,8 +41,6 @@ namespace JT809.Protocol.MessageBody
         public JT809_0x9102 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             JT809_0x9102 value = new JT809_0x9102();
-            value.SubBusinessType = reader.ReadUInt16();
-            value.DataLength = reader.ReadUInt32();
             value.PlateformId = reader.ReadBigNumber(11);
             value.StartTime = reader.ReadUTCDateTime();
             value.EndTime = reader.ReadUTCDateTime();
@@ -50,8 +49,6 @@ namespace JT809.Protocol.MessageBody
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9102 value, IJT809Config config)
         {
-            writer.WriteUInt16(value.SubBusinessType);
-            writer.WriteUInt32(27);
             writer.WriteBigNumber(value.PlateformId, 11);
             writer.WriteUTCDateTime(value.StartTime);
             writer.WriteUTCDateTime(value.EndTime);
diff --git a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs
index 5b9ab7c..d7e128e 100644
--- a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs
+++ b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs
@@ -21,9 +21,9 @@ namespace JT809.Protocol.Metadata
         /// </summary>
         public byte[] GnssData { get; set; }
         /// <summary>
-        /// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
+        /// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成  11位
         /// </summary>
-        public byte[] PlatformId1 { get; set; } = new byte[11];
+        public string PlatformId1 { get; set; };
         /// <summary>
         /// 报警状态,二进制标识 0 正常 1表示报警
         /// 具体定义按照808-2019中表18的规定
@@ -31,9 +31,9 @@ namespace JT809.Protocol.Metadata
         public uint Alarm1 { get; set; }
         /// <summary>
         /// 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
-        /// 未填写时,全填0,无市级平台应由省级平台全填1
+        /// 未填写时,全填0,无市级平台应由省级平台全填1  11位
         /// </summary>
-        public byte[] PlatformId2 { get; set; } = new byte[11];
+        public string PlatformId2 { get; set; };
         /// <summary>
         /// 报警状态,二进制标识 0 正常 1表示报警
         /// 具体定义按照808-2019中表18的规定
@@ -41,9 +41,9 @@ namespace JT809.Protocol.Metadata
         public uint Alarm2 { get; set; }
         /// <summary>
         /// 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
-        ///  未填写时,全填0
+        ///  未填写时,全填0  11位
         /// </summary>
-        public byte[] PlatformId3 { get; set; } = new byte[11];
+        public string PlatformId3 { get; set; };
         /// <summary>
         /// 报警状态,二进制标识 0 正常 1表示报警
         /// 具体定义按照808-2019中表18的规定
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs
index a67e0ba..1e14c6f 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1201.cs
@@ -51,8 +51,9 @@ namespace JT809.Protocol.SubMessageBody
             {
                 value.PlateformId = reader.ReadBigNumber(11);
                 value.ProducerId = reader.ReadBigNumber(11);
-                value.TerminalModelType = reader.ReadString(20);
-                value.TerminalId = reader.ReadString(7);
+#warning 此处应该改成大端模式读取数据吧
+                value.TerminalModelType = reader.ReadBigNumber(20);
+                value.TerminalId = reader.ReadBigNumber(7);
                 value.TerminalId = value.TerminalId.ToUpper();
                 value.TerminalSimCode = reader.ReadString(12);
             }
@@ -60,9 +61,9 @@ namespace JT809.Protocol.SubMessageBody
             {
                 value.PlateformId = reader.ReadBigNumber(11);
                 value.ProducerId = reader.ReadBigNumber(11);
-                value.TerminalModelType = reader.ReadString(30);
+                value.TerminalModelType = reader.ReadBigNumber(30);
                 value.IMIEId = reader.ReadString(15);
-                value.TerminalId = reader.ReadString(30);
+                value.TerminalId = reader.ReadBigNumber(30);
                 value.TerminalId = value.TerminalId.ToUpper();
                 value.TerminalSimCode = reader.ReadString(13);
             }
@@ -75,17 +76,18 @@ namespace JT809.Protocol.SubMessageBody
             {
                 writer.WriteBigNumber(value.PlateformId, 11);
                 writer.WriteBigNumber(value.ProducerId, 11);
-                writer.WriteStringPadRight(value.TerminalModelType, 20);
-                writer.WriteStringPadRight(value.TerminalId.ToUpper(), 7);
+#warning 此处应该改成大端模式读取数据吧
+                writer.WriteBigNumber(value.TerminalModelType, 20);
+                writer.WriteBigNumber(value.TerminalId.ToUpper(), 7);
                 writer.WriteStringPadLeft(value.TerminalSimCode, 12);
             }
             else
             {
                 writer.WriteBigNumber(value.PlateformId, 11);
                 writer.WriteBigNumber(value.ProducerId, 11);
-                writer.WriteStringPadRight(value.TerminalModelType, 30);
+                writer.WriteBigNumber(value.TerminalModelType, 30);
                 writer.WriteStringPadRight(value.IMIEId, 15);
-                writer.WriteStringPadRight(value.TerminalId.ToUpper(), 30);
+                writer.WriteBigNumber(value.TerminalId.ToUpper(), 30);
                 writer.WriteStringPadLeft(value.TerminalSimCode, 13);
             }
         }
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs
index 2f76fdc..97f2826 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs
@@ -8,30 +8,29 @@ using JT809.Protocol.Interfaces;
 namespace JT809.Protocol.SubMessageBody
 {
     /// <summary>
-    /// 实时上传车辆定位信息
+    /// 实时上传车辆定位信息消息
     /// <para>子业务类型标识:UP_EXG_MSG_REAL_LOCATION</para>
+    /// <para>车辆的实时定位信息</para>
+    /// <para>无需应答</para>
     /// </summary>
     public class JT809_0x1200_0x1202:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1200_0x1202>,IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.实时上传车辆定位信息.ToUInt16Value();
 
         public override string Description => "实时上传车辆定位信息";
-        public JT809_0x1200_0x1202()
-        {
-            VehiclePosition = new JT809VehiclePositionProperties();
-        }
         /// <summary>
         /// 车辆定位信息
         /// </summary>
         public JT809VehiclePositionProperties VehiclePosition { get; set; }
 
-        public JT809VehiclePositionProperties_2019 GnssData { get; set; }
+        public JT809VehiclePositionProperties_2019 GNSSData { get; set; }
 
         public JT809_0x1200_0x1202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202();
             if (config.Version == JT809Version.JTT2011)
             {
+                value.VehiclePosition = new JT809VehiclePositionProperties();
                 value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
                 value.VehiclePosition.Day = reader.ReadByte();
                 value.VehiclePosition.Month = reader.ReadByte();
@@ -51,7 +50,16 @@ namespace JT809.Protocol.SubMessageBody
             }
             else 
             {
-#warning JT809VehiclePositionProperties_2019
+               value.GNSSData = new JT809VehiclePositionProperties_2019();
+               value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
+               value.GNSSData.DataLength = reader.ReadUInt32();
+               value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray();
+               value.GNSSData.PlatformId1 = reader.ReadBigNumber(11);
+               value.GNSSData.Alarm1 = reader.ReadUInt32();
+               value.GNSSData.PlatformId2 = reader.ReadBigNumber(11);
+                value.GNSSData.Alarm2 = reader.ReadUInt32();
+               value.GNSSData.PlatformId3 = reader.ReadBigNumber(11);
+                value.GNSSData.Alarm3 = reader.ReadUInt32();
             }
             return value;
         }
@@ -79,7 +87,16 @@ namespace JT809.Protocol.SubMessageBody
             }
             else 
             {
-#warning JT809VehiclePositionProperties_2019
+                writer.WriteByte((byte)value.GNSSData.Encrypt);
+                writer.Skip(4, out int position);
+                writer.WriteArray(value.GNSSData.GnssData);
+                writer.WriteBigNumber(value.GNSSData.PlatformId1,11);
+                writer.WriteUInt32(value.GNSSData.Alarm1);
+                writer.WriteBigNumber(value.GNSSData.PlatformId2,11);
+                writer.WriteUInt32(value.GNSSData.Alarm2);
+                writer.WriteBigNumber(value.GNSSData.PlatformId3,11);
+                writer.WriteUInt32(value.GNSSData.Alarm3);
+                writer.WriteUInt32Return((uint)(writer.GetCurrentPosition() - position - 4), position);
             }
         }
     }
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs
index 25dd473..d06a675 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs
@@ -6,19 +6,20 @@ using JT809.Protocol.Metadata;
 using System;
 using System.Collections.Generic;
 using System.Text;
+using JT809.Protocol.Interfaces;
 
 namespace JT809.Protocol.SubMessageBody
 {
     /// <summary>
     ///  车辆定位信息自动补报请求消息
     ///  <para>子业务类型标识:UP_EXG_MSG_HISTORY_LOCATION</para>
-    ///  <para>描述:如果平台间传输链路中断,下级平台重新登录并与上级平台建立通信链路后,下级平台应将中断期间内车载终端上传的车辆定位信息自动补报到上级平台。
-    ///  如果系统断线期间,该车需发送的数据包条数大于 5,则以每包五条进行补发,直到补发完毕。
-    ///  多条数据以卫星定位时间先后顺序排列。
+    ///  <para>描述:  a: 如果平台间传输链路中断,下级平台重新登录并与上级平台建立通信链路后,下级平台应将中断期间内车载终端上传的车辆定位信息自动补报到上级平台。
+    ///  b: 如果系统断线期间,该车需发送的数据包条数大于 5,则以每包五条进行补发,直到补发完毕。
+    ///   多条数据以卫星定位时间先后顺序排列。
     ///  本条消息上级平台采用定量回复,即收到一定数量的数据后,即通过从链路应答数据量。
     ///  </para>
     /// </summary>
-    public class JT809_0x1200_0x1203 : JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1200_0x1203>
+    public class JT809_0x1200_0x1203 : JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1200_0x1203>, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆定位信息自动补报请求消息.ToUInt16Value();
 
@@ -43,8 +44,7 @@ namespace JT809.Protocol.SubMessageBody
                 {
                     try
                     {
-                        JT809MessagePackReader jT809_0x1200_0x1202Reader = new JT809MessagePackReader(reader.ReadArray(36));
-                        var jT809_0x1200_0x1202 = config.GetMessagePackFormatter<JT809_0x1200_0x1202>().Deserialize(ref jT809_0x1200_0x1202Reader, config);
+                        var jT809_0x1200_0x1202 = config.GetMessagePackFormatter<JT809_0x1200_0x1202>().Deserialize(ref reader, config);
                         jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202);
                     }
                     catch (Exception)