From 709523b1700bc1d6bf27623ddae21ef98e190af9 Mon Sep 17 00:00:00 2001
From: "SmallChi(Koike)" <564952747@qq.com>
Date: Tue, 5 May 2020 09:47:40 +0800
Subject: [PATCH] =?UTF-8?q?jt809=5F2019=E6=94=B9=E9=80=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../JT809SerializerContext.cs                 |   2 +-
 src/JT809.Protocol.Test/AnalyzeTest.cs        | 254 ++++++++++++++++++
 .../JT809.Protocol.Test.csproj                |   1 +
 .../JT809SubPackageExtensionsTest.cs          |   4 +-
 .../JT809_0x1200_0x1201Test.cs                |  57 ++++
 .../JT809_0x1200_0x1202Test.cs                |  83 ++++++
 .../JT809_0x1500_0x1502Test.cs                |   8 +-
 .../JT809_0x1600_0x1602Test.cs                | 122 +++++++++
 .../JT809_0x9400_0x9401Test.cs                |   8 +-
 .../JT809_0x9500_0x9502Test.cs                |   4 +-
 .../JT809_0x9500_0x9503Test.cs                |   8 +-
 .../JT809_0x9500_0x9504Test.cs                |   8 +-
 src/JT809.Protocol.Test/Simples/Demo1.cs      |  14 +-
 .../Enums/JT809_0x920D_Result.cs              |  14 +
 .../Enums/JT809_0x9503_MsgPriority.cs         |  12 +
 .../Enums/JT809_9401_SupervisionLevel.cs      |  12 +
 .../Enums/JT809__0x9502_ImageType.cs          |  14 +
 .../Enums/JT809__0x9502_SizeType.cs           |  18 ++
 src/JT809.Protocol/JT809.Protocol.csproj      |   5 +
 src/JT809.Protocol/JT809Header.cs             |  24 +-
 src/JT809.Protocol/JT809Package.cs            |  88 +++++-
 .../MessageBody/JT809_0x1200.cs               |   2 +
 .../MessageBody/JT809_0x1300.cs               |   2 +
 .../MessageBody/JT809_0x1400.cs               |   2 +
 .../MessageBody/JT809_0x1500.cs               |   2 +
 .../MessageBody/JT809_0x1600.cs               |   2 +
 .../MessageBody/JT809_0x9007.cs               |   2 +-
 .../MessageBody/JT809_0x9008.cs               |   2 +-
 .../MessageBody/JT809_0x9103.cs               |   5 +-
 .../MessageBody/JT809_0x9200.cs               |   2 +
 .../MessageBody/JT809_0x9300.cs               |   2 +
 .../MessageBody/JT809_0x9400.cs               |   2 +
 .../MessageBody/JT809_0x9500.cs               |   2 +
 .../MessageBody/JT809_0x9600.cs               |   2 +
 .../SubMessageBody/JT809_0x1200_0x1202.cs     |  10 +-
 .../SubMessageBody/JT809_0x1300_0x1302.cs     |   1 -
 .../SubMessageBody/JT809_0x1500_0x1502.cs     |  20 +-
 .../SubMessageBody/JT809_0x1500_0x1503.cs     |  25 +-
 .../SubMessageBody/JT809_0x1500_0x1504.cs     |  23 +-
 .../SubMessageBody/JT809_0x1500_0x1505.cs     |  18 +-
 .../SubMessageBody/JT809_0x1600_0x1601.cs     |  19 +-
 .../SubMessageBody/JT809_0x1600_0x1602.cs     |  11 +-
 .../SubMessageBody/JT809_0x9200_0x9201.cs     |  12 +-
 .../SubMessageBody/JT809_0x9200_0x9202.cs     | 131 ++++++---
 .../SubMessageBody/JT809_0x9200_0x9203.cs     |  44 ++-
 .../SubMessageBody/JT809_0x9200_0x9204.cs     |  18 +-
 .../SubMessageBody/JT809_0x9200_0x9205.cs     |  20 +-
 .../SubMessageBody/JT809_0x9200_0x9206.cs     |  19 +-
 .../SubMessageBody/JT809_0x9200_0x9207.cs     |  18 +-
 .../SubMessageBody/JT809_0x9200_0x9208.cs     |  17 +-
 .../SubMessageBody/JT809_0x9200_0x9209.cs     |  17 +-
 .../SubMessageBody/JT809_0x9200_0x920A.cs     |  13 +-
 .../SubMessageBody/JT809_0x9200_0x920D.cs     |  23 +-
 .../SubMessageBody/JT809_0x9300_0x9301.cs     |  50 +++-
 .../SubMessageBody/JT809_0x9300_0x9302.cs     |  36 ++-
 .../SubMessageBody/JT809_0x9300_0x9303.cs     |  14 +-
 .../SubMessageBody/JT809_0x9400_0x9401.cs     |  60 ++++-
 .../SubMessageBody/JT809_0x9400_0x9402.cs     |  49 +++-
 .../SubMessageBody/JT809_0x9400_0x9403.cs     |  50 +++-
 .../SubMessageBody/JT809_0x9500_0x9501.cs     |  19 +-
 .../SubMessageBody/JT809_0x9500_0x9502.cs     |  28 +-
 .../SubMessageBody/JT809_0x9500_0x9503.cs     |  35 ++-
 .../SubMessageBody/JT809_0x9500_0x9504.cs     |  53 +++-
 .../SubMessageBody/JT809_0x9500_0x9505.cs     |  50 +++-
 64 files changed, 1497 insertions(+), 195 deletions(-)
 create mode 100644 src/JT809.Protocol.Test/AnalyzeTest.cs
 create mode 100644 src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1600_0x1602Test.cs
 create mode 100644 src/JT809.Protocol/Enums/JT809_0x920D_Result.cs
 create mode 100644 src/JT809.Protocol/Enums/JT809_0x9503_MsgPriority.cs
 create mode 100644 src/JT809.Protocol/Enums/JT809_9401_SupervisionLevel.cs
 create mode 100644 src/JT809.Protocol/Enums/JT809__0x9502_ImageType.cs
 create mode 100644 src/JT809.Protocol/Enums/JT809__0x9502_SizeType.cs

diff --git a/src/JT809.Protocol.Benchmark/JT809SerializerContext.cs b/src/JT809.Protocol.Benchmark/JT809SerializerContext.cs
index fd82a13..55a9652 100644
--- a/src/JT809.Protocol.Benchmark/JT809SerializerContext.cs
+++ b/src/JT809.Protocol.Benchmark/JT809SerializerContext.cs
@@ -70,7 +70,7 @@ namespace JT809.Protocol.Benchmark
                     WarnTime = DateTime.Parse("2018-09-27 10:24:00"),
                     SupervisionID = "123FFAA1",
                     SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"),
-                    SupervisionLevel = 3,
+                    SupervisionLevel =  JT809_9401_SupervisionLevel.一般,
                     Supervisor = "smallchi",
                     SupervisorTel = "12345678901",
                     SupervisorEmail = "123456@qq.com"
diff --git a/src/JT809.Protocol.Test/AnalyzeTest.cs b/src/JT809.Protocol.Test/AnalyzeTest.cs
new file mode 100644
index 0000000..7f75239
--- /dev/null
+++ b/src/JT809.Protocol.Test/AnalyzeTest.cs
@@ -0,0 +1,254 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JT809.Protocol;
+using JT809.Protocol.Extensions;
+using System.Threading.Tasks;
+using System.Diagnostics;
+using JT809.Protocol.Enums;
+using JT809.Protocol.Internal;
+using JT809.Protocol.MessageBody;
+using JT809.Protocol.SubMessageBody;
+
+namespace JT809.Protocol.Test
+{
+    public  class AnalyzeTest
+    {
+        private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 });
+        private JT809Serializer JT809Serializer = new JT809Serializer();
+        [Fact]
+        public void Test1()
+        {
+            string hex = "01 33 EF B8 32 30 31 38 30 39 32 30 31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 29";
+            var json = JT809Serializer.Analyze<JT809_0x1001>(hex.ToHexBytes());
+            hex = "0133EFB8323031383039323002A7DD233132372E302E302E3100000000000000000000000000000000000000000000000329";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1001>(hex.ToHexBytes());
+            //ref demo1-test3
+            hex = "5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D000000000000000000000000000000000000007AEA5D";
+            json = JT809Serializer.Analyze(hex.ToHexBytes());
+            // ref 0x1201-test3
+            hex = "5B000000AC000006821200013415F4010000000000270F000000005E02A507B8D4C1413132333435000000000000000000000000000112010000006E31313131313131313131003131313131313131313100313131313131313100000000000000000000000000000000000000000000313233343536373839000000000000313131313141410000000000000000000000000000000000000000000000323232323232323232323232006D7A5D";
+            json = JT809_2019_Serializer.Analyze(hex.ToHexBytes());
+
+            hex = "00 00 00 D4 B8";
+            json = JT809Serializer.Analyze<JT809_0x1002>(hex.ToHexBytes());
+
+            hex = "0133EFB83230313830393230";
+            json = JT809Serializer.Analyze<JT809_0x1003>(hex.ToHexBytes());
+
+            hex = "00";
+            json = JT809Serializer.Analyze<JT809_0x1007>(hex.ToHexBytes());
+
+            hex = "00";
+            json = JT809Serializer.Analyze<JT809_0x1008>(hex.ToHexBytes());
+
+            hex = "D4C1413132333435000000000000000000000000000112010000003D31313131313131313131003131313131313131313100313131313131313100000000000000000000000031313131314141323232323232323232323232";
+            json = JT809Serializer.Analyze<JT809_0x1200>(hex.ToHexBytes());
+
+            hex = "D4C1413132333435000000000000000000000000000112010000006E3131313131313131313100313131313131313131310031313131313131310000000000000000000000000000000000000000000031323334353637383900000000000031313131314141000000000000000000000000000000000000000000000032323232323232323232323200";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1200>(hex.ToHexBytes());
+
+            hex = "13010000001B01313131000000000000000000000004D200000006323268613232";
+            json = JT809Serializer.Analyze<JT809_0x1300>(hex.ToHexBytes());
+
+            hex = "13010000004901736D616C6C636869000000000000000031323334353637383930310000000000000000003131310000000000000000000000000000000000006F0000006300000006323268613232";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1300>(hex.ToHexBytes());
+
+            hex = "D4C14131323334350000000000000000000000000001160100000006CAB2C3B4B9ED";
+            json = JT809Serializer.Analyze<JT809_0x1600>(hex.ToHexBytes());
+
+            hex = "D4C1413132333435000000000000000000000000000116010000000C000100000002CAB2C3B4B9ED";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1600>(hex.ToHexBytes());
+
+            hex = "0000B18E";
+            json = JT809Serializer.Analyze<JT809_0x9001>(hex.ToHexBytes());
+
+            hex = "00";
+            json = JT809Serializer.Analyze<JT809_0x9002>(hex.ToHexBytes());
+
+            hex = "00 00 B1 8E";
+            json = JT809Serializer.Analyze<JT809_0x9003>(hex.ToHexBytes());
+
+            hex = "00";
+            json = JT809Serializer.Analyze<JT809_0x9007>(hex.ToHexBytes());
+
+            hex = "01";
+            json = JT809Serializer.Analyze<JT809_0x9008>(hex.ToHexBytes());
+
+            hex = "00 00 27 10 00 00 00 00 5B A4 99 86 00 00 00 00 5B A4 DF D6";
+            json = JT809Serializer.Analyze<JT809_0x9101>(hex.ToHexBytes());
+
+            //子类型
+            hex = "31313131313131313131003131313131313131313100313131313131313100000000000000000000000031313131314141323232323232323232323232";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x1201>(hex.ToHexBytes());
+
+            hex = "3131313131313131313100313131313131313131310031313131313131310000000000000000000000000000000000000000000031323334353637383900000000000031313131314141000000000000000000000000000000000000000000000032323232323232323232323200";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1200_0x1201>(hex.ToHexBytes());
+
+            hex = "00130707DC0F0F0F07EF4D80017018400032003300000096002D002D0000000300000101";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x1202>(hex.ToHexBytes());
+
+            hex = "0100000000313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1200_0x1202>(hex.ToHexBytes());
+
+            hex = "0300130707DC0F0F0F07EF4D80017018400032003300000096002D002D000000030000010100130707DC10101007EF4D80017018400032003300000096002D002D000000030000010100130707DC11111107EF4D80017018400032003300000096002D002D0000000300000101";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x1203>(hex.ToHexBytes());
+
+            hex = "0201000000003131313131313131313131000000013232323232323232323232000000023333333333333333333333000000030100000000313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1200_0x1203>(hex.ToHexBytes());
+
+            hex = "000000005BA880B6000000005BA9016B";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x1207>(hex.ToHexBytes());
+
+            hex = "000000005BA880B6000000005BA9016B";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x1209>(hex.ToHexBytes());
+
+            hex = "736D616C6C63686900000000000000003132333435363738393132333435363738390000616263646566313233343536373839000000000000000000000000000000000000000000000000007777773132333435363738390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x120A>(hex.ToHexBytes());
+
+            hex = "000200000001736D616C6C63686900000000000000003132333435363738393132333435363738390000616263646566313233343536373839000000000000000000000000000000000000000000000000007777773132333435363738390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005EA1A49E";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1200_0x120A>(hex.ToHexBytes());
+
+            hex = "0000000C617364313233343536617364";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x120B>(hex.ToHexBytes());
+
+            hex = "0002000000010000000C617364313233343536617364";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1200_0x120B>(hex.ToHexBytes());
+
+            hex = "736D616C6C6368690000000000000000313233343536373839303132330000000000000033323130393837363534333231000000000000000000000000000000000000000000000000000000676F760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x120C>(hex.ToHexBytes());
+
+            hex = "736D616C6C6368690000000000000000313233343536373839303132330000000000000033323130393837363534333231000000000000000000000000000000000000000000000000000000676F760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005EA19D4F";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1200_0x120C>(hex.ToHexBytes());
+
+            hex = "0000000C617364313233343536617364";
+            json = JT809Serializer.Analyze<JT809_0x1200_0x120D>(hex.ToHexBytes());
+
+            hex = "01313131000000000000000000000004D200000006323268613232";
+            json = JT809Serializer.Analyze<JT809_0x1300_0x1301>(hex.ToHexBytes());
+
+            hex = "01736D616C6C636869000000000000000031323334353637383930310000000000000000003131310000000000000000000000000000000000006F0000006300000006323268613232";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1300_0x1301>(hex.ToHexBytes());
+
+            hex = "000004D2";
+            json = JT809Serializer.Analyze<JT809_0x1300_0x1302>(hex.ToHexBytes());
+
+            hex = "00990000000B";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1300_0x1302>(hex.ToHexBytes());
+
+            hex = "000026AA00";
+            json = JT809Serializer.Analyze<JT809_0x1400_0x1401>(hex.ToHexBytes());
+
+            hex = "01000B000000005BAA5B8000000D100000000A67666466343534353533";
+            json = JT809Serializer.Analyze<JT809_0x1400_0x1402>(hex.ToHexBytes());
+
+            hex = "3132333435363738393030000B000000005EA06A00000000005EA06A00000000005EA1BB80D4C141313131313100000000000000000000000000013132333435363738393030000000000000000A67666466343534353533";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1400_0x1402>(hex.ToHexBytes());
+
+            hex = "00000D1003";
+            json = JT809Serializer.Analyze<JT809_0x1400_0x1403>(hex.ToHexBytes());
+
+            hex = "00000000000002DFDC1C34000B000000005EA06A00000000005EA06A00000000005EA1BB80D4C1413131313131000000000000000000000000000100000000000002DFDC1C34000000370000000A67666466343534353533";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1400_0x1403>(hex.ToHexBytes());
+
+            hex = "00";
+            json = JT809Serializer.Analyze<JT809_0x1500_0x1501>(hex.ToHexBytes());
+
+            hex = "0100130707DC0F0F0F07EF4D80017018400035002D000004D2002D002D00000001000000017B000000000101";
+            json = JT809Serializer.Analyze<JT809_0x1500_0x1502>(hex.ToHexBytes());
+
+            hex = "0000270F00";
+            json = JT809Serializer.Analyze<JT809_0x1500_0x1503>(hex.ToHexBytes());
+
+            hex = "00630000000B00";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1500_0x1503>(hex.ToHexBytes());
+
+            hex = "0700000006313233343536";
+            json = JT809Serializer.Analyze<JT809_0x1500_0x1504>(hex.ToHexBytes());
+
+            hex = "000C000000010700000006313233343536";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1500_0x1504>(hex.ToHexBytes());
+
+            hex = "01";
+            json = JT809Serializer.Analyze<JT809_0x1500_0x1505>(hex.ToHexBytes());
+
+            hex = "00050000000101";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1500_0x1505>(hex.ToHexBytes());
+
+            hex = "736D616C6C636869";
+            json = JT809Serializer.Analyze<JT809_0x1600_0x1601>(hex.ToHexBytes());
+
+            hex = "000100000002736D616C6C636869";
+            json = JT809_2019_Serializer.Analyze<JT809_0x1600_0x1601>(hex.ToHexBytes());
+
+            hex = "B3B5C1BED0C5CFA2";
+            json = JT809Serializer.Analyze<JT809_0x9200_0x9204>(hex.ToHexBytes());
+
+            hex = "02";
+            json = JT809Serializer.Analyze<JT809_0x9200_0x9205>(hex.ToHexBytes());
+
+            hex = "02";
+            json = JT809Serializer.Analyze<JT809_0x9200_0x9206>(hex.ToHexBytes());
+
+            hex = "00";
+            json = JT809Serializer.Analyze<JT809_0x9200_0x9207>(hex.ToHexBytes());
+
+            hex = "00010000000200";
+            json = JT809_2019_Serializer.Analyze<JT809_0x9200_0x9207>(hex.ToHexBytes());
+
+            hex = "02";
+            json = JT809Serializer.Analyze<JT809_0x9200_0x9208>(hex.ToHexBytes());
+
+            hex = "00010000000202";
+            json = JT809_2019_Serializer.Analyze<JT809_0x9200_0x9208>(hex.ToHexBytes());
+
+            hex = "00";
+            json = JT809Serializer.Analyze<JT809_0x9200_0x9209>(hex.ToHexBytes());
+
+            hex = "00160000002100";
+            json = JT809_2019_Serializer.Analyze<JT809_0x9200_0x9209>(hex.ToHexBytes());
+
+            hex = "02736D616C6C6368690000000000000D10000000057265706C79";
+            json = JT809Serializer.Analyze<JT809_0x9300_0x9301>(hex.ToHexBytes());
+
+            hex = "00616664617366330000000000000004D200000014CFC2BCB6C6BDCCA8CBF9CAF4B5A5D2BBC6BDCCA8";
+            json = JT809Serializer.Analyze<JT809_0x9300_0x9302>(hex.ToHexBytes());
+
+            hex = "010002000000005BAC3F40123FFAA1000000005BAC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000";
+            json = JT809Serializer.Analyze<JT809_0x9400_0x9401>(hex.ToHexBytes());
+
+            hex = "01000A000000005BE792C000000004BDD9BEAF";
+            json = JT809Serializer.Analyze<JT809_0x9400_0x9402>(hex.ToHexBytes());
+
+            hex = "00000000000002DFDC1C35000A000000005EA56104000000005EA56104000000005EA56F14D4C1413132333435000000000000000000000000000100000000000002DFDC1C350000001600000004BDD9BEAF";
+            json = JT809_2019_Serializer.Analyze<JT809_0x9400_0x9402>(hex.ToHexBytes());
+
+            hex = "010002000000005BE792C00000000CC6A3C0CDBCDDCABBB1A8BEAF";
+            json = JT809Serializer.Analyze<JT809_0x9400_0x9403>(hex.ToHexBytes());
+
+            hex = "00000000000002DFDC1C350002000000005EA56140000000005EA56140000000005EA56F50D4C1413536343700000000000000000000000000000200000000000002DFDC1C35000000000000000CC6A3C0CDBCDDCABBB1A8BEAF";
+            json = JT809_2019_Serializer.Analyze<JT809_0x9400_0x9403>(hex.ToHexBytes());
+
+            hex = "3132333435363738390000000000000000000000";
+            json = JT809Serializer.Analyze<JT809_0x9500_0x9501>(hex.ToHexBytes());
+
+            hex = "0901";
+            json = JT809Serializer.Analyze<JT809_0x9500_0x9502>(hex.ToHexBytes());
+
+            hex = "0000014D010000000BBABA5F7366646633646673";
+            json = JT809Serializer.Analyze<JT809_0x9500_0x9503>(hex.ToHexBytes());
+
+            hex = "1018092720002018092723002015B4";
+            json = JT809Serializer.Analyze<JT809_0x9500_0x9504>(hex.ToHexBytes());
+
+            hex = "000000005EA577D4000000005EA5A20410";
+            json = JT809_2019_Serializer.Analyze<JT809_0x9500_0x9504>(hex.ToHexBytes());
+
+            hex = "000000000000000008086A743830380000000000000000000000000000006164736C736D616C6C636869000000000000000000000000000000000000000000000000000000000000000000000000006164736C3132330000000000000000000000000000003132372E302E302E31000000000000000000000000000000000000000000000003280329000000005BACC640";
+            json = JT809Serializer.Analyze<JT809_0x9500_0x9505>(hex.ToHexBytes());
+
+            
+        }
+    }
+}
diff --git a/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj b/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj
index 1668952..512c5f3 100644
--- a/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj
+++ b/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj
@@ -11,6 +11,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <PackageReference Include="JT808" Version="2.2.10" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.3" />
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
     <PackageReference Include="xunit" Version="2.4.1" />
diff --git a/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs b/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs
index 855b319..081d311 100644
--- a/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs
+++ b/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs
@@ -77,7 +77,7 @@ namespace JT809.Protocol.Test.JT809Extensions
                             WarnTime = DateTime.Parse("2018-09-27 10:24:00"),
                             SupervisionID = "123FFAA1",
                             SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"),
-                            SupervisionLevel = 3,
+                            SupervisionLevel =  JT809_9401_SupervisionLevel.一般,
                             Supervisor = "smallchi",
                             SupervisorTel = "12345678901",
                             SupervisorEmail = "123456@qq.com"
@@ -87,7 +87,7 @@ namespace JT809.Protocol.Test.JT809Extensions
             var hex = JT809Serializer.Serialize(jT809Package).ToHexString();
             //5B0000007C0000068294000133EFB8010000000000270F94010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000A6565D
             //5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D
-            Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D", hex);
+            Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D000000000000000000000000000000000000007AEA5D", hex);
         }
     }
 }
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1201Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1201Test.cs
index 45abc62..59d556a 100644
--- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1201Test.cs
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1201Test.cs
@@ -74,5 +74,62 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
             Assert.Equal("222222222222", jT809_0X1200_0X1201.TerminalSimCode);
             Assert.Equal("123456789", jT809_0X1200_0X1201.IMIEId);
         }
+
+        [Fact]
+        public void Test_2019_3()
+        {
+            JT809Package jT809Package = new JT809Package();
+            jT809Package.Header = new JT809Header
+            {
+                MsgSN = 1666,
+                EncryptKey = 9999,
+                EncryptFlag = JT809Header_Encrypt.None,
+                Version = new JT809Header_Version(1, 0, 0),
+                BusinessType = JT809BusinessType.主链路车辆动态信息交换业务.ToUInt16Value(),
+                MsgGNSSCENTERID = 20190708,
+                Time = DateTime.Parse("2020-04-26 12:02:00")
+            };
+            JT809_0x1200 jT809_0X1200 = new JT809_0x1200();
+            jT809_0X1200.VehicleNo = "粤A12345";
+            jT809_0X1200.VehicleColor = JT809VehicleColorType.蓝色;
+            jT809_0X1200.SubBusinessType = JT809SubBusinessType.上传车辆注册信息.ToUInt16Value();
+            jT809_0X1200.DataLength = 110;
+            JT809_0x1200_0x1201 jT809_0X1200_0X1201 = new JT809_0x1200_0x1201
+            {
+                PlateformId = "1111111111",
+                ProducerId = "1111111111",
+                TerminalId = "11111AA",
+                TerminalModelType = "11111111",
+                TerminalSimCode = "222222222222",
+                IMIEId = "123456789"
+            };
+            jT809_0X1200.SubBodies = jT809_0X1200_0X1201;
+            jT809Package.Bodies = jT809_0X1200;
+
+            var hex = JT809_2019_Serializer.Serialize(jT809Package).ToHexString();
+            Assert.Equal("5B000000AC000006821200013415F4010000000000270F000000005E02A507B8D4C1413132333435000000000000000000000000000112010000006E31313131313131313131003131313131313131313100313131313131313100000000000000000000000000000000000000000000313233343536373839000000000000313131313141410000000000000000000000000000000000000000000000323232323232323232323232006D7A5D", hex);
+        }
+
+        [Fact]
+        public void Test_2019_4()
+        {
+            var bytes = "5B000000AC000006821200013415F4010000000000270F000000005E02A507B8D4C1413132333435000000000000000000000000000112010000006E31313131313131313131003131313131313131313100313131313131313100000000000000000000000000000000000000000000313233343536373839000000000000313131313141410000000000000000000000000000000000000000000000323232323232323232323232006D7A5D".ToHexBytes();
+            var package = JT809_2019_Serializer.Deserialize<JT809Package>(bytes);
+            JT809_0x1200 jT809_0X9001 = package.Bodies as JT809_0x1200;
+            Assert.Equal("粤A12345", jT809_0X9001.VehicleNo);
+            Assert.Equal(JT809VehicleColorType.蓝色, jT809_0X9001.VehicleColor);
+            Assert.Equal(JT809SubBusinessType.上传车辆注册信息, (JT809SubBusinessType)jT809_0X9001.SubBusinessType);
+            Assert.Equal(110u, jT809_0X9001.DataLength);
+
+            JT809_0x1200_0x1201 jT809_0X1200_0X1201 = jT809_0X9001.SubBodies as JT809_0x1200_0x1201;
+            Assert.Equal("1111111111", jT809_0X1200_0X1201.PlateformId);
+            Assert.Equal("1111111111", jT809_0X1200_0X1201.ProducerId);
+            Assert.Equal("11111AA", jT809_0X1200_0X1201.TerminalId);
+            Assert.Equal("11111111", jT809_0X1200_0X1201.TerminalModelType);
+            Assert.Equal("222222222222", jT809_0X1200_0X1201.TerminalSimCode);
+            Assert.Equal("123456789", jT809_0X1200_0X1201.IMIEId);
+        }
+
+
     }
 }
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs
index f10736b..8c1e800 100644
--- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs
@@ -9,14 +9,31 @@ using JT809.Protocol.Exceptions;
 using JT809.Protocol.SubMessageBody;
 using JT809.Protocol.Internal;
 using JT809.Protocol.Enums;
+using JT808.Protocol;
+using JT808.Protocol.Interfaces;
+using JT808.Protocol.MessageBody;
 
 namespace JT809.Protocol.Test.JT809SubMessageBody
 {
+    public class DefaultGlobal808_2019Config : GlobalConfigBase
+    {
+        public override string ConfigId { get; protected set; }
+        public DefaultGlobal808_2019Config(string configId = "jt808_2019")
+        {
+            ConfigId = configId;
+
+        }
+    }
     public class JT809_0x1200_0x1202Test
     {
         private JT809Serializer JT809Serializer = new JT809Serializer();
 
         private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 });
+        private JT808Serializer JT808Serializer_2019;
+        public JT809_0x1200_0x1202Test() {
+            IJT808Config jT808Config = new DefaultGlobal808_2019Config();
+            JT808Serializer_2019 = new JT808Serializer(jT808Config);           
+        }
 
         [Fact]
         public void Test1()
@@ -95,6 +112,72 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
             Assert.Equal("33333333333", jT809_0X1200_0X1202.GNSSData.PlatformId3);
             Assert.Equal(3u, jT809_0X1200_0X1202.GNSSData.Alarm3);
         }
+#warning 此处结合808协议包解析 808中的定位信息
+
+        [Fact]
+        public void Test_2019_3()
+        {
+            JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200
+            {
+                AlarmFlag = 1,
+                Altitude = 40,
+                GPSTime = DateTime.Parse("2018-07-15 10:10:10"),
+                Lat = 12222222,
+                Lng = 132444444,
+                Speed = 60,
+                Direction = 0,
+                StatusFlag = 2,
+                JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>()
+            };
+            jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01
+            {
+                Mileage = 100
+            });
+            jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02
+            {
+                Oil = 55
+            });
+            var jt808_0x0200Hex = JT808Serializer_2019.Serialize(jT808UploadLocationRequest, JT808.Protocol.Enums.JT808Version.JTT2019);
+
+            JT809_0x1200_0x1202 jT809_0X1200_0X1202 = new JT809_0x1200_0x1202();
+            jT809_0X1200_0X1202.GNSSData = new Metadata.JT809VehiclePositionProperties_2019();
+            jT809_0X1200_0X1202.GNSSData.Encrypt = JT809_VehiclePositionEncrypt.已加密;
+            jT809_0X1200_0X1202.GNSSData.GnssData = jt808_0x0200Hex;
+            jT809_0X1200_0X1202.GNSSData.PlatformId1 = "11111111111";
+            jT809_0X1200_0X1202.GNSSData.Alarm1 = 1;
+            jT809_0X1200_0X1202.GNSSData.PlatformId2 = "22222222222";
+            jT809_0X1200_0X1202.GNSSData.Alarm2 = 2;
+            jT809_0X1200_0X1202.GNSSData.PlatformId3 = "33333333333";
+            jT809_0X1200_0X1202.GNSSData.Alarm3 = 3;
+            var hex = JT809_2019_Serializer.Serialize(jT809_0X1200_0X1202).ToHexString();
+            Assert.Equal("0100000026000000010000000200BA7F0E07E4F11C0028003C000018071510101001040000006402020037313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003", hex);
+
+        }
 
+        [Fact]
+        public void Test_2019_4()
+        {
+            var bytes = "0100000026000000010000000200BA7F0E07E4F11C0028003C000018071510101001040000006402020037313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003".ToHexBytes();
+            JT809_0x1200_0x1202 jT809_0X1200_0X1202 = JT809_2019_Serializer.Deserialize<JT809_0x1200_0x1202>(bytes);
+            Assert.Equal(JT809_VehiclePositionEncrypt.已加密, jT809_0X1200_0X1202.GNSSData.Encrypt);
+            Assert.Equal("11111111111", jT809_0X1200_0X1202.GNSSData.PlatformId1);
+            Assert.Equal(1u, jT809_0X1200_0X1202.GNSSData.Alarm1);
+            Assert.Equal("22222222222", jT809_0X1200_0X1202.GNSSData.PlatformId2);
+            Assert.Equal(2u, jT809_0X1200_0X1202.GNSSData.Alarm2);
+            Assert.Equal("33333333333", jT809_0X1200_0X1202.GNSSData.PlatformId3);
+            Assert.Equal(3u, jT809_0X1200_0X1202.GNSSData.Alarm3);
+
+            var jt808_0x0200Hex = jT809_0X1200_0X1202.GNSSData.GnssData;
+            var jt808_0x0200 = JT808Serializer_2019.Deserialize<JT808_0x0200>(jt808_0x0200Hex, JT808.Protocol.Enums.JT808Version.JTT2019);
+            Assert.Equal((uint)1, jt808_0x0200.AlarmFlag);
+            Assert.Equal(DateTime.Parse("2018-07-15 10:10:10"), jt808_0x0200.GPSTime);
+            Assert.Equal(12222222, jt808_0x0200.Lat);
+            Assert.Equal(132444444, jt808_0x0200.Lng);
+            Assert.Equal(60, jt808_0x0200.Speed);
+            Assert.Equal((uint)2, jt808_0x0200.StatusFlag);
+            Assert.Equal(100, ((JT808_0x0200_0x01)jt808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage);
+            Assert.Equal(55, ((JT808_0x0200_0x02)jt808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil);
+
+        }
     }
 }
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs
index 5803067..4616743 100644
--- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs
@@ -41,8 +41,8 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
                          Alarm=1
                     },
                      LensID=123,
-                     SizeType=1,
-                     Type=1,
+                     SizeType= JT809__0x9502_SizeType._320x240 ,
+                     Type= JT809__0x9502_ImageType.jpg,
             };
             var hex = JT809Serializer.Serialize(jT809_0x1500_0x1502).ToHexString();
             //"01 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 35 00 2D 00 00 04 D2 00 2D 00 2D 00 00 00 01 00 00 00 01 7B 00 00 00 00 01 01"
@@ -72,8 +72,8 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
             Assert.Equal((uint)1, jT809_0x1500_0x1502.VehiclePosition.State);
             Assert.Equal((uint)1, jT809_0x1500_0x1502.VehiclePosition.Alarm);
             Assert.Equal(123, jT809_0x1500_0x1502.LensID);
-            Assert.Equal(1, jT809_0x1500_0x1502.SizeType);
-            Assert.Equal(1, jT809_0x1500_0x1502.Type);
+            Assert.Equal( JT809__0x9502_SizeType._320x240, jT809_0x1500_0x1502.SizeType);
+            Assert.Equal( JT809__0x9502_ImageType.jpg, jT809_0x1500_0x1502.Type);
         }
     }
 }
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1600_0x1602Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1600_0x1602Test.cs
new file mode 100644
index 0000000..cd8d28a
--- /dev/null
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1600_0x1602Test.cs
@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JT809.Protocol;
+using JT809.Protocol.Extensions;
+using JT809.Protocol.MessageBody;
+using JT809.Protocol.Exceptions;
+using JT809.Protocol.SubMessageBody;
+using JT809.Protocol.Enums;
+using JT809.Protocol.Internal;
+using JT808.Protocol.MessageBody;
+using JT808.Protocol.Interfaces;
+using JT808.Protocol;
+using JT808.Protocol.Metadata;
+
+namespace JT809.Protocol.Test.JT809SubMessageBody
+{
+    public class JT809_0x1600_0x1602Test
+    {
+        private JT809Serializer JT809Serializer = new JT809Serializer();
+        private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 });
+        private JT808Serializer JT808Serializer_2019;
+#warning 结合808协议包,解析808中的路线信息
+        public JT809_0x1600_0x1602Test()
+        {
+            IJT808Config jT808Config = new DefaultGlobal808_2019Config();
+            JT808Serializer_2019 = new JT808Serializer(jT808Config);
+        }
+        [Fact]
+        public void Test_2019_1()
+        {
+            JT808_0x8606 jT808_0X8606 = new JT808_0x8606
+            {
+                RouteId = 9999,
+                RouteProperty = 1268,
+                StartTime = DateTime.Parse("2018-11-20 00:00:12"),
+                EndTime = DateTime.Parse("2018-11-21 00:00:12"),
+                InflectionPointItems = new List<JT808InflectionPointProperty>()
+            };
+            jT808_0X8606.InflectionPointItems.Add(new JT808InflectionPointProperty()
+            {
+                InflectionPointId = 1000,
+                InflectionPointLat = 123456789,
+                InflectionPointLng = 123456788,
+                SectionDrivingUnderThreshold = 123,
+                SectionHighestSpeed = 69,
+                SectionId = 1287,
+                SectionLongDrivingThreshold = 50,
+                SectionOverspeedDuration = 23,
+                SectionProperty = 89,
+                SectionWidth = 56
+            });
+            jT808_0X8606.InflectionPointItems.Add(new JT808InflectionPointProperty()
+            {
+                InflectionPointId = 1001,
+                InflectionPointLat = 123456780,
+                InflectionPointLng = 123456781,
+                SectionDrivingUnderThreshold = 124,
+                SectionHighestSpeed = 42,
+                SectionId = 12007,
+                SectionLongDrivingThreshold = 58,
+                SectionOverspeedDuration = 26,
+                SectionProperty = 50,
+                SectionWidth = 75
+            });
+            var jt808_hex = JT808Serializer_2019.Serialize(jT808_0X8606);
+
+            JT809_0x1600_0x1602 jT809_0x1600_0x1602 = new JT809_0x1600_0x1602
+            {
+                DRVLine= jt808_hex
+            };
+            var hex = JT809_2019_Serializer.Serialize(jT809_0x1600_0x1602).ToHexString();
+            Assert.Equal("0000270F04F40002000003E800000507075BCD15075BCD1438590032007B000003E900002EE7075BCD0C075BCD0D4B32002A1A", hex);
+        }
+
+        [Fact]
+        public void Test_2019_2()
+        {
+            var bytes = "0000270F04F40002000003E800000507075BCD15075BCD1438590032007B000003E900002EE7075BCD0C075BCD0D4B32002A1A".ToHexBytes();
+            JT809_0x1600_0x1602 jT809_0x1600_0x1602 = JT809_2019_Serializer.Deserialize<JT809_0x1600_0x1602>(bytes);
+
+            JT808_0x8606 jT808_0X8606 = JT808Serializer_2019.Deserialize<JT808_0x8606>(bytes);
+
+            Assert.Equal((uint)9999, jT808_0X8606.RouteId);
+            Assert.Equal((uint)1268, jT808_0X8606.RouteProperty);
+            //Assert.Equal(DateTime.Parse("2018-11-20 00:00:12"), jT808_0X8606.StartTime);
+            //Assert.Equal(DateTime.Parse("2018-11-21 00:00:12"), jT808_0X8606.EndTime);
+            Assert.Null(jT808_0X8606.StartTime);
+            Assert.Null(jT808_0X8606.EndTime);
+
+            Assert.Equal(2, jT808_0X8606.InflectionPointItems.Count);
+
+            Assert.Equal((uint)1000, jT808_0X8606.InflectionPointItems[0].InflectionPointId);
+            Assert.Equal((uint)123456789, jT808_0X8606.InflectionPointItems[0].InflectionPointLat);
+            Assert.Equal((uint)123456788, jT808_0X8606.InflectionPointItems[0].InflectionPointLng);
+
+            Assert.Equal((ushort)123, jT808_0X8606.InflectionPointItems[0].SectionDrivingUnderThreshold);
+            //Assert.Equal((ushort)69, jT808_0X8606.InflectionPointItems[0].SectionHighestSpeed);
+            Assert.Null(jT808_0X8606.InflectionPointItems[0].SectionHighestSpeed);
+            Assert.Equal((uint)1287, jT808_0X8606.InflectionPointItems[0].SectionId);
+            Assert.Equal((ushort)50, jT808_0X8606.InflectionPointItems[0].SectionLongDrivingThreshold);
+            //Assert.Equal((byte)23, jT808_0X8606.InflectionPointItems[0].SectionOverspeedDuration);
+            Assert.Equal(89, jT808_0X8606.InflectionPointItems[0].SectionProperty);
+            Assert.Equal(56, jT808_0X8606.InflectionPointItems[0].SectionWidth);
+
+            Assert.Equal((uint)1001, jT808_0X8606.InflectionPointItems[1].InflectionPointId);
+            Assert.Equal((uint)123456780, jT808_0X8606.InflectionPointItems[1].InflectionPointLat);
+            Assert.Equal((uint)123456781, jT808_0X8606.InflectionPointItems[1].InflectionPointLng);
+            //Assert.Equal((ushort)124, jT808_0X8606.InflectionPointItems[1].SectionDrivingUnderThreshold);
+            Assert.Null(jT808_0X8606.InflectionPointItems[1].SectionDrivingUnderThreshold);
+            Assert.Equal((ushort)42, jT808_0X8606.InflectionPointItems[1].SectionHighestSpeed);
+            Assert.Equal((uint)12007, jT808_0X8606.InflectionPointItems[1].SectionId);
+            //Assert.Equal((ushort)58, jT808_0X8606.InflectionPointItems[1].SectionLongDrivingThreshold);
+            Assert.Null(jT808_0X8606.InflectionPointItems[1].SectionLongDrivingThreshold);
+
+            Assert.Equal((byte)26, jT808_0X8606.InflectionPointItems[1].SectionOverspeedDuration);
+            Assert.Equal(50, jT808_0X8606.InflectionPointItems[1].SectionProperty);
+            Assert.Equal(75, jT808_0X8606.InflectionPointItems[1].SectionWidth);
+        }
+    }
+}
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9400_0x9401Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9400_0x9401Test.cs
index b7e2315..d6d5019 100644
--- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9400_0x9401Test.cs
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9400_0x9401Test.cs
@@ -24,7 +24,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
                   WarnTime=DateTime.Parse("2018-09-27 10:24:00"),
                   SupervisionID="123FFAA1",
                   SupervisionEndTime= DateTime.Parse("2018-09-27 11:24:00"),
-                  SupervisionLevel=3,
+                  SupervisionLevel= JT809_9401_SupervisionLevel.一般,
                   Supervisor="smallchi",
                   SupervisorTel= "12345678901",
                   SupervisorEmail= "123456@qq.com"
@@ -33,20 +33,20 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
             //010002000000005BAC3F40123FFAA1000000005BAC4D5003736D616C6C63686931323334353637383930313132333435364071712E636F6D
             //010002000000005BAC3F40123FFAA1000000005BAC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000
             //"01 00 02 00 00 00 00 5B AC 3F 40 12 3F FA A1 00 00 00 00 5B AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
-            Assert.Equal("010002000000005BAC3F40123FFAA1000000005BAC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000", hex);
+            Assert.Equal("010002000000005BAC3F40123FFAA1000000005BAC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000", hex);
         }
 
         [Fact]
         public void Test2()
         {
-            var bytes = "01 00 02 00 00 00 00 5B AC 3F 40 12 3F FA A1 00 00 00 00 5B AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00".ToHexBytes();
+            var bytes = "010002000000005BAC3F40123FFAA1000000005BAC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000".ToHexBytes();
             JT809_0x9400_0x9401 jT809_0x9400_0x9401 = JT809Serializer.Deserialize<JT809_0x9400_0x9401>(bytes);
             Assert.Equal(JT809WarnSrc.车载终端, jT809_0x9400_0x9401.WarnSrc);
             Assert.Equal(JT809WarnType.疲劳驾驶报警, (JT809WarnType)jT809_0x9400_0x9401.WarnType);
             Assert.Equal(DateTime.Parse("2018-09-27 10:24:00"), jT809_0x9400_0x9401.WarnTime);
             Assert.Equal("123FFAA1", jT809_0x9400_0x9401.SupervisionID);
             Assert.Equal(DateTime.Parse("2018-09-27 11:24:00"), jT809_0x9400_0x9401.SupervisionEndTime);
-            Assert.Equal(3, jT809_0x9400_0x9401.SupervisionLevel);
+            Assert.Equal(1, jT809_0x9400_0x9401.SupervisionLevel.ToByteValue());
             Assert.Equal("smallchi", jT809_0x9400_0x9401.Supervisor);
             Assert.Equal("12345678901", jT809_0x9400_0x9401.SupervisorTel);
             Assert.Equal("123456@qq.com", jT809_0x9400_0x9401.SupervisorEmail);
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9502Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9502Test.cs
index 7488c24..017cbfa 100644
--- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9502Test.cs
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9502Test.cs
@@ -19,7 +19,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
             JT809_0x9500_0x9502 jT809_0X9500_0X9502 = new JT809_0x9500_0x9502
             {
                   LensID=0x09,
-                  SizeType=0x01  
+                  SizeType= Enums.JT809__0x9502_SizeType._320x240  
             };
             var hex = JT809Serializer.Serialize(jT809_0X9500_0X9502).ToHexString();
             Assert.Equal("0901", hex);
@@ -31,7 +31,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
             var bytes = "0901".ToHexBytes();
             JT809_0x9500_0x9502 jT809_0X9500_0X9502 = JT809Serializer.Deserialize<JT809_0x9500_0x9502>(bytes);
             Assert.Equal(0x09, jT809_0X9500_0X9502.LensID);
-            Assert.Equal(0x01, jT809_0X9500_0X9502.SizeType);
+            Assert.Equal(0x01, jT809_0X9500_0X9502.SizeType.ToByteValue());
         }
     }
 }
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9503Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9503Test.cs
index ef39fa5..a7525cb 100644
--- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9503Test.cs
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9503Test.cs
@@ -19,20 +19,20 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
             JT809_0x9500_0x9503 jT809_0X9500_0X9503 = new JT809_0x9500_0x9503
             {
                    MsgSequence=333,
-                   MsgPriority=2,
+                   MsgPriority= Enums.JT809_0x9503_MsgPriority.一般,
                    MsgContent="汉_sfdf3dfs"
             };
             var hex = JT809Serializer.Serialize(jT809_0X9500_0X9503).ToHexString();
-            Assert.Equal("0000014D020000000BBABA5F7366646633646673", hex);
+            Assert.Equal("0000014D010000000BBABA5F7366646633646673", hex);
         }
 
         [Fact]
         public void Test2()
         {
-            var bytes = "0000014D020000000BBABA5F7366646633646673".ToHexBytes();
+            var bytes = "0000014D010000000BBABA5F7366646633646673".ToHexBytes();
             JT809_0x9500_0x9503 jT809_0X9500_0X9503 = JT809Serializer.Deserialize<JT809_0x9500_0x9503>(bytes);
             Assert.Equal((uint)333, jT809_0X9500_0X9503.MsgSequence);
-            Assert.Equal(2, jT809_0X9500_0X9503.MsgPriority);
+            Assert.Equal(1, jT809_0X9500_0X9503.MsgPriority.ToByteValue());
             Assert.Equal((uint)11, jT809_0X9500_0X9503.MsgLength);
             Assert.Equal("汉_sfdf3dfs", jT809_0X9500_0X9503.MsgContent);
         }
diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9504Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9504Test.cs
index a9adb85..7f092c2 100644
--- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9504Test.cs
+++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x9500_0x9504Test.cs
@@ -53,15 +53,15 @@ namespace JT809.Protocol.Test.JT809SubMessageBody
                 StartTime = DateTime.Parse("2020-04-26 20:00:20"),
                 EndTime = DateTime.Parse("2020-04-26 23:00:20")
             };
-            var hex = JT809Serializer.Serialize(jT809_0X9500_0X9504).ToHexString();
-            Assert.Equal("102004262000202004262300200000", hex);
+            var hex = JT809_2019_Serializer.Serialize(jT809_0X9500_0X9504).ToHexString();
+            Assert.Equal("000000005EA577D4000000005EA5A20410", hex);
         }
 
         [Fact]
         public void Test_2019_2()
         {
-            var bytes = "102004262000202004262300200000".ToHexBytes();
-            JT809_0x9500_0x9504 jT809_0X9500_0X9504 = JT809Serializer.Deserialize<JT809_0x9500_0x9504>(bytes);
+            var bytes = "000000005EA577D4000000005EA5A20410".ToHexBytes();
+            JT809_0x9500_0x9504 jT809_0X9500_0X9504 = JT809_2019_Serializer.Deserialize<JT809_0x9500_0x9504>(bytes);
             Assert.Equal(JT809CommandType.采集记录仪事故疑点记录, jT809_0X9500_0X9504.Command);
             Assert.Equal(DateTime.Parse("2020-04-26 20:00:20"), jT809_0X9500_0X9504.StartTime);
             Assert.Equal(DateTime.Parse("2020-04-26 23:00:20"), jT809_0X9500_0X9504.EndTime);
diff --git a/src/JT809.Protocol.Test/Simples/Demo1.cs b/src/JT809.Protocol.Test/Simples/Demo1.cs
index fafa88e..f17fbe3 100644
--- a/src/JT809.Protocol.Test/Simples/Demo1.cs
+++ b/src/JT809.Protocol.Test/Simples/Demo1.cs
@@ -44,7 +44,7 @@ namespace JT809.Protocol.Test.Simples
                 WarnTime = DateTime.Parse("2018-09-27 10:24:00"),
                 SupervisionID = "123FFAA1",
                 SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"),
-                SupervisionLevel = 3,
+                SupervisionLevel =  JT809_9401_SupervisionLevel.一般,
                 Supervisor = "smallchi",
                 SupervisorTel = "12345678901",
                 SupervisorEmail = "123456@qq.com"
@@ -53,13 +53,13 @@ namespace JT809.Protocol.Test.Simples
             jT809Package.Bodies = bodies;
             var hex = JT809Serializer.Serialize(jT809Package).ToHexString();
             //"5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D"
-            Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D", hex);
+            Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D000000000000000000000000000000000000007AEA5D", hex);
         }
 
         [Fact]
         public void Test2()
         {
-            var bytes = "5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D".ToHexBytes();
+            var bytes = "5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D000000000000000000000000000000000000007AEA5D".ToHexBytes();
             JT809Package jT809Package = JT809Serializer.Deserialize(bytes);
 
             Assert.Equal((uint)146, jT809Package.Header.MsgLength);
@@ -82,7 +82,7 @@ namespace JT809.Protocol.Test.Simples
             Assert.Equal(DateTime.Parse("2018-09-27 10:24:00"), jT809_0x9400_0x9401.WarnTime);
             Assert.Equal("123FFAA1", jT809_0x9400_0x9401.SupervisionID);
             Assert.Equal(DateTime.Parse("2018-09-27 11:24:00"), jT809_0x9400_0x9401.SupervisionEndTime);
-            Assert.Equal(3, jT809_0x9400_0x9401.SupervisionLevel);
+            Assert.Equal(1, jT809_0x9400_0x9401.SupervisionLevel.ToByteValue());
             Assert.Equal("smallchi", jT809_0x9400_0x9401.Supervisor);
             Assert.Equal("12345678901", jT809_0x9400_0x9401.SupervisorTel);
             Assert.Equal("123456@qq.com", jT809_0x9400_0x9401.SupervisorEmail);
@@ -104,7 +104,7 @@ namespace JT809.Protocol.Test.Simples
                     WarnTime = DateTime.Parse("2018-09-27 10:24:00"),
                     SupervisionID = "123FFAA1",
                     SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"),
-                    SupervisionLevel = 3,
+                    SupervisionLevel =  JT809_9401_SupervisionLevel.一般,
                     Supervisor = "smallchi",
                     SupervisorTel = "12345678901",
                     SupervisorEmail = "123456@qq.com"
@@ -114,8 +114,8 @@ namespace JT809.Protocol.Test.Simples
             jT809Package.Header.EncryptKey = 9999;
             jT809Package.Header.MsgGNSSCENTERID = 20180920;
             var hex = JT809SerializerTest3.Serialize(jT809Package).ToHexString();
-            //"5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D"
-            Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D", hex);
+            //"5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D000000000000000000000000000000000000007AEA5D"
+            Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5001736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D000000000000000000000000000000000000007AEA5D", hex);
         }
     }
 }
diff --git a/src/JT809.Protocol/Enums/JT809_0x920D_Result.cs b/src/JT809.Protocol/Enums/JT809_0x920D_Result.cs
new file mode 100644
index 0000000..9b10089
--- /dev/null
+++ b/src/JT809.Protocol/Enums/JT809_0x920D_Result.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JT809.Protocol.Enums
+{
+    public enum JT809_0x920D_Result:byte
+    {
+        完成记录= 0x00,
+        审核通过_完成记录= 0x01,
+        信息错误_未完成记录= 0x02,
+        审核未通过_未完成记录= 0x03
+    }
+}
diff --git a/src/JT809.Protocol/Enums/JT809_0x9503_MsgPriority.cs b/src/JT809.Protocol/Enums/JT809_0x9503_MsgPriority.cs
new file mode 100644
index 0000000..f301f9c
--- /dev/null
+++ b/src/JT809.Protocol/Enums/JT809_0x9503_MsgPriority.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JT809.Protocol.Enums
+{
+    public enum JT809_0x9503_MsgPriority
+    {
+        紧急=0x00,
+        一般=0x01
+    }
+}
diff --git a/src/JT809.Protocol/Enums/JT809_9401_SupervisionLevel.cs b/src/JT809.Protocol/Enums/JT809_9401_SupervisionLevel.cs
new file mode 100644
index 0000000..1cc3bab
--- /dev/null
+++ b/src/JT809.Protocol/Enums/JT809_9401_SupervisionLevel.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JT809.Protocol.Enums
+{
+    public enum JT809_9401_SupervisionLevel
+    {
+        紧急=0x00,
+        一般=0x01
+    }
+}
diff --git a/src/JT809.Protocol/Enums/JT809__0x9502_ImageType.cs b/src/JT809.Protocol/Enums/JT809__0x9502_ImageType.cs
new file mode 100644
index 0000000..f5884f9
--- /dev/null
+++ b/src/JT809.Protocol/Enums/JT809__0x9502_ImageType.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JT809.Protocol.Enums
+{
+    public enum JT809__0x9502_ImageType
+    {
+        jpg=0x01,
+        gif=0x02,
+        tiff=0x03,
+        png=0x04,
+    }
+}
diff --git a/src/JT809.Protocol/Enums/JT809__0x9502_SizeType.cs b/src/JT809.Protocol/Enums/JT809__0x9502_SizeType.cs
new file mode 100644
index 0000000..d2af4a7
--- /dev/null
+++ b/src/JT809.Protocol/Enums/JT809__0x9502_SizeType.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JT809.Protocol.Enums
+{
+    public enum JT809__0x9502_SizeType
+    {
+        _320x240=0x01,
+        _640x480=0x02,
+        _800x600=0x03,
+        _1024x768=0x04,
+        _176x144_QCIF=0x05,
+        _704x288_CIF=0x06,
+        _704x288_HALFD=0x07,
+        _704x576_DI=0x08
+    }
+}
diff --git a/src/JT809.Protocol/JT809.Protocol.csproj b/src/JT809.Protocol/JT809.Protocol.csproj
index 4a1585d..d25eaa8 100644
--- a/src/JT809.Protocol/JT809.Protocol.csproj
+++ b/src/JT809.Protocol/JT809.Protocol.csproj
@@ -80,6 +80,7 @@
     <Compile Include="Enums\JT809_0x1007_ErrorCode.cs" />
     <Compile Include="Enums\JT809_0x920A_UploadFlag.cs" />
     <Compile Include="Enums\JT809_0x9201_Result.cs" />
+    <Compile Include="Enums\JT809_0x920D_Result.cs" />
     <Compile Include="Enums\JT809_0x9302_ObjectType.cs" />
     <Compile Include="Enums\JT809_0x9301_ObjectType.cs" />
     <Compile Include="Enums\JT809_0x1301_ObjectType.cs" />
@@ -92,8 +93,12 @@
     <Compile Include="Enums\JT809_0x1008_ReasonCode.cs" />
     <Compile Include="Enums\JT809_0x9002_Result.cs" />
     <Compile Include="Enums\JT809_0x9008_ReasonCode.cs" />
+    <Compile Include="Enums\JT809_0x9503_MsgPriority.cs" />
+    <Compile Include="Enums\JT809_9401_SupervisionLevel.cs" />
     <Compile Include="Enums\JT809_LinkType.cs" />
     <Compile Include="Enums\JT809_VehiclePositionEncrypt.cs" />
+    <Compile Include="Enums\JT809__0x9502_ImageType.cs" />
+    <Compile Include="Enums\JT809__0x9502_SizeType.cs" />
   </ItemGroup>
 
   <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
diff --git a/src/JT809.Protocol/JT809Header.cs b/src/JT809.Protocol/JT809Header.cs
index d391121..2afe00d 100644
--- a/src/JT809.Protocol/JT809Header.cs
+++ b/src/JT809.Protocol/JT809Header.cs
@@ -1,12 +1,14 @@
 using JT809.Protocol.Enums;
+using JT809.Protocol.Extensions;
 using JT809.Protocol.Formatters;
 using JT809.Protocol.Interfaces;
 using JT809.Protocol.MessagePack;
 using System;
+using System.Text.Json;
 
 namespace JT809.Protocol
 {
-    public class JT809Header: IJT809MessagePackFormatter<JT809Header>,IJT809_2019_Version
+    public class JT809Header: IJT809MessagePackFormatter<JT809Header>, IJT809_2019_Version
     {
         /// <summary>
         /// 固定为22个字节长度
@@ -60,19 +62,19 @@ namespace JT809.Protocol
 
         public JT809Header Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809Header jT809Header = new JT809Header();
-            jT809Header.MsgLength = reader.ReadUInt32();
-            jT809Header.MsgSN = reader.ReadUInt32();
-            jT809Header.BusinessType = reader.ReadUInt16();
-            jT809Header.MsgGNSSCENTERID = reader.ReadUInt32();
-            jT809Header.Version = new JT809Header_Version(reader.ReadArray(JT809Header_Version.FixedByteLength));
-            jT809Header.EncryptFlag = (JT809Header_Encrypt)reader.ReadByte();
-            jT809Header.EncryptKey = reader.ReadUInt32();
+            JT809Header value = new JT809Header();
+            value.MsgLength = reader.ReadUInt32();
+            value.MsgSN = reader.ReadUInt32();
+            value.BusinessType = reader.ReadUInt16();
+            value.MsgGNSSCENTERID = reader.ReadUInt32();
+            value.Version = new JT809Header_Version(reader.ReadArray(JT809Header_Version.FixedByteLength));
+            value.EncryptFlag = (JT809Header_Encrypt)reader.ReadByte();
+            value.EncryptKey = reader.ReadUInt32();
             if(config.Version== JT809Version.JTT2019)
             {
-                jT809Header.Time = reader.ReadUTCDateTime();
+                value.Time = reader.ReadUTCDateTime();
             }
-            return jT809Header;
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809Header value, IJT809Config config)
diff --git a/src/JT809.Protocol/JT809Package.cs b/src/JT809.Protocol/JT809Package.cs
index 0e0854c..029b8df 100644
--- a/src/JT809.Protocol/JT809Package.cs
+++ b/src/JT809.Protocol/JT809Package.cs
@@ -178,8 +178,92 @@ namespace JT809.Protocol
 
         public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
         {
-#warning Analyze NotImplementedException
-            throw new NotImplementedException();
+            JT809Package jT809Package = new JT809Package();
+            writer.WriteStartObject();
+            // 2.读取起始头
+            jT809Package.BeginFlag = reader.ReadStart();
+            writer.WriteNumber($"[{jT809Package.BeginFlag.ReadNumber()}]起始标识", jT809Package.BeginFlag);
+            // 3.初始化消息头
+            JT809Header jT809Header=new JT809Header();
+            writer.WriteStartObject("消息头");
+            try
+            {
+                jT809Header.MsgLength = reader.ReadUInt32();
+                writer.WriteNumber($"[{jT809Header.MsgLength.ReadNumber()}]数据长度", jT809Header.MsgLength);
+                jT809Header.MsgSN = reader.ReadUInt32();
+                writer.WriteNumber($"[{jT809Header.MsgSN.ReadNumber()}]报文序列号", jT809Header.MsgSN);
+                jT809Header.BusinessType = reader.ReadUInt16();
+                writer.WriteString($"[{jT809Header.BusinessType.ReadNumber()}]业务类型标识", ((JT809BusinessType)jT809Header.BusinessType).ToString());
+                jT809Header.MsgGNSSCENTERID = reader.ReadUInt32();
+                writer.WriteNumber($"[{jT809Header.MsgGNSSCENTERID.ReadNumber()}]下级平台接入码", jT809Header.MsgGNSSCENTERID);
+                var virtualHex = reader.ReadVirtualArray(JT809Header_Version.FixedByteLength);
+                jT809Header.Version = new JT809Header_Version(reader.ReadArray(JT809Header_Version.FixedByteLength));
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]协议版本号标识", jT809Header.Version.ToString());
+                jT809Header.EncryptFlag = (JT809Header_Encrypt)reader.ReadByte();
+                writer.WriteString($"[{ jT809Header.EncryptFlag.ToByteValue()}]报文加密标识位", jT809Header.EncryptFlag.ToString());
+                jT809Header.EncryptKey = reader.ReadUInt32();
+                writer.WriteNumber($"[{jT809Header.EncryptKey.ReadNumber()}]数据加密的密匙", jT809Header.EncryptKey);
+                if (config.Version == JT809Version.JTT2019)
+                {
+                    virtualHex = reader.ReadVirtualArray(8);
+                    jT809Header.Time = reader.ReadUTCDateTime();
+                    writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发送消息时的系统UTC时间", jT809Header.Time);
+                }
+            }
+            catch (Exception ex)
+            {
+                writer.WriteString($"[{(int)JT809ErrorCode.HeaderParseError}]消息头异常", $"offset>{reader.ReadCurrentRemainContentLength()},异常消息:{ex.Message}");
+            }
+            writer.WriteEndObject();
+            writer.WriteStartObject("消息体");
+            // 5.数据体处理
+            //  5.1 判断是否有数据体(总长度-固定长度)> 0
+            int fixedByteLength = config.Version == JT809Version.JTT2019 ? FixedByteLength_2019 : FixedByteLength;
+            if ((jT809Header.MsgLength - fixedByteLength) > 0)
+            {
+                if (config.BusinessTypeFactory.TryGetValue(jT809Header.BusinessType, config.Version, out object instance))
+                {
+                    try
+                    {
+                      
+                        // 5.2 是否加密
+                        switch (jT809Header.EncryptFlag)
+                        {
+                            case JT809Header_Encrypt.None:
+                                // 5.3 处理消息体
+                          
+                                instance.Analyze(ref reader, writer, config);
+                                break;
+                            case JT809Header_Encrypt.Common:
+                                // 5.4. 处理加密消息体
+                                byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Header.EncryptKey);
+                                JT809MessagePackReader bodiesReader = new JT809MessagePackReader(bodiesData);
+                                instance.Analyze(ref bodiesReader, writer, config);
+                                break;
+                        }
+                       
+                    }
+                    catch (Exception ex)
+                    {
+                        writer.WriteString($"[{(int)JT809ErrorCode.BodiesParseError}]消息体异常", $"offset>{reader.ReadCurrentRemainContentLength()},异常消息:{ex.Message}");
+                    }
+                }         
+            }
+            writer.WriteEndObject();
+            jT809Package.CRCCode = reader.ReadUInt16();
+            writer.WriteNumber($"[{jT809Package.CRCCode.ReadNumber()}]校验码", jT809Package.CRCCode);
+            // 1. 验证校验码
+            if (!config.SkipCRCCode)
+            {
+                //  1.2. 验证校验码
+                if (!reader.CheckXorCodeVali)
+                {
+                    writer.WriteString($"[{(int)JT809ErrorCode.CRC16CheckInvalid}]校验码异常", $"{reader.CalculateCheckXorCode}!={reader.RealCheckXorCode}");
+                }
+            }
+            jT809Package.EndFlag = reader.ReadEnd();
+            writer.WriteNumber($"[{jT809Package.EndFlag.ReadNumber()}]结束标识", jT809Package.EndFlag);
+            writer.WriteEndObject();
         }
     }
 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1200.cs b/src/JT809.Protocol/MessageBody/JT809_0x1200.cs
index 16a4904..9a10597 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x1200.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x1200.cs
@@ -42,7 +42,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1300.cs b/src/JT809.Protocol/MessageBody/JT809_0x1300.cs
index e82185e..acc80fc 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x1300.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x1300.cs
@@ -37,7 +37,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1400.cs b/src/JT809.Protocol/MessageBody/JT809_0x1400.cs
index db66255..1c540e4 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x1400.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x1400.cs
@@ -45,7 +45,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1500.cs b/src/JT809.Protocol/MessageBody/JT809_0x1500.cs
index 5a5ddb1..c9f7753 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x1500.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x1500.cs
@@ -41,7 +41,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1600.cs b/src/JT809.Protocol/MessageBody/JT809_0x1600.cs
index 8429500..60db210 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x1600.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x1600.cs
@@ -41,7 +41,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9007.cs b/src/JT809.Protocol/MessageBody/JT809_0x9007.cs
index 695bfb9..b4c15e4 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9007.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9007.cs
@@ -32,7 +32,7 @@ namespace JT809.Protocol.MessageBody
         {
             JT809_0x9007 value = new JT809_0x9007();
             value.ErrorCode = (JT809_0x1007_ErrorCode)reader.ReadByte();
-            writer.WriteString($"[{value.ErrorCode.ToByteValue()}错误代码]", value.ErrorCode.ToString());
+            writer.WriteString($"[{value.ErrorCode.ToByteValue()}]错误代码", value.ErrorCode.ToString());
         }
 
         public JT809_0x9007 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9008.cs b/src/JT809.Protocol/MessageBody/JT809_0x9008.cs
index 9cb3deb..5a6db9c 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9008.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9008.cs
@@ -26,7 +26,7 @@ namespace JT809.Protocol.MessageBody
         {
             JT809_0x9008 value = new JT809_0x9008();
             value.ReasonCode = (JT809_0x9008_ReasonCode)reader.ReadByte();
-            writer.WriteString($"[{value.ReasonCode.ToByteValue()}链路关闭原因]", value.ReasonCode.ToString());
+            writer.WriteString($"[{value.ReasonCode.ToByteValue()}]链路关闭原因", value.ReasonCode.ToString());
         }
 
         public JT809_0x9008 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9103.cs b/src/JT809.Protocol/MessageBody/JT809_0x9103.cs
index b3c35f5..69ecdd2 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9103.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9103.cs
@@ -37,10 +37,10 @@ namespace JT809.Protocol.MessageBody
             writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength);
             value.Count = reader.ReadByte();
             writer.WriteNumber($"[{value.Count.ReadNumber()}]总数", value.Count);
-            writer.WriteStartArray();
+            writer.WriteStartArray("子业务数据");
             for (int i = 0; i < value.Count; i++)
             {
-                writer.WriteStartObject("子业务数据类型");
+                writer.WriteStartObject();
                 JT809ManageMsgSNInform item = new JT809ManageMsgSNInform();
                 item.SubBusinessType = reader.ReadUInt16();
                 writer.WriteString($"[{item.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)item.SubBusinessType).ToString());
@@ -49,6 +49,7 @@ namespace JT809.Protocol.MessageBody
                 var virtualHex = reader.ReadVirtualArray(8);
                 item.Time = reader.ReadUTCDateTime();
                 writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]系统UTC时间", item.Time);
+                writer.WriteEndObject();
             }
             writer.WriteEndArray();
         }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9200.cs b/src/JT809.Protocol/MessageBody/JT809_0x9200.cs
index 99e8f11..1e3ba4f 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9200.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9200.cs
@@ -41,7 +41,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9300.cs b/src/JT809.Protocol/MessageBody/JT809_0x9300.cs
index 3ec77cc..4378522 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9300.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9300.cs
@@ -42,7 +42,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9400.cs b/src/JT809.Protocol/MessageBody/JT809_0x9400.cs
index c882962..444cfa2 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9400.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9400.cs
@@ -45,7 +45,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9500.cs b/src/JT809.Protocol/MessageBody/JT809_0x9500.cs
index bedd69d..4466c11 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9500.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9500.cs
@@ -41,7 +41,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9600.cs b/src/JT809.Protocol/MessageBody/JT809_0x9600.cs
index a055c3d..70040e6 100644
--- a/src/JT809.Protocol/MessageBody/JT809_0x9600.cs
+++ b/src/JT809.Protocol/MessageBody/JT809_0x9600.cs
@@ -42,7 +42,9 @@ namespace JT809.Protocol.MessageBody
                     {
                         if (!subBodies.SkipSerialization)
                         {
+                            writer.WriteStartObject("子业务类型");
                             instance.Analyze(ref reader, writer, config);
+                            writer.WriteEndObject();
                         }
                     }
                 }
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs
index afb3e01..9f8f04a 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs
@@ -70,27 +70,26 @@ namespace JT809.Protocol.SubMessageBody
             {
                 value.GNSSData = new JT809VehiclePositionProperties_2019();
                 value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
-                writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString());
+                writer.WriteString($"[{value.GNSSData.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.GNSSData.Encrypt.ToString());
                 value.GNSSData.DataLength = reader.ReadUInt32();
                 writer.WriteNumber($"[{value.GNSSData.DataLength.ReadNumber()}]车辆定位信息数据长度", value.GNSSData.DataLength);
                 value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray();
-#warning 此处需要提供接口注入
                 writer.WriteString($"[{value.GNSSData.GnssData.ToHexString()}]车辆定位信息内容",value.GNSSData.GnssData.ToHexString());
                 var virtualHex = reader.ReadVirtualArray(11);
                 value.GNSSData.PlatformId1 = reader.ReadString(11);
                 writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监控平台唯一编码", value.GNSSData.PlatformId1);
                 value.GNSSData.Alarm1 = reader.ReadUInt32();
-                writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1);
+                writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态1", value.GNSSData.Alarm1);
                 virtualHex = reader.ReadVirtualArray(11);
                 value.GNSSData.PlatformId2 = reader.ReadString(11);
                 writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]市级监控平台唯一编码", value.GNSSData.PlatformId2);
                 value.GNSSData.Alarm2 = reader.ReadUInt32();
-                writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1);
+                writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态2", value.GNSSData.Alarm2);
                 virtualHex = reader.ReadVirtualArray(11);
                 value.GNSSData.PlatformId3 = reader.ReadString(11);
                 writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]省级监控平台唯一编码", value.GNSSData.PlatformId3);
                 value.GNSSData.Alarm3 = reader.ReadUInt32();
-                writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1);
+                writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态3", value.GNSSData.Alarm3);
             }
             writer.WriteEndObject();
         }
@@ -123,7 +122,6 @@ namespace JT809.Protocol.SubMessageBody
                value.GNSSData = new JT809VehiclePositionProperties_2019();
                value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
                value.GNSSData.DataLength = reader.ReadUInt32();
-#warning 引用808的0x0200协议
                 value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray();
                value.GNSSData.PlatformId1 = reader.ReadString(11);
                value.GNSSData.Alarm1 = reader.ReadUInt32();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs
index 9d84947..dcd9047 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1300_0x1302.cs
@@ -35,7 +35,6 @@ namespace JT809.Protocol.SubMessageBody
             JT809_0x1300_0x1302 value = new JT809_0x1300_0x1302();
             if (config.Version == JT809Version.JTT2019)
             {
-                var virtualHex = reader.ReadVirtualArray(16);
                 value.SourceDataType = reader.ReadUInt16();
                 writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
                 value.SourceMsgSn = reader.ReadUInt32();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs
index e3eb8a8..33b494c 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs
@@ -45,11 +45,11 @@ namespace JT809.Protocol.SubMessageBody
         /// <summary>
         /// 图片大小
         /// </summary>
-        public byte SizeType { get; set; }
+        public JT809__0x9502_SizeType SizeType { get; set; }
         /// <summary>
         /// 图像格式
         /// </summary>
-        public byte Type { get; set; }
+        public JT809__0x9502_ImageType Type { get; set; }
         /// <summary>
         /// 图片内容
         /// </summary>
@@ -98,10 +98,10 @@ namespace JT809.Protocol.SubMessageBody
             writer.WriteNumber($"[{value.LensID}]镜头ID", value.LensID);
             value.PhotoLen = reader.ReadUInt32();
             writer.WriteNumber($"[{value.PhotoLen}]图片长度", value.PhotoLen);
-            value.SizeType = reader.ReadByte();
-            writer.WriteNumber($"[{value.SizeType}]图片大小", value.SizeType);
-            value.Type = reader.ReadByte();
-            writer.WriteNumber($"[{value.Type}]图像格式", value.Type);
+            value.SizeType = (JT809__0x9502_SizeType)reader.ReadByte();
+            writer.WriteString($"[{value.SizeType.ToByteValue()}]图片大小", value.SizeType.ToString());
+            value.Type = (JT809__0x9502_ImageType)reader.ReadByte();
+            writer.WriteString($"[{value.Type.ToByteValue()}]图像格式", value.Type.ToString());
             if (value.PhotoLen > 0)
             {
                 var virtualHex = reader.ReadVirtualArray((int)value.PhotoLen);
@@ -131,8 +131,8 @@ namespace JT809.Protocol.SubMessageBody
             value.VehiclePosition.Alarm = reader.ReadUInt32();
             value.LensID = reader.ReadByte();
             value.PhotoLen = reader.ReadUInt32();
-            value.SizeType = reader.ReadByte();
-            value.Type = reader.ReadByte();
+            value.SizeType = (JT809__0x9502_SizeType)reader.ReadByte();
+            value.Type = (JT809__0x9502_ImageType)reader.ReadByte();
             if (value.PhotoLen > 0)
             {
                 value.Photo = reader.ReadArray((int)value.PhotoLen).ToArray();
@@ -162,8 +162,8 @@ namespace JT809.Protocol.SubMessageBody
             writer.WriteByte(value.LensID);
             bool isPhoto = (value.Photo != null && value.Photo.Length > 0);
             writer.WriteUInt32(isPhoto ? (uint)value.Photo.Length : 0);
-            writer.WriteByte(value.SizeType);
-            writer.WriteByte(value.Type);
+            writer.WriteByte(value.SizeType.ToByteValue());
+            writer.WriteByte(value.Type.ToByteValue());
             if (isPhoto)
             {
                 writer.WriteArray(value.Photo);
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1503.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1503.cs
index 5caaa4d..019ae22 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1503.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1503.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,11 +12,11 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:UP_CTRL_MSG_TEXT_INFO_ACK</para>
     /// <para>描述:下级平台应答上级平台下发的报文是否成功到达指定车辆</para>
     /// </summary>
-    public class JT809_0x1500_0x1503:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1503>, IJT809_2019_Version
+    public class JT809_0x1500_0x1503:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1503>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.下发车辆报文应答消息.ToUInt16Value();
 
-        public override string Description => "下发车辆报文应答消息";
+        public override string Description => "下发车辆报文应答消息"; 
         /// <summary>
         /// 对应下发车辆报文请求消息源子业务类型标识
         /// </summary>
@@ -33,6 +34,26 @@ namespace JT809.Protocol.SubMessageBody
         /// 应答结果
         /// </summary>
         public JT809_0x1503_Result Result { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x1500_0x1503 value = new JT809_0x1500_0x1503();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.SourceDataType = reader.ReadUInt16();
+                writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
+                value.SourceMsgSn = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
+            }
+            else
+            {
+                value.MsgID = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.MsgID.ReadNumber()}]消息ID", value.MsgID);
+            }
+            value.Result = (JT809_0x1503_Result)reader.ReadByte();
+            writer.WriteString($"[{value.Result.ToByteValue()}]应答结果", value.Result.ToString());
+        }
+
         public JT809_0x1500_0x1503 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             JT809_0x1500_0x1503 value = new JT809_0x1500_0x1503();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1504.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1504.cs
index 872b5cd..5dd74bc 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1504.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1504.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:UP_CTRL_MSG_TAKE_TRAVEL_ACK</para>
     /// <para>描述:下级平台应答上级平台下发的"上报车辆行驶记录请求"消息,将车辆行驶记录数据上传至上级平台</para>
     /// </summary>
-    public class JT809_0x1500_0x1504:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1504>, IJT809_2019_Version
+    public class JT809_0x1500_0x1504:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1504>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.上报车辆行驶记录应答消息.ToUInt16Value();
 
@@ -36,6 +37,26 @@ namespace JT809.Protocol.SubMessageBody
         /// 车辆行驶记录信息
         /// </summary>
         public string TraveldataInfo { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x1500_0x1504 value = new JT809_0x1500_0x1504();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.SourceDataType = reader.ReadUInt16();
+                writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
+                value.SourceMsgSn = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
+            }
+            value.CommandType = (JT809CommandType)reader.ReadByte();
+            writer.WriteString($"[{value.CommandType.ToByteValue()}]命令字", value.CommandType.ToString()) ;
+            value.TraveldataLength = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.TraveldataLength.ReadNumber()}]车辆行驶记录数据体长度", value.TraveldataLength);
+            var virtualHex = reader.ReadVirtualArray((int)value.TraveldataLength);
+            value.TraveldataInfo = reader.ReadString((int)value.TraveldataLength);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车辆行驶记录信息", value.TraveldataInfo);
+        }
+
         public JT809_0x1500_0x1504 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             JT809_0x1500_0x1504 value = new JT809_0x1500_0x1504();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1505.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1505.cs
index c92300b..c56decf 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1505.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1505.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识: UP_CTRL_MSG_EMERGENCY_MONITORING_ACK</para>
     /// <para>描述:下级平台应答上级平台下发的"车辆应急接入监管平台请求"消息应答</para>
     /// </summary>
-    public class JT809_0x1500_0x1505:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1505>, IJT809_2019_Version
+    public class JT809_0x1500_0x1505:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1505>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆应急接入监管平台应答消息.ToUInt16Value();
 
@@ -28,6 +29,21 @@ namespace JT809.Protocol.SubMessageBody
         /// 应答结果
         /// </summary>
         public JT809_0x1505_Result Result { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x1500_0x1505 value = new JT809_0x1500_0x1505();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.SourceDataType = reader.ReadUInt16();
+                writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
+                value.SourceMsgSn = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
+            }
+            value.Result = (JT809_0x1505_Result)reader.ReadByte();
+            writer.WriteString($"[{value.Result.ToByteValue()}]应答结果", value.Result.ToString());
+        }
+
         public JT809_0x1500_0x1505 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             JT809_0x1500_0x1505 value = new JT809_0x1500_0x1505();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1601.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1601.cs
index efb55b5..1fe6e98 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1601.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1601.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:UP_BASE_MSG_VEHICLE_ADDED_ACK</para>
     /// <para>描述:上级平台应答下级平台发送的"补报车辆静态信息清求"消息</para>
     /// </summary>
-    public class JT809_0x1600_0x1601:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1600_0x1601>, IJT809_2019_Version
+    public class JT809_0x1600_0x1601:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1600_0x1601>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.补报车辆静态信息应答.ToUInt16Value();
 
@@ -28,6 +29,22 @@ namespace JT809.Protocol.SubMessageBody
         /// 车辆信息
         /// </summary>
         public string CarInfo { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x1600_0x1601 value = new JT809_0x1600_0x1601();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.SourceDataType = reader.ReadUInt16();
+                writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
+                value.SourceMsgSn = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
+            }
+            var virtualHex = reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength());
+            value.CarInfo = reader.ReadRemainStringContent();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车辆信息", value.CarInfo);
+        }
+
         public JT809_0x1600_0x1601 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             JT809_0x1600_0x1601 value = new JT809_0x1600_0x1601();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1602.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1602.cs
index f4852be..c9e5ff1 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1602.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1600_0x1602.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:UP_BASE_MSG_VEHICLE_ADDED_ACK</para>
     /// <para>描述:下级平台向上级平台补报车辆行驶路线信息</para>
     /// </summary>
-    public class JT809_0x1600_0x1602:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1600_0x1602>, IJT809_2019_Version
+    public class JT809_0x1600_0x1602:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1600_0x1602>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.补报车辆行驶路线信息应答消息.ToUInt16Value();
 
@@ -20,6 +21,14 @@ namespace JT809.Protocol.SubMessageBody
         /// 路线信息,808-2019中0x8606规定的报文格式
         /// </summary>
         public byte[] DRVLine { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x1600_0x1602();
+            value.DRVLine = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
+            writer.WriteString($"[{value.DRVLine.ToHexString()}]路线信息", value.DRVLine.ToHexString());
+        }
+
         public JT809_0x1600_0x1602 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x1600_0x1602();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9201.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9201.cs
index 647e952..c4b17d0 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9201.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9201.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     ///  <para>子业务类型标识:DOWN_EXG_MSG_REGISTER_ACK</para>
     ///  <para>描述:上级平台在收到下级平台上报的车辆注册信息后,向下级平台发送车辆注册应答消息</para>
     /// </summary>
-    public class JT809_0x9200_0x9201:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9201>,IJT809_2019_Version
+    public class JT809_0x9200_0x9201:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9201>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value();
 
@@ -25,6 +26,15 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public JT809_0x9201_Result Result { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9200_0x9201();
+            value.MsgSn = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.MsgSn.ReadNumber()}]车辆注册信息消息源报文序号", value.MsgSn);
+            value.Result = (JT809_0x9201_Result)reader.ReadByte();
+            writer.WriteString($"[{value.Result.ToByteValue()}]处理结果", value.Result.ToString());
+        }
+
         public JT809_0x9200_0x9201 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9200_0x9201();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs
index ac4f7c1..682667b 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs
@@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack;
 using JT809.Protocol.Metadata;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -19,7 +20,7 @@ namespace JT809.Protocol.SubMessageBody
     /// 4.应急状态监控车辆时,上级平台向车辆归属下级平台通过该消息不间断地发送车辆定位信息,实现车辆定位信息回传
     /// </para>
     /// </summary>
-    public class JT809_0x9200_0x9202:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9202>, IJT809_2019_Version
+    public class JT809_0x9200_0x9202:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9202>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.交换车辆定位信息消息.ToUInt16Value();
 
@@ -31,43 +32,113 @@ namespace JT809.Protocol.SubMessageBody
 
         public JT809VehiclePositionProperties_2019 GNSSData { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9200_0x9202 value = new JT809_0x9200_0x9202();
+            if (config.Version == JT809Version.JTT2011)
+            {
+                value.VehiclePosition = new JT809VehiclePositionProperties();
+                writer.WriteStartObject("车辆定位信息");
+                value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
+                writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString());
+                value.VehiclePosition.Day = reader.ReadByte();
+                writer.WriteNumber($"[{value.VehiclePosition.Day.ReadNumber()}]日", value.VehiclePosition.Day);
+                value.VehiclePosition.Month = reader.ReadByte();
+                writer.WriteNumber($"[{value.VehiclePosition.Month.ReadNumber()}]月", value.VehiclePosition.Month);
+                value.VehiclePosition.Year = reader.ReadUInt16();
+                writer.WriteNumber($"[{value.VehiclePosition.Year.ReadNumber()}]年", value.VehiclePosition.Year);
+                value.VehiclePosition.Hour = reader.ReadByte();
+                writer.WriteNumber($"[{value.VehiclePosition.Hour.ReadNumber()}]时", value.VehiclePosition.Hour);
+                value.VehiclePosition.Minute = reader.ReadByte();
+                writer.WriteNumber($"[{value.VehiclePosition.Minute.ReadNumber()}]分", value.VehiclePosition.Minute);
+                value.VehiclePosition.Second = reader.ReadByte();
+                writer.WriteNumber($"[{value.VehiclePosition.Second.ReadNumber()}]秒", value.VehiclePosition.Second);
+                value.VehiclePosition.Lon = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.VehiclePosition.Lon.ReadNumber()}]经度", value.VehiclePosition.Lon);
+                value.VehiclePosition.Lat = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.VehiclePosition.Lat.ReadNumber()}]纬度", value.VehiclePosition.Lat);
+                value.VehiclePosition.Vec1 = reader.ReadUInt16();
+                writer.WriteNumber($"[{value.VehiclePosition.Vec1.ReadNumber()}]速度", value.VehiclePosition.Vec1);
+                value.VehiclePosition.Vec2 = reader.ReadUInt16();
+                writer.WriteNumber($"[{value.VehiclePosition.Vec2.ReadNumber()}]行驶记录速度", value.VehiclePosition.Vec2);
+                value.VehiclePosition.Vec3 = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.VehiclePosition.Vec3.ReadNumber()}]车辆当前总里程数", value.VehiclePosition.Vec3);
+                value.VehiclePosition.Direction = reader.ReadUInt16();
+                writer.WriteNumber($"[{value.VehiclePosition.Direction.ReadNumber()}]方向", value.VehiclePosition.Direction);
+                value.VehiclePosition.Altitude = reader.ReadUInt16();
+                writer.WriteNumber($"[{value.VehiclePosition.Altitude.ReadNumber()}]海拔高度", value.VehiclePosition.Altitude);
+                value.VehiclePosition.State = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.VehiclePosition.State.ReadNumber()}]车辆状态", value.VehiclePosition.State);
+                value.VehiclePosition.Alarm = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.VehiclePosition.Alarm.ReadNumber()}]报警状态", value.VehiclePosition.Alarm);
+                writer.WriteEndObject();
+            }
+            else
+            {
+                value.GNSSData = new JT809VehiclePositionProperties_2019();
+                writer.WriteStartObject("车辆定位信息");
+                value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
+                writer.WriteString($"[{value.GNSSData.Encrypt.ToByteValue()}]是否使用国测局批准的地图保密插件进行加密", value.GNSSData.Encrypt.ToString());
+                value.GNSSData.DataLength = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.GNSSData.DataLength.ReadNumber()}]车辆定位信息数据长度", value.GNSSData.DataLength);
+                value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray();
+                writer.WriteString($"[{value.GNSSData.GnssData.ToHexString()}]车辆定位信息内容",value.GNSSData.GnssData.ToHexString());
+                var virtualHex = reader.ReadVirtualArray(11);
+                value.GNSSData.PlatformId1 = reader.ReadBigNumber(11);
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监控平台唯一编码", value.GNSSData.PlatformId1);
+                value.GNSSData.Alarm1 = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1);
+                virtualHex = reader.ReadVirtualArray(11);
+                value.GNSSData.PlatformId2 = reader.ReadBigNumber(11);
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]市级监控平台唯一编码", value.GNSSData.PlatformId2);
+                value.GNSSData.Alarm2 = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.GNSSData.Alarm2.ReadNumber()}]报警状态", value.GNSSData.Alarm2);
+                virtualHex = reader.ReadVirtualArray(11);
+                value.GNSSData.PlatformId3 = reader.ReadBigNumber(11);
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]省级监控平台唯一编码", value.GNSSData.PlatformId3);
+                value.GNSSData.Alarm3 = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.GNSSData.Alarm3.ReadNumber()}]报警状态", value.GNSSData.Alarm3);
+                writer.WriteEndObject();
+            }
+        }
+
         public JT809_0x9200_0x9202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9200_0x9202 jT809_0X1200_0x9202 = new JT809_0x9200_0x9202();
+            JT809_0x9200_0x9202 value = new JT809_0x9200_0x9202();
             if (config.Version == JT809Version.JTT2011)
             {
-                jT809_0X1200_0x9202.VehiclePosition = new JT809VehiclePositionProperties();
-                jT809_0X1200_0x9202.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
-                jT809_0X1200_0x9202.VehiclePosition.Day = reader.ReadByte();
-                jT809_0X1200_0x9202.VehiclePosition.Month = reader.ReadByte();
-                jT809_0X1200_0x9202.VehiclePosition.Year = reader.ReadUInt16();
-                jT809_0X1200_0x9202.VehiclePosition.Hour = reader.ReadByte();
-                jT809_0X1200_0x9202.VehiclePosition.Minute = reader.ReadByte();
-                jT809_0X1200_0x9202.VehiclePosition.Second = reader.ReadByte();
-                jT809_0X1200_0x9202.VehiclePosition.Lon = reader.ReadUInt32();
-                jT809_0X1200_0x9202.VehiclePosition.Lat = reader.ReadUInt32();
-                jT809_0X1200_0x9202.VehiclePosition.Vec1 = reader.ReadUInt16();
-                jT809_0X1200_0x9202.VehiclePosition.Vec2 = reader.ReadUInt16();
-                jT809_0X1200_0x9202.VehiclePosition.Vec3 = reader.ReadUInt32();
-                jT809_0X1200_0x9202.VehiclePosition.Direction = reader.ReadUInt16();
-                jT809_0X1200_0x9202.VehiclePosition.Altitude = reader.ReadUInt16();
-                jT809_0X1200_0x9202.VehiclePosition.State = reader.ReadUInt32();
-                jT809_0X1200_0x9202.VehiclePosition.Alarm = reader.ReadUInt32();
+                value.VehiclePosition = new JT809VehiclePositionProperties();
+                value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
+                value.VehiclePosition.Day = reader.ReadByte();
+                value.VehiclePosition.Month = reader.ReadByte();
+                value.VehiclePosition.Year = reader.ReadUInt16();
+                value.VehiclePosition.Hour = reader.ReadByte();
+                value.VehiclePosition.Minute = reader.ReadByte();
+                value.VehiclePosition.Second = reader.ReadByte();
+                value.VehiclePosition.Lon = reader.ReadUInt32();
+                value.VehiclePosition.Lat = reader.ReadUInt32();
+                value.VehiclePosition.Vec1 = reader.ReadUInt16();
+                value.VehiclePosition.Vec2 = reader.ReadUInt16();
+                value.VehiclePosition.Vec3 = reader.ReadUInt32();
+                value.VehiclePosition.Direction = reader.ReadUInt16();
+                value.VehiclePosition.Altitude = reader.ReadUInt16();
+                value.VehiclePosition.State = reader.ReadUInt32();
+                value.VehiclePosition.Alarm = reader.ReadUInt32();
             }
             else
             {
-                jT809_0X1200_0x9202.GNSSData = new JT809VehiclePositionProperties_2019();
-                jT809_0X1200_0x9202.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
-                jT809_0X1200_0x9202.GNSSData.DataLength = reader.ReadUInt32();
-                jT809_0X1200_0x9202.GNSSData.GnssData = reader.ReadArray((int)jT809_0X1200_0x9202.GNSSData.DataLength).ToArray();
-                jT809_0X1200_0x9202.GNSSData.PlatformId1 = reader.ReadBigNumber(11);
-                jT809_0X1200_0x9202.GNSSData.Alarm1 = reader.ReadUInt32();
-                jT809_0X1200_0x9202.GNSSData.PlatformId2 = reader.ReadBigNumber(11);
-                jT809_0X1200_0x9202.GNSSData.Alarm2 = reader.ReadUInt32();
-                jT809_0X1200_0x9202.GNSSData.PlatformId3 = reader.ReadBigNumber(11);
-                jT809_0X1200_0x9202.GNSSData.Alarm3 = reader.ReadUInt32();
+                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 jT809_0X1200_0x9202;
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9202 value, IJT809Config config)
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs
index 510ea2c..a3448f6 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs
@@ -4,6 +4,8 @@ using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using System;
 using System.Collections.Generic;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -12,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody
     ///  <para>子业务类型标识:DOWN_EXG_MSG_HISTORY_ARCOSSAREA</para>
     ///  <para>描述:本业务在 DOWN_EXG_MSG_APPLY_HISGNSSDATA_ACK 应答成功后,立即开始交换。如果申请失败,则不进行数据转发</para>
     /// </summary>
-    public class JT809_0x9200_0x9203:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9203>
+    public class JT809_0x9200_0x9203:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9203>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆定位信息交换补发消息.ToUInt16Value();
 
@@ -26,27 +28,53 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public List<JT809_0x9200_0x9202> GNSS { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9200_0x9203 value = new JT809_0x9200_0x9203();
+            value.GNSSCount = reader.ReadByte();
+            writer.WriteNumber($"[{value.GNSSCount.ReadNumber()}]卫星定位数据个数", value.GNSSCount);
+            value.GNSS = new List<JT809_0x9200_0x9202>();
+            if (value.GNSSCount > 0)
+            {
+                writer.WriteStartArray("卫星定位数据集合");
+                for (int i = 0; i < value.GNSSCount; i++)
+                {
+                    try
+                    {
+                        writer.WriteStartObject();
+                        JT809MessagePackReader jT809_0x9200_0x9202Reader = new JT809MessagePackReader(reader.ReadArray(36));
+                        config.GetMessagePackFormatter<JT809_0x9200_0x9202>().Analyze(ref jT809_0x9200_0x9202Reader, writer, config);
+                        writer.WriteEndObject();
+                    }
+                    catch (Exception)
+                    {
+                    }
+                }
+                writer.WriteEndArray();
+            }
+        }
+
         public JT809_0x9200_0x9203 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9200_0x9203 jT809_0X1200_0x9203 = new JT809_0x9200_0x9203();
-            jT809_0X1200_0x9203.GNSSCount = reader.ReadByte();
-            jT809_0X1200_0x9203.GNSS = new List<JT809_0x9200_0x9202>();
-            if (jT809_0X1200_0x9203.GNSSCount > 0)
+            JT809_0x9200_0x9203 value = new JT809_0x9200_0x9203();
+            value.GNSSCount = reader.ReadByte();
+            value.GNSS = new List<JT809_0x9200_0x9202>();
+            if (value.GNSSCount > 0)
             {
-                for (int i = 0; i < jT809_0X1200_0x9203.GNSSCount; i++)
+                for (int i = 0; i < value.GNSSCount; i++)
                 {
                     try
                     {
                         JT809MessagePackReader jT809_0x9200_0x9202Reader = new JT809MessagePackReader(reader.ReadArray(36));
                         JT809_0x9200_0x9202 jT809_0x1200_0x1202 = config.GetMessagePackFormatter<JT809_0x9200_0x9202>().Deserialize(ref jT809_0x9200_0x9202Reader, config);
-                        jT809_0X1200_0x9203.GNSS.Add(jT809_0x1200_0x1202);
+                        value.GNSS.Add(jT809_0x1200_0x1202);
                     }
                     catch (Exception)
                     {
                     }
                 }
             }
-            return jT809_0X1200_0x9203;
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9203 value, IJT809Config config)
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9204.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9204.cs
index a81f2af..8fe8e08 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9204.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9204.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     ///  <para>子业务类型标识:DOWN_EXG_MSG_CAR_INFO</para>
     ///  <para>描述:在首次启动跨域车辆定位信息交换,或者以后交换过程中车辆静态信息有更新时,由上级平台向下级平台下发一次车辆静态信息。下.级平台接收后自行更新该车辆静态信息</para>
     /// </summary>
-    public class JT809_0x9200_0x9204:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9204>
+    public class JT809_0x9200_0x9204:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9204>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.交换车辆静态信息消息.ToUInt16Value();
 
@@ -20,11 +22,19 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public string CarInfo { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9200_0x9204 value = new JT809_0x9200_0x9204();
+            var virtualHex = reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength());
+            value.CarInfo = reader.ReadRemainStringContent();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车辆信息", value.CarInfo);
+        }
+
         public JT809_0x9200_0x9204 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9200_0x9204 jT809_0X1200_0x9204 = new JT809_0x9200_0x9204();
-            jT809_0X1200_0x9204.CarInfo = reader.ReadRemainStringContent();
-            return jT809_0X1200_0x9204;
+            JT809_0x9200_0x9204 value = new JT809_0x9200_0x9204();
+            value.CarInfo = reader.ReadRemainStringContent();
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9204 value, IJT809Config config)
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9205.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9205.cs
index d86dd69..3495df1 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9205.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9205.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,20 +12,28 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_EXG_MSG_RETURN_STARTUP</para>
     /// <para>描述:在有车辆进入非归属地区地理区域、人工指定车辆定位信息交换和应急状态监控车辆时,上级平台向下级平台发出启动车辆定位信息交换清求消息。下级平台收到此命令后需要回复启动车辆定位信息交换应答消息给上级平台,即UP_EXG_MSG-RETURN-STARTUP_ ACK</para>
     /// </summary>
-    public class JT809_0x9200_0x9205:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9205>
+    public class JT809_0x9200_0x9205:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9205>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.启动车辆定位信息交换请求消息.ToUInt16Value();
 
         public override string Description => "启动车辆定位信息交换请求消息";
         /// <summary>
-        /// 错误代码
+        /// 启动车辆定位信息交换请求原因
         /// </summary>
         public JT809_0x9205_ReasonCode ReasonCode { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9200_0x9205 value = new JT809_0x9200_0x9205();
+            value.ReasonCode = (JT809_0x9205_ReasonCode)reader.ReadByte();
+            writer.WriteString($"[{value.ReasonCode.ToByteValue()}]启动车辆定位信息交换请求原因", value.ReasonCode.ToString());
+        }
+
         public JT809_0x9200_0x9205 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9200_0x9205 jT809_0X1200_0x9205 = new JT809_0x9200_0x9205();
-            jT809_0X1200_0x9205.ReasonCode = (JT809_0x9205_ReasonCode)reader.ReadByte();
-            return jT809_0X1200_0x9205;
+            JT809_0x9200_0x9205 value = new JT809_0x9200_0x9205();
+            value.ReasonCode = (JT809_0x9205_ReasonCode)reader.ReadByte();
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9205 value, IJT809Config config)
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9206.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9206.cs
index eafd86c..749caff 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9206.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9206.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,21 +12,28 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_EXG_MSG_RETURN_END</para>
     /// <para>描述:在进入非归属地区地理区域的车辆离开该地理区域、人上取消指定车辆定位信息交换和应急状态结束时,上级平台向下级平台发出结束车辆定位信息交换请求消息。下级平台收到该命令后应回复结束车辆定位信息交换应答消息,即 UP_EXG_MSG_RE_TURN_END_ACK</para>
     /// </summary>
-    public class JT809_0x9200_0x9206:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9206>
+    public class JT809_0x9200_0x9206:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9206>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.结束车辆定位信息交换请求.ToUInt16Value();
 
         public override string Description => "结束车辆定位信息交换请求";
         /// <summary>
-        /// 错误代码
+        /// 结束车辆定位信息交换请求原因
         /// </summary>
         public JT809_0x9206_ReasonCode ReasonCode { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9200_0x9206 value = new JT809_0x9200_0x9206();
+            value.ReasonCode = (JT809_0x9206_ReasonCode)reader.ReadByte();
+            writer.WriteString($"[{value.ReasonCode.ToByteValue()}]结束车辆定位信息交换请求原因", value.ReasonCode.ToString());
+        }
+
         public JT809_0x9200_0x9206 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9200_0x9206 jT809_0X1200_0x9206 = new JT809_0x9200_0x9206();
-            jT809_0X1200_0x9206.ReasonCode = (JT809_0x9206_ReasonCode)reader.ReadByte();
-            return jT809_0X1200_0x9206;
+            JT809_0x9200_0x9206 value = new JT809_0x9200_0x9206();
+            value.ReasonCode = (JT809_0x9206_ReasonCode)reader.ReadByte();
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9206 value, IJT809Config config)
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9207.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9207.cs
index cdd5379..5fa9174 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9207.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9207.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_EXG_MSG_APPLY_FOR_MONITOR_STARTUP_ACK</para>
     /// <para>描述:应答下级平台申请交换指定车辆定位信息,请求消息."即 UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP</para>
     /// </summary>
-    public class JT809_0x9200_0x9207:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9207>, IJT809_2019_Version
+    public class JT809_0x9200_0x9207:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9207>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.申请交换指定车辆定位信息应答.ToUInt16Value();
 
@@ -28,6 +29,21 @@ namespace JT809.Protocol.SubMessageBody
         /// 返回结果
         /// </summary>
         public JT809_0x9207_Result Result { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9200_0x9207();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.SourceDataType = reader.ReadUInt16();
+                writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
+                value.SourceMsgSn = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
+            }
+            value.Result = (JT809_0x9207_Result)reader.ReadByte();
+            writer.WriteString($"[{value.Result.ToByteValue()}]返回结果", value.Result.ToString());
+        }
+
         public JT809_0x9200_0x9207 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9200_0x9207();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9208.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9208.cs
index f33baf1..52d365f 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9208.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9208.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK</para>
     /// <para>应答下级平台“取消申请交换指定车辆定位信息”</para>
     /// </summary>
-    public class JT809_0x9200_0x9208:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9208>, IJT809_2019_Version
+    public class JT809_0x9200_0x9208:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9208>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.取消交换指定车辆定位信息应答or取消申请交换指定车辆定位信息应答消息.ToUInt16Value();
 
@@ -29,6 +30,20 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public JT809_0x9208_Result Result { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9200_0x9208();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.SourceDataType = reader.ReadUInt16();
+                writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
+                value.SourceMsgSn = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
+            }
+            value.Result = (JT809_0x9208_Result)reader.ReadByte();
+            writer.WriteString($"[{value.Result.ToByteValue()}]返回结果", value.Result.ToString());
+        }
+
         public JT809_0x9200_0x9208 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9200_0x9208();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9209.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9209.cs
index 84c75a4..d44b048 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9209.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9209.cs
@@ -3,6 +3,7 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_EXG_MSG_APPLY_HISGNSSDATA_ACK</para>
     /// <para>本条消息是上级平台应答下级平台发送的“补发车辆定位信息请求”消息,即 UP_EXG_MSG_APPLY_HISGNSSDATA_REQ</para>
     /// </summary>
-    public class JT809_0x9200_0x9209: JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9209>, IJT809_2019_Version
+    public class JT809_0x9200_0x9209: JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9209>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.补发车辆定位信息应答.ToUInt16Value();
 
@@ -29,6 +30,20 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public JT809_0x9209_Result Result { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9200_0x9209();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.SourceDataType = reader.ReadUInt16();
+                writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString());
+                value.SourceMsgSn = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn);
+            }
+            value.Result = (JT809_0x9209_Result)reader.ReadByte();
+            writer.WriteString($"[{value.Result.ToByteValue()}]返回结果", value.Result.ToString());
+        }
+
         public JT809_0x9200_0x9209 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9200_0x9209();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920A.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920A.cs
index f8ce63b..10e3cc3 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920A.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920A.cs
@@ -6,6 +6,7 @@ using JT809.Protocol.MessagePack;
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -13,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody
     /// 上报车辆驾驶员身份识别信息请求
     /// <para>子业务类型标识:DOWN_EXG_MSG_REPORT_DRIVER_INFO</para>
     /// </summary>
-    public class JT809_0x9200_0x920A:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x920A>, IJT809_2019_Version
+    public class JT809_0x9200_0x920A:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x920A>, IJT809Analyze, IJT809_2019_Version
     {        
         public override ushort SubMsgId => JT809SubBusinessType.上报车辆驾驶员身份识别信息请求.ToUInt16Value();
 
@@ -42,5 +43,15 @@ namespace JT809.Protocol.SubMessageBody
             }
             return value;
         }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9200_0x920A();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                value.Flag = (JT809_0x920A_UploadFlag)reader.ReadByte();
+                writer.WriteString($"[{value.Flag.ToByteValue()}]上传标志", value.Flag.ToString());
+            }
+        }
     }
 }
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920D.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920D.cs
index 62c203e..653beb5 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920D.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x920D.cs
@@ -6,6 +6,7 @@ using JT809.Protocol.MessagePack;
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -14,7 +15,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_BASE_MSG_DRVLINE_ACK</para>
     /// <para>上级平台应答下级平台发送地车辆行驶路线信息</para>
     /// </summary>
-    public class JT809_0x9200_0x920D : JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x920D>, IJT809_2019_Version
+    public class JT809_0x9200_0x920D : JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x920D>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆行驶线路请求应答.ToUInt16Value();
 
@@ -26,7 +27,7 @@ namespace JT809.Protocol.SubMessageBody
         /// <summary>
         /// 处理结果 0x00 完成记录,0x01 审核通过,完成记录 0x02信息错误,未完成记录0x03 审核未通过,未完成记录
         /// </summary>
-        public byte Result { get; set; }
+        public JT809_0x920D_Result Result { get; set; }
         /// <summary>
         /// 未通过原因内容长度
         /// </summary>
@@ -36,11 +37,25 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public string Reason { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9200_0x920D();
+            value.DRVLineID = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.DRVLineID.ReadNumber()}]线路ID", value.DRVLineID);
+            value.Result = (JT809_0x920D_Result)reader.ReadByte();
+            writer.WriteString($"[{value.Result.ToByteValue()}]处理结果", value.Result.ToString());
+            value.ReasonLength = reader.ReadUInt16();
+            writer.WriteNumber($"[{value.ReasonLength.ReadNumber()}]未通过原因内容长度", value.ReasonLength);
+            var virtualHex = reader.ReadVirtualArray(value.ReasonLength);
+            value.Reason = reader.ReadString(value.ReasonLength);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]经过GBK编码后的未通过原因", value.Reason);
+        }
+
         public JT809_0x9200_0x920D Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9200_0x920D();
             value.DRVLineID = reader.ReadUInt32();
-            value.Result = reader.ReadByte();
+            value.Result = (JT809_0x920D_Result)reader.ReadByte();
             value.ReasonLength = reader.ReadUInt16();
             value.Reason = reader.ReadString(value.ReasonLength);
             return value;
@@ -49,7 +64,7 @@ namespace JT809.Protocol.SubMessageBody
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x920D value, IJT809Config config)
         {
             writer.WriteUInt32(value.DRVLineID);
-            writer.WriteByte(value.Result);
+            writer.WriteByte(value.Result.ToByteValue());
             writer.Skip(2, out int position);
             writer.WriteString(value.Reason);
             writer.WriteUInt16Return((ushort)(writer.GetCurrentPosition() - position-2), position);
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9301.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9301.cs
index 2f8dae0..1f31472 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9301.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9301.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_PLATFORM-MSG_POST_QUERY_REQ</para>
     /// <para>描述:上级平台不定期向下级平台发送平台查岗信息</para>
     /// </summary>
-    public class JT809_0x9300_0x9301:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9300_0x9301>
+    public class JT809_0x9300_0x9301:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9300_0x9301>, IJT809Analyze,IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.平台查岗请求.ToUInt16Value();
 
@@ -24,6 +26,10 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public string ObjectID { get; set; }
         /// <summary>
+        /// 查岗应答时限
+        /// </summary>
+        public byte AnswerTime { get; set; }
+        /// <summary>
         /// 信息ID
         /// </summary>
         public uint InfoID { get; set; }
@@ -35,15 +41,39 @@ namespace JT809.Protocol.SubMessageBody
         /// 应答内容
         /// </summary>
         public string InfoContent { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9300_0x9301 value = new JT809_0x9300_0x9301();
+            value.ObjectType = (JT809_0x9301_ObjectType)reader.ReadByte();
+            writer.WriteString($"[{value.ObjectType.ToByteValue()}]查岗对象的类型", value.ObjectType.ToString());
+            var virtualHex = reader.ReadVirtualArray(12);
+            value.ObjectID = reader.ReadString(12);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]查岗对象的ID", value.ObjectID);
+            if (config.Version == JT809Version.JTT2019) {
+                writer.WriteNumber($"[{value.AnswerTime.ReadNumber()}]查岗应答时限", value.AnswerTime);
+            }
+            value.InfoID = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.InfoID.ReadNumber() }]信息ID", value.InfoID);
+            value.InfoLength = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.InfoLength.ReadNumber() }]数据长度", value.InfoLength);
+            virtualHex = reader.ReadVirtualArray((int)value.InfoLength);
+            value.InfoContent = reader.ReadString((int)value.InfoLength);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]应答内容", value.InfoContent);
+        }
+
         public JT809_0x9300_0x9301 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9300_0x9301 jT809_0X9300_0X9301 = new JT809_0x9300_0x9301();
-            jT809_0X9300_0X9301.ObjectType = (JT809_0x9301_ObjectType)reader.ReadByte();
-            jT809_0X9300_0X9301.ObjectID = reader.ReadString(12);
-            jT809_0X9300_0X9301.InfoID = reader.ReadUInt32();
-            jT809_0X9300_0X9301.InfoLength = reader.ReadUInt32();
-            jT809_0X9300_0X9301.InfoContent = reader.ReadString((int)jT809_0X9300_0X9301.InfoLength);
-            return jT809_0X9300_0X9301;
+            JT809_0x9300_0x9301 value = new JT809_0x9300_0x9301();
+            value.ObjectType = (JT809_0x9301_ObjectType)reader.ReadByte();
+            value.ObjectID = reader.ReadString(12);
+            if (config.Version == JT809Version.JTT2019) {
+                value.AnswerTime = reader.ReadByte();
+            }
+            value.InfoID = reader.ReadUInt32();
+            value.InfoLength = reader.ReadUInt32();
+            value.InfoContent = reader.ReadString((int)value.InfoLength);
+            return value;
         }
 
 
@@ -51,6 +81,10 @@ namespace JT809.Protocol.SubMessageBody
         {
             writer.WriteByte((byte)value.ObjectType);
             writer.WriteStringPadRight(value.ObjectID, 12);
+            if (config.Version == JT809Version.JTT2019)
+            {
+                writer.WriteByte(value.AnswerTime);
+            }
             writer.WriteUInt32(value.InfoID);
             // 先计算内容长度(汉字为两个字节)
             writer.Skip(4, out int lengthPosition);
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9302.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9302.cs
index 169019d..0bc20b9 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9302.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9302.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_PLATFORM_MSG_INFO_REQ</para>
     /// <para>描述:上级平台不定期向下级平台下发平台间报文</para>
     /// </summary>
-    public class JT809_0x9300_0x9302:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9300_0x9302>
+    public class JT809_0x9300_0x9302:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9300_0x9302>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.下发平台间报文请求.ToUInt16Value();
 
@@ -35,15 +37,33 @@ namespace JT809.Protocol.SubMessageBody
         /// 应答内容
         /// </summary>
         public string InfoContent { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9300_0x9302 value = new JT809_0x9300_0x9302();
+            value.ObjectType = (JT809_0x9302_ObjectType)reader.ReadByte();
+            writer.WriteString($"[{value.ObjectType.ToByteValue()}]查岗对象的类型", value.ObjectType.ToString());
+            var virtualHex = reader.ReadVirtualArray(12);
+            value.ObjectID = reader.ReadString(12);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]查岗对象的ID", value.ObjectID);
+            value.InfoID = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.InfoID.ReadNumber() }]信息ID", value.InfoID);
+            value.InfoLength = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.InfoLength.ReadNumber() }]数据长度", value.InfoLength);
+            virtualHex = reader.ReadVirtualArray((int)value.InfoLength);
+            value.InfoContent = reader.ReadString((int)value.InfoLength);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]应答内容", value.InfoContent);
+        }
+
         public JT809_0x9300_0x9302 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9300_0x9302 jT809_0X9300_0X9302 = new JT809_0x9300_0x9302();
-            jT809_0X9300_0X9302.ObjectType = (JT809_0x9302_ObjectType)reader.ReadByte();
-            jT809_0X9300_0X9302.ObjectID = reader.ReadString(12);
-            jT809_0X9300_0X9302.InfoID = reader.ReadUInt32();
-            jT809_0X9300_0X9302.InfoLength = reader.ReadUInt32();
-            jT809_0X9300_0X9302.InfoContent = reader.ReadString((int)jT809_0X9300_0X9302.InfoLength);
-            return jT809_0X9300_0X9302;
+            JT809_0x9300_0x9302 value = new JT809_0x9300_0x9302();
+            value.ObjectType = (JT809_0x9302_ObjectType)reader.ReadByte();
+            value.ObjectID = reader.ReadString(12);
+            value.InfoID = reader.ReadUInt32();
+            value.InfoLength = reader.ReadUInt32();
+            value.InfoContent = reader.ReadString((int)value.InfoLength);
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9300_0x9302 value, IJT809Config config)
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9303.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9303.cs
index 619aefe..3e225f2 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9303.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9300_0x9303.cs
@@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using System;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -12,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_PLATFORM_MSG_RETRAN_REQ</para>
     /// <para>描述:上级平台接收方在接受消息时,如发现消息报文序列号不连接,则立即发送消息补传请求。下级平台收到消息补传请求后,根据请求的消息报文序列号。重传相应的消息</para>
     /// </summary>
-    public class JT809_0x9300_0x9303:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9300_0x9303>, IJT809_2019_Version
+    public class JT809_0x9300_0x9303:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9300_0x9303>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.下发平台间消息补传请求消息.ToUInt16Value();
 
@@ -27,6 +28,17 @@ namespace JT809.Protocol.SubMessageBody
         /// 8位
         /// </summary>
         public DateTime Time { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9300_0x9303();
+            value.SerialList = reader.ReadArray(8).ToArray();
+            writer.WriteString($"[{value.SerialList.ToHexString()}]需要重传消息的起始报文序列号和结束的报文序列号", value.SerialList.ToHexString());
+            var virtualHex = reader.ReadVirtualArray(8);
+            value.Time = reader.ReadUTCDateTime();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]", value.Time);
+        }
+
         public JT809_0x9300_0x9303 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9300_0x9303();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs
index 79dc86c..9575280 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs
@@ -3,6 +3,8 @@ using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using System;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -11,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_WARN_MSG_URGE_TODO_REQ</para>
     /// <para>描述:上级平台向车辆归属下级平台下发本消息,催促其及时处理相关车辆的报警信息</para>
     /// </summary>
-    public class JT809_0x9400_0x9401:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9401>
+    public class JT809_0x9400_0x9401:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9401>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.报警督办请求消息.ToUInt16Value();
 
@@ -39,7 +41,7 @@ namespace JT809.Protocol.SubMessageBody
         /// <summary>
         /// 督办级别
         /// </summary>
-        public byte SupervisionLevel { get; set; }
+        public JT809_9401_SupervisionLevel SupervisionLevel { get; set; }
         /// <summary>
         /// 督办人
         /// </summary>
@@ -52,19 +54,49 @@ namespace JT809.Protocol.SubMessageBody
         /// 督办联系电子邮件
         /// </summary>
         public string SupervisorEmail { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9400_0x9401 value = new JT809_0x9400_0x9401();
+            value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
+            writer.WriteString($"[{value.WarnSrc.ToByteValue()}]报警信息来源", value.WarnSrc.ToString());
+            value.WarnType = reader.ReadUInt16();
+            writer.WriteNumber($"[{value.WarnType.ReadNumber()}]报警类型", value.WarnType);
+            var virtualHex = reader.ReadVirtualArray(8);
+            value.WarnTime = reader.ReadUTCDateTime();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警时间", value.WarnTime);
+            virtualHex = reader.ReadVirtualArray(4);
+            value.SupervisionID = reader.ReadHex(4);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警督办ID", value.SupervisionID);
+            virtualHex = reader.ReadVirtualArray(8);
+            value.SupervisionEndTime = reader.ReadUTCDateTime();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办截止时间", value.SupervisionEndTime);
+            value.SupervisionLevel = (JT809_9401_SupervisionLevel)reader.ReadByte();
+            writer.WriteString($"[{value.SupervisionLevel.ToByteValue()}]督办级别", value.SupervisionLevel.ToString());
+            virtualHex = reader.ReadVirtualArray(16);
+            value.Supervisor = reader.ReadString(16);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办人", value.Supervisor);
+            virtualHex = reader.ReadVirtualArray(20);
+            value.SupervisorTel = reader.ReadString(20);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办联系电话", value.SupervisorTel);
+            virtualHex = reader.ReadVirtualArray(32);
+            value.SupervisorEmail = reader.ReadString(32);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]督办联系电子邮件", value.SupervisorEmail);
+        }
+
         public JT809_0x9400_0x9401 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9400_0x9401 jT809_0X9400_0X9401 = new JT809_0x9400_0x9401();
-            jT809_0X9400_0X9401.WarnSrc = (JT809WarnSrc)reader.ReadByte();
-            jT809_0X9400_0X9401.WarnType = reader.ReadUInt16();
-            jT809_0X9400_0X9401.WarnTime = reader.ReadUTCDateTime();
-            jT809_0X9400_0X9401.SupervisionID = reader.ReadHex(4);
-            jT809_0X9400_0X9401.SupervisionEndTime = reader.ReadUTCDateTime();
-            jT809_0X9400_0X9401.SupervisionLevel = reader.ReadByte();
-            jT809_0X9400_0X9401.Supervisor = reader.ReadString(16);
-            jT809_0X9400_0X9401.SupervisorTel = reader.ReadString(20);
-            jT809_0X9400_0X9401.SupervisorEmail = reader.ReadString(32);
-            return jT809_0X9400_0X9401;
+            JT809_0x9400_0x9401 value = new JT809_0x9400_0x9401();
+            value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
+            value.WarnType = reader.ReadUInt16();
+            value.WarnTime = reader.ReadUTCDateTime();
+            value.SupervisionID = reader.ReadHex(4);
+            value.SupervisionEndTime = reader.ReadUTCDateTime();
+            value.SupervisionLevel = (JT809_9401_SupervisionLevel)reader.ReadByte();
+            value.Supervisor = reader.ReadString(16);
+            value.SupervisorTel = reader.ReadString(20);
+            value.SupervisorEmail = reader.ReadString(32);
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9400_0x9401 value, IJT809Config config)
@@ -74,7 +106,7 @@ namespace JT809.Protocol.SubMessageBody
             writer.WriteUTCDateTime(value.WarnTime);
             writer.WriteHex(value.SupervisionID, 4);
             writer.WriteUTCDateTime(value.SupervisionEndTime);
-            writer.WriteByte(value.SupervisionLevel);
+            writer.WriteByte(value.SupervisionLevel.ToByteValue());
             writer.WriteStringPadRight(value.Supervisor, 16);
             writer.WriteStringPadRight(value.SupervisorTel, 20);
             writer.WriteStringPadRight(value.SupervisorEmail, 32);
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9402.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9402.cs
index 4840a8b..9f02840 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9402.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9402.cs
@@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using System;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -14,7 +15,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>描述:用于上级平台向车辆归属或车辆跨域下级平台下发相关车辆的报警顶警或运行提示信息</para>
     /// <para>本条消息下级平台无需应答</para>
     /// </summary>
-    public class JT809_0x9400_0x9402:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9402>,IJT809_2019_Version
+    public class JT809_0x9400_0x9402:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9402>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.报警预警2013_下发报警预警消息2019.ToUInt16Value();
 
@@ -68,6 +69,52 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public string WarnContent { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9400_0x9402();
+            if (config.Version == JT809Version.JTT2011)
+            {
+                value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
+                writer.WriteString($"[{value.WarnSrc.ToByteValue()}]报警信息来源", value.WarnSrc.ToString());
+            }
+            else
+            {
+                var hex = reader.ReadVirtualArray(11);
+                value.SourcePlatformId = reader.ReadBigNumber(11);
+                writer.WriteString($"[{hex.ToArray().ToHexString()}]发起报警平台唯一编码", value.SourcePlatformId);
+            }
+            value.WarnType = (JT809WarnType)reader.ReadUInt16();
+            writer.WriteString($"[{value.WarnType.ToUInt16Value()}]报警类型", value.WarnType.ToString());
+            var virtualHex = reader.ReadVirtualArray(8);
+            value.WarnTime = reader.ReadUTCDateTime();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警时间", value.WarnTime);
+            if (config.Version == JT809Version.JTT2019)
+            {
+                virtualHex = reader.ReadVirtualArray(8);
+                value.StartTime = reader.ReadUTCDateTime();
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]事件开始时间", value.StartTime);
+                virtualHex = reader.ReadVirtualArray(8);
+                value.EndTime = reader.ReadUTCDateTime();
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]事件结束时间", value.EndTime);
+#warning 此处车牌号文档长度有误,使用旧版长度21
+                virtualHex = reader.ReadVirtualArray(21);
+                value.VehicleNo = reader.ReadString(21);
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号码", value.VehicleNo);
+                value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
+                writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString());
+                virtualHex = reader.ReadVirtualArray(11);
+                value.DestinationPlatformId = reader.ReadBigNumber(11);
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]被报警平台唯一编码", value.DestinationPlatformId);
+                value.DRVLineId = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.DRVLineId.ReadNumber()}]线路ID", value.DRVLineId);
+            }
+            value.WarnLength = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.WarnLength.ReadNumber()}]数据长度", value.WarnLength);
+            virtualHex = reader.ReadVirtualArray((int)value.WarnLength);
+            value.WarnContent = reader.ReadString((int)value.WarnLength);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警描述", value.WarnContent);
+        }
+
         public JT809_0x9400_0x9402 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9400_0x9402();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9403.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9403.cs
index cadd173..735c098 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9403.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9403.cs
@@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using System;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -13,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>描述:用于上级平台向车辆跨域目的地下级平台下发相关车辆的当前报警情况</para>
     /// <para>本条消息下级平台无需应答</para>
     /// </summary>
-    public class JT809_0x9400_0x9403:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9403>,IJT809_2019_Version
+    public class JT809_0x9400_0x9403:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9403>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.实时交换报警信息.ToUInt16Value();
 
@@ -66,6 +67,53 @@ namespace JT809.Protocol.SubMessageBody
         /// 报警描述
         /// </summary>
         public string WarnContent { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9400_0x9403();
+            if (config.Version == JT809Version.JTT2011)
+            {
+                value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
+                writer.WriteString($"[{value.WarnSrc.ToByteValue()}]报警信息来源", value.WarnSrc.ToString());
+            }
+            else
+            {
+                var hex = reader.ReadVirtualArray(11);
+                value.SourcePlatformId = reader.ReadBigNumber(11);
+                writer.WriteString($"[{hex.ToArray().ToHexString()}]发起报警平台唯一编码", value.SourcePlatformId);
+            }
+            value.WarnType = (JT809WarnType)reader.ReadUInt16();
+            writer.WriteString($"[{value.WarnType.ToUInt16Value()}]报警类型", value.WarnType.ToString());
+            var virtualHex = reader.ReadVirtualArray(8);
+            value.WarnTime = reader.ReadUTCDateTime();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警时间", value.WarnTime);
+            if (config.Version == JT809Version.JTT2019)
+            {
+                virtualHex = reader.ReadVirtualArray(8);
+                value.StartTime = reader.ReadUTCDateTime();
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]事件开始时间", value.StartTime);
+                virtualHex = reader.ReadVirtualArray(8);
+                value.EndTime = reader.ReadUTCDateTime();
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]事件结束时间", value.EndTime);
+#warning 此处车牌号文档长度有误,使用旧版长度21
+                virtualHex = reader.ReadVirtualArray(21);
+                value.VehicleNo = reader.ReadString(21);
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号码", value.VehicleNo);
+                value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
+                writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString());
+                virtualHex = reader.ReadVirtualArray(11);
+                value.DestinationPlatformId = reader.ReadBigNumber(11);
+                writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]被报警平台唯一编码", value.DestinationPlatformId);
+                value.DRVLineId = reader.ReadUInt32();
+                writer.WriteNumber($"[{value.DRVLineId.ReadNumber()}]线路ID", value.DRVLineId);
+            }
+            value.WarnLength = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.WarnLength.ReadNumber()}]数据长度", value.WarnLength);
+            virtualHex = reader.ReadVirtualArray((int)value.WarnLength);
+            value.WarnContent = reader.ReadString((int)value.WarnLength);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报警描述", value.WarnContent);
+        }
+
         public JT809_0x9400_0x9403 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9400_0x9403();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9501.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9501.cs
index 6a11807..8266549 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9501.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9501.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ</para>
     /// <para>描述:上级平台向下级平台下发车辆单向监听清求消息</para>
     /// </summary>
-    public class JT809_0x9500_0x9501:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9501>
+    public class JT809_0x9500_0x9501:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9501>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆单向监听请求消息.ToUInt16Value();
 
@@ -19,11 +21,20 @@ namespace JT809.Protocol.SubMessageBody
         /// 回拨电话号码
         /// </summary>
         public string MonitorTel { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9500_0x9501 value = new JT809_0x9500_0x9501();
+            var virtualHex = reader.ReadVirtualArray(20);
+            value.MonitorTel = reader.ReadString(20);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]回拨电话号码", value.MonitorTel);
+        }
+
         public JT809_0x9500_0x9501 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9500_0x9501 jT809_0X9500_0X9501 = new JT809_0x9500_0x9501();
-            jT809_0X9500_0X9501.MonitorTel = reader.ReadString(20);
-            return jT809_0X9500_0X9501;
+            JT809_0x9500_0x9501 value = new JT809_0x9500_0x9501();
+            value.MonitorTel = reader.ReadString(20);
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9500_0x9501 value, IJT809Config config)
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9502.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9502.cs
index 629e4f5..afc2608 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9502.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9502.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_CTRL_MSG_TAKE_PHOTO_REQ</para>
     /// <para>描述:上级平台向下级平台下发对某指定车辆的拍照请求消息</para>
     /// </summary>
-    public class JT809_0x9500_0x9502:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9502>
+    public class JT809_0x9500_0x9502:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9502>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆拍照请求消息.ToUInt16Value();
 
@@ -28,20 +30,30 @@ namespace JT809.Protocol.SubMessageBody
         /// Ox05:176x 144[QCIF];
         /// 0x06:704x288[CIF];
         /// 0x07:704x288[HALF D];
-        /// Ox08:704576[DI]
+        /// Ox08:704x576[DI]
         /// </summary>
-        public byte SizeType { get; set; }
+        public JT809__0x9502_SizeType SizeType { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9500_0x9502 value = new JT809_0x9500_0x9502();
+            value.LensID = reader.ReadByte();
+            writer.WriteNumber($"[{value.LensID.ReadNumber() }]镜头ID", value.LensID);
+            value.SizeType = (JT809__0x9502_SizeType)reader.ReadByte();
+            writer.WriteString($"[{value.SizeType.ToByteValue()}]图片大小", value.SizeType.ToString());
+        }
+
         public JT809_0x9500_0x9502 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9500_0x9502 jT809_0X9500_0X9502 = new JT809_0x9500_0x9502();
-            jT809_0X9500_0X9502.LensID = reader.ReadByte();
-            jT809_0X9500_0X9502.SizeType = reader.ReadByte();
-            return jT809_0X9500_0X9502;
+            JT809_0x9500_0x9502 value = new JT809_0x9500_0x9502();
+            value.LensID = reader.ReadByte();
+            value.SizeType = (JT809__0x9502_SizeType)reader.ReadByte();
+            return value;
         }
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9500_0x9502 value, IJT809Config config)
         {
             writer.WriteByte(value.LensID);
-            writer.WriteByte(value.SizeType);
+            writer.WriteByte(value.SizeType.ToByteValue());
         }
     }
 }
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9503.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9503.cs
index c3783ec..95cf790 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9503.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9503.cs
@@ -2,6 +2,8 @@
 using JT809.Protocol.Formatters;
 using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
+using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -10,7 +12,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOWN_CTRL_MSG_TEXT_INFO</para>
     /// <para>描述:用于上级平台向下级平台下发报文到某指定车辆</para>
     /// </summary>
-    public class JT809_0x9500_0x9503:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9503>
+    public class JT809_0x9500_0x9503:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9503>, IJT809Analyze
     {
         public override ushort SubMsgId => JT809SubBusinessType.下发车辆报文请求.ToUInt16Value();
 
@@ -22,7 +24,7 @@ namespace JT809.Protocol.SubMessageBody
         /// <summary>
         /// 报文优先级
         /// </summary>
-        public byte MsgPriority { get; set; }
+        public JT809_0x9503_MsgPriority MsgPriority { get; set; }
         /// <summary>
         /// 报文信息长度
         /// </summary>
@@ -31,20 +33,35 @@ namespace JT809.Protocol.SubMessageBody
         /// 报文信息内容
         /// </summary>
         public string MsgContent { get; set; }
+
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9500_0x9503 value = new JT809_0x9500_0x9503();
+            value.MsgSequence = reader.ReadUInt32();
+            writer.WriteNumber($"[{value.MsgSequence.ReadNumber()}]消息ID序号", value.MsgSequence);
+            value.MsgPriority = (JT809_0x9503_MsgPriority)reader.ReadByte();
+            writer.WriteString($"[{value.MsgPriority.ToByteValue()}]报文优先级", value.MsgPriority.ToString());
+            value.MsgLength = reader.ReadUInt32();
+            writer.WriteNumber($"[{ value.MsgLength.ReadNumber()}]报文信息长度", value.MsgLength);
+            var virtualHex = reader.ReadVirtualArray((int)value.MsgLength);
+            value.MsgContent = reader.ReadString((int)value.MsgLength);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]报文信息内容", value.MsgContent);
+        }
+
         public JT809_0x9500_0x9503 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9500_0x9503 jT809_0X9500_0X9503 = new JT809_0x9500_0x9503();
-            jT809_0X9500_0X9503.MsgSequence = reader.ReadUInt32();
-            jT809_0X9500_0X9503.MsgPriority = reader.ReadByte();
-            jT809_0X9500_0X9503.MsgLength = reader.ReadUInt32();
-            jT809_0X9500_0X9503.MsgContent = reader.ReadString((int)jT809_0X9500_0X9503.MsgLength);
-            return jT809_0X9500_0X9503;
+            JT809_0x9500_0x9503 value = new JT809_0x9500_0x9503();
+            value.MsgSequence = reader.ReadUInt32();
+            value.MsgPriority = (JT809_0x9503_MsgPriority)reader.ReadByte();
+            value.MsgLength = reader.ReadUInt32();
+            value.MsgContent = reader.ReadString((int)value.MsgLength);
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9500_0x9503 value, IJT809Config config)
         {
             writer.WriteUInt32(value.MsgSequence);
-            writer.WriteByte(value.MsgPriority);
+            writer.WriteByte(value.MsgPriority.ToByteValue());
             // 先计算内容长度(汉字为两个字节)
             writer.Skip(4, out int lengthPosition);
             writer.WriteString(value.MsgContent);
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9504.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9504.cs
index cd8bd18..54c7c01 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9504.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9504.cs
@@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using System;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -12,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:DOVJN_CTRL_MSG_TAKE_TRAVEL_REQ</para>
     /// <para>描述:上级平台向下级平台下发上报车辆行驶记录请求消息</para>
     /// </summary>
-    public class JT809_0x9500_0x9504:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9504>, IJT809_2019_Version
+    public class JT809_0x9500_0x9504:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9504>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.上报车辆行驶记录请求消息.ToUInt16Value();
 
@@ -34,6 +35,56 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public ushort Max { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            var value = new JT809_0x9500_0x9504();
+            if (config.Version == JT809Version.JTT2019)
+            {
+                var hex = reader.ReadVirtualArray(8);
+                value.StartTime = reader.ReadUTCDateTime();
+                writer.WriteString($"[{hex.ToArray().ToHexString()}]开始时间", value.StartTime);
+                hex = reader.ReadVirtualArray(8);
+                value.EndTime = reader.ReadUTCDateTime();
+                writer.WriteString($"[{hex.ToArray().ToHexString()}]结束时间", value.EndTime);
+                value.Command = (JT809CommandType)reader.ReadByte();
+                writer.WriteString($"[{value.Command.ToByteValue()}]命令字ID", value.Command.ToString());
+            }
+            else
+            {
+                value.Command = (JT809CommandType)reader.ReadByte();
+                writer.WriteString($"[{value.Command.ToByteValue()}]命令字ID", value.Command.ToString());
+                switch (value.Command)
+                {
+                    case JT809CommandType.记录仪标准版本:
+                    case JT809CommandType.当前驾驶人信息:
+                    case JT809CommandType.记录仪时间:
+                    case JT809CommandType.记录仪累计行驶里程:
+                    case JT809CommandType.记录仪脉冲系数:
+                    case JT809CommandType.车辆信息:
+                    case JT809CommandType.记录仪状态信号配置信息:
+                    case JT809CommandType.记录仪唯一性编号:
+                        break;
+                    case JT809CommandType.采集记录仪行驶记录:
+                    case JT809CommandType.采集记录仪位置信息记录:
+                    case JT809CommandType.采集记录仪事故疑点记录:
+                    case JT809CommandType.采集记录仪超时驾驶记录:
+                    case JT809CommandType.采集记录仪驾驶人身份记录:
+                    case JT809CommandType.采集记录仪外部供电记录:
+                    case JT809CommandType.采集记录仪参数修改记录:
+                    case JT809CommandType.采集记录仪速度状态日志:
+                        var hex = reader.ReadVirtualArray(6);
+                        value.StartTime = reader.ReadDateTime6();
+                        writer.WriteString($"[{hex.ToArray().ToHexString()}]开始时间", value.StartTime);
+                        hex = reader.ReadVirtualArray(6);
+                        value.EndTime = reader.ReadDateTime6();
+                        writer.WriteString($"[{hex.ToArray().ToHexString()}]结束时间", value.EndTime);
+                        value.Max = reader.ReadUInt16();
+                        writer.WriteNumber($"[{value.Max.ReadNumber()}]最大数据数", value.Max);
+                        break;
+                }
+            }
+        }
+
         public JT809_0x9500_0x9504 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
             var value = new JT809_0x9500_0x9504();
diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9505.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9505.cs
index 4b07bcb..1044f99 100644
--- a/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9505.cs
+++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9500_0x9505.cs
@@ -4,6 +4,7 @@ using JT809.Protocol.MessagePack;
 using JT809.Protocol.Extensions;
 using System;
 using JT809.Protocol.Interfaces;
+using System.Text.Json;
 
 namespace JT809.Protocol.SubMessageBody
 {
@@ -12,7 +13,7 @@ namespace JT809.Protocol.SubMessageBody
     /// <para>子业务类型标识:UP_CTRL_MSG_EMERGENCY_MONITORING_REQ</para>
     /// <para>描述:发生应急情况时,政府监管平台需要及时监控该车辆时,就向该车辆归属的下级平台发送该命令</para>
     /// </summary>
-    public class JT809_0x9500_0x9505:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9505>,IJT809_2019_Version
+    public class JT809_0x9500_0x9505:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9500_0x9505>, IJT809Analyze, IJT809_2019_Version
     {
         public override ushort SubMsgId => JT809SubBusinessType.车辆应急接入监管平台请求消息.ToUInt16Value();
 
@@ -50,18 +51,45 @@ namespace JT809.Protocol.SubMessageBody
         /// </summary>
         public DateTime EndTime { get; set; }
 
+        public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
+        {
+            JT809_0x9500_0x9505 value = new JT809_0x9500_0x9505();
+            var virtualHex = reader.ReadVirtualArray(10);
+            value.AuthenticationCode = reader.ReadBCD(20);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监管平台下发的鉴权码", value.AuthenticationCode);
+            virtualHex = reader.ReadVirtualArray(20);
+            value.AccessPointName = reader.ReadString(20);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]拨号点名称", value.AccessPointName);
+            virtualHex = reader.ReadVirtualArray(49);
+            value.UserName = reader.ReadString(49);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]拨号用户名", value.UserName);
+            virtualHex = reader.ReadVirtualArray(49);
+            value.Password = reader.ReadString(22);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]拨号密码", value.Password);
+            virtualHex = reader.ReadVirtualArray(32);
+            value.ServerIP = reader.ReadString(32);
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]地址", value.ServerIP);
+            value.TcpPort = reader.ReadUInt16();
+            writer.WriteNumber($"[{value.TcpPort.ReadNumber()}]", value.TcpPort);
+            value.UdpPort = reader.ReadUInt16();
+            writer.WriteNumber($"[{value.UdpPort.ReadNumber()}]", value.UdpPort);
+            virtualHex = reader.ReadVirtualArray(8);
+            value.EndTime = reader.ReadUTCDateTime();
+            writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]结束时间", value.EndTime);
+        }
+
         public JT809_0x9500_0x9505 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
         {
-            JT809_0x9500_0x9505 jT809_0X9500_0X9505 = new JT809_0x9500_0x9505();
-            jT809_0X9500_0X9505.AuthenticationCode = reader.ReadBCD(20);
-            jT809_0X9500_0X9505.AccessPointName = reader.ReadString(20);
-            jT809_0X9500_0X9505.UserName = reader.ReadString(49);
-            jT809_0X9500_0X9505.Password = reader.ReadString(22);
-            jT809_0X9500_0X9505.ServerIP = reader.ReadString(32);
-            jT809_0X9500_0X9505.TcpPort = reader.ReadUInt16();
-            jT809_0X9500_0X9505.UdpPort = reader.ReadUInt16();
-            jT809_0X9500_0X9505.EndTime = reader.ReadUTCDateTime();
-            return jT809_0X9500_0X9505;
+            JT809_0x9500_0x9505 value = new JT809_0x9500_0x9505();
+            value.AuthenticationCode = reader.ReadBCD(20);
+            value.AccessPointName = reader.ReadString(20);
+            value.UserName = reader.ReadString(49);
+            value.Password = reader.ReadString(22);
+            value.ServerIP = reader.ReadString(32);
+            value.TcpPort = reader.ReadUInt16();
+            value.UdpPort = reader.ReadUInt16();
+            value.EndTime = reader.ReadUTCDateTime();
+            return value;
         }
 
         public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9500_0x9505 value, IJT809Config config)