diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80ReplyTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80ReplyTest.cs
new file mode 100644
index 0000000..8f648a4
--- /dev/null
+++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80ReplyTest.cs
@@ -0,0 +1,280 @@
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JTNE.Protocol.Extensions;
+
+namespace JTNE.Protocol.Test.MessageBody
+{
+    public class JTNE_0x80ReplyTest
+    {
+        [Fact]
+        public void Test1()
+        {
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0x80Reply.ParamNum = 1;
+            jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x01{
+                     ParamId=0x01,
+                      ParamLength=2,
+                       ParamValue=10
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0x80Reply).ToHexString();
+            Assert.Equal("1301161737380101000A", hex);
+        }
+
+        [Fact]
+        public void Test1_1()
+        {
+            var data = "1301161737380101000A".ToHexBytes();
+            JTNE_0x80Reply jTNE_0x80Reply = JTNESerializer.Deserialize<JTNE_0x80Reply>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x80Reply.ReplyTime);
+            Assert.Equal(1, jTNE_0x80Reply.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject( new JTNE_0x80Reply_0x01
+            {
+                ParamId = 0x01,
+                ParamLength = 2,
+                ParamValue = 10
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x80Reply.ParamList[0] ));
+        }
+        [Fact]
+        public void Test2()
+        {
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0x80Reply.ParamNum = 1;
+            jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x02{
+                     ParamId=0x02,
+                      ParamLength=2,
+                       ParamValue=20
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0x80Reply).ToHexString();
+            Assert.Equal("13011617373801020014", hex);
+        }
+
+        [Fact]
+        public void Test2_1()
+        {
+            var data = "13011617373801020014".ToHexBytes();
+            JTNE_0x80Reply jTNE_0x80Reply = JTNESerializer.Deserialize<JTNE_0x80Reply>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x80Reply.ReplyTime);
+            Assert.Equal(1, jTNE_0x80Reply.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new JTNE_0x80Reply_0x02
+            {
+                ParamId = 0x02,
+                ParamLength = 2,
+                ParamValue = 20
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x80Reply.ParamList[0]));
+        }
+        [Fact]
+        public void Test4()
+        {
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = DateTime.Parse("2019-01-22 23:55:56");         
+            jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x04{
+                       ParamValue=8
+                },new JTNE_0x80Reply_0x05{
+                       ParamValue=new byte[]{ 1, 2, 3, 4, 5, 6, 7, 8 }
+                },
+                   new JTNE_0x80Reply_0x06{
+                       ParamValue=40
+                }
+            };
+            jTNE_0x80Reply.ParamNum =(byte)jTNE_0x80Reply.ParamList.Count;
+            var hex = JTNESerializer.Serialize(jTNE_0x80Reply).ToHexString();
+            Assert.Equal("130116173738030408050102030405060708060028", hex);
+        }
+
+        [Fact]
+        public void Test4_1()
+        {
+            var data = "130116173738030408050102030405060708060028".ToHexBytes();
+            JTNE_0x80Reply jTNE_0x80Reply = JTNESerializer.Deserialize<JTNE_0x80Reply>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x80Reply.ReplyTime);
+            Assert.Equal(jTNE_0x80Reply.ParamList.Count, jTNE_0x80Reply.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x04{
+                       ParamValue=8
+                },new JTNE_0x80Reply_0x05{
+                       ParamValue=new byte[]{1,2,3,4,5,6,7,8 },
+                        ParamLength=8
+                },   new JTNE_0x80Reply_0x06{
+                       ParamValue=40
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x80Reply.ParamList));
+        }
+
+
+        [Fact]
+        public void Test5()
+        {
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x0D{
+                       ParamValue=8
+                },new JTNE_0x80Reply_0x0E{
+                       ParamValue=new byte[]{ 1, 2, 3, 4, 5, 6, 7, 8 }
+                },
+                   new JTNE_0x80Reply_0x0F{
+                       ParamValue=40
+                }
+            };
+            jTNE_0x80Reply.ParamNum = (byte)jTNE_0x80Reply.ParamList.Count;
+            var hex = JTNESerializer.Serialize(jTNE_0x80Reply).ToHexString();
+            Assert.Equal("130116173738030D080E01020304050607080F0028", hex);
+        }
+
+        [Fact]
+        public void Test5_1()
+        {
+            var data = "130116173738030D080E01020304050607080F0028".ToHexBytes();
+            JTNE_0x80Reply jTNE_0x80Reply = JTNESerializer.Deserialize<JTNE_0x80Reply>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x80Reply.ReplyTime);
+            Assert.Equal(jTNE_0x80Reply.ParamList.Count, jTNE_0x80Reply.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x0D{
+                       ParamValue=8
+                },new JTNE_0x80Reply_0x0E{
+                       ParamValue=new byte[]{1,2,3,4,5,6,7,8 },
+                         ParamLength=8
+                },   new JTNE_0x80Reply_0x0F{
+                       ParamValue=40
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x80Reply.ParamList));
+        }
+
+
+        [Fact]
+        public void Test3()
+        {
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0x80Reply.ParamNum = 1;
+            jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x03{
+                     ParamId=0x03,
+                      ParamLength=2,
+                       ParamValue=30
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0x80Reply).ToHexString();
+            Assert.Equal("1301161737380103001E", hex);
+        }
+
+        [Fact]
+        public void Test3_1()
+        {
+            var data = "1301161737380103001E".ToHexBytes();
+            JTNE_0x80Reply jTNE_0x80Reply = JTNESerializer.Deserialize<JTNE_0x80Reply>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x80Reply.ReplyTime);
+            Assert.Equal(1, jTNE_0x80Reply.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new JTNE_0x80Reply_0x03
+            {
+                ParamId = 0x03,
+                ParamLength = 2,
+                ParamValue = 30
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x80Reply.ParamList[0]));
+        }
+        [Fact]
+        public void TestAll()
+        {
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0x80Reply.ParamNum = 12;
+            jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x01{
+                     ParamValue=10
+                },
+              new JTNE_0x80Reply_0x02{
+                     ParamValue=20
+                },
+                new JTNE_0x80Reply_0x03{
+                       ParamValue=30
+                },
+                new JTNE_0x80Reply_0x06{
+                       ParamValue=40
+                },
+                new JTNE_0x80Reply_0x07{
+                       ParamValue="abcde"
+                },
+                new JTNE_0x80Reply_0x08{
+                       ParamValue="12345"
+                },
+                new JTNE_0x80Reply_0x09{
+                       ParamValue=50
+                },
+                new JTNE_0x80Reply_0x0A{
+                       ParamValue=60
+                },
+                new JTNE_0x80Reply_0x0B{
+                       ParamValue=70
+                },
+                new JTNE_0x80Reply_0x0C{
+                       ParamValue=80
+                },
+                new JTNE_0x80Reply_0x0F{
+                       ParamValue=90
+                },
+                new JTNE_0x80Reply_0x10{
+                       ParamValue=0x01
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0x80Reply).ToHexString();
+            Assert.Equal("1301161737380C01000A02001403001E06002807616263646508313233343509320A003C0B00460C500F005A1001", hex);
+        }
+
+        [Fact]
+        public void TestAll_1()
+        {
+            var data = "1301161737380C01000A02001403001E06002807616263646508313233343509320A003C0B00460C500F005A1001".ToHexBytes();
+            JTNE_0x80Reply jTNE_0x80Reply = JTNESerializer.Deserialize<JTNE_0x80Reply>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x80Reply.ReplyTime);
+            Assert.Equal(12, jTNE_0x80Reply.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x01{
+                     ParamValue=10
+                },
+              new JTNE_0x80Reply_0x02{
+                     ParamValue=20
+                },
+                new JTNE_0x80Reply_0x03{
+                       ParamValue=30
+                },
+                new JTNE_0x80Reply_0x06{
+                       ParamValue=40
+                },
+                new JTNE_0x80Reply_0x07{
+                       ParamValue="abcde"
+                },
+                new JTNE_0x80Reply_0x08{
+                       ParamValue="12345"
+                },
+                new JTNE_0x80Reply_0x09{
+                       ParamValue=50
+                },
+                new JTNE_0x80Reply_0x0A{
+                       ParamValue=60
+                },
+                new JTNE_0x80Reply_0x0B{
+                       ParamValue=70
+                },
+                new JTNE_0x80Reply_0x0C{
+                       ParamValue=80
+                },
+                new JTNE_0x80Reply_0x0F{
+                       ParamValue=90
+                },
+                new JTNE_0x80Reply_0x10{
+                       ParamValue=0x01
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x80Reply.ParamList));
+        }
+    }
+}
diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80Reply_CustomBodyTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80Reply_CustomBodyTest.cs
new file mode 100644
index 0000000..f69ad03
--- /dev/null
+++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80Reply_CustomBodyTest.cs
@@ -0,0 +1,108 @@
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.Formatters;
+using JTNE.Protocol.Attributes;
+
+namespace JTNE.Protocol.Test.MessageBody
+{
+    public class JTNE_0x80Reply_CustomBodyTest
+    {
+        [Fact]
+        public void Test1()
+        {
+            JTNEGlobalConfigs.Instance.Register_JTNE0x80ReplyCustomBody(0x80, typeof(JTNE_0x80Reply_0x80));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x80ReplyCustomBody(0x81, typeof(JTNE_0x80Reply_0x81));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x80ReplyCustomDepenedBody(0x81, 0x80);
+
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0x80Reply.ParamNum = 2;
+            jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> {
+                new JTNE_0x80Reply_0x80{            
+                       ParamValue=6
+                },
+                new JTNE_0x80Reply_0x81{
+                     ParamLength=6,
+                      ParamValue=new byte[]{ 1,2,3,4,5,6 }
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0x80Reply).ToHexString();
+            Assert.Equal("13011617373802800681010203040506", hex);
+        }
+        [Fact]
+        public void Test1_1()
+        {
+            JTNEGlobalConfigs.Instance.Register_JTNE0x80ReplyCustomBody(0x80, typeof(JTNE_0x80Reply_0x80));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x80ReplyCustomBody(0x81, typeof(JTNE_0x80Reply_0x81));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x80ReplyCustomDepenedBody(0x81, 0x80);
+
+            var data = "13011617373802800681010203040506".ToHexBytes();
+            JTNE_0x80Reply jTNE_0x80Reply = JTNESerializer.Deserialize<JTNE_0x80Reply>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x80Reply.ReplyTime);
+            Assert.Equal(jTNE_0x80Reply.ParamList.Count, jTNE_0x80Reply.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x80Reply_Body> {
+               new JTNE_0x80Reply_0x80{
+                       ParamValue=6
+                },
+                new JTNE_0x80Reply_0x81{
+                     ParamLength=6,
+                      ParamValue=new byte[]{ 1,2,3,4,5,6 }
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x80Reply.ParamList));
+        }
+    }
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x80Formatter))]
+    public class JTNE_0x80Reply_0x80 : JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; }= 0x80;
+        public override byte ParamLength { get; set; } = 1;
+        public byte ParamValue { get; set; }
+    }
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x81Formatter))]
+    public class JTNE_0x80Reply_0x81 : JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x81;
+        public override byte ParamLength { get; set; }
+        public byte[] ParamValue { get; set; }
+    }
+
+    public class JTNE_0x80Reply_0x80Formatter : IJTNEFormatter<JTNE_0x80Reply_0x80>
+    {
+        public JTNE_0x80Reply_0x80 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x80 jTNE_0x80Reply_0x80 = new JTNE_0x80Reply_0x80();
+            jTNE_0x80Reply_0x80.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x80;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x80 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+    public class JTNE_0x80Reply_0x81Formatter : IJTNEFormatter<JTNE_0x80Reply_0x81>
+    {
+        public JTNE_0x80Reply_0x81 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x81 jTNE_0x80Reply_0x80Reply = new JTNE_0x80Reply_0x81();
+            jTNE_0x80Reply_0x80Reply.ParamValue = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset);
+            jTNE_0x80Reply_0x80Reply.ParamLength = (byte)bytes.Length;
+            readSize = offset;
+            return jTNE_0x80Reply_0x80Reply;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x81 value)
+        {
+            offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80Test.cs
new file mode 100644
index 0000000..46b9831
--- /dev/null
+++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x80Test.cs
@@ -0,0 +1,33 @@
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JTNE.Protocol.Extensions;
+
+namespace JTNE.Protocol.Test.MessageBody
+{
+    public class JTNE_0x80Test
+    {
+        [Fact]
+        public void Test1()
+        {
+            JTNE_0x80 jTNE_0X80 = new JTNE_0x80();
+            jTNE_0X80.QueryTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X80.ParamNum = 2;
+            jTNE_0X80.ParamList = new byte[] {0x01,0x02 };
+            var hex = JTNESerializer.Serialize(jTNE_0X80).ToHexString();
+            Assert.Equal("130116173738020102", hex);
+        }
+
+        [Fact]
+        public void Test2()
+        {
+            var data = "130116173738020102".ToHexBytes();
+            JTNE_0x80 jTNE_0X80 = JTNESerializer.Deserialize<JTNE_0x80>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X80.QueryTime);
+            Assert.Equal(2, jTNE_0X80.ParamNum);
+            Assert.Equal(new byte[] { 0x01, 0x02 }, jTNE_0X80.ParamList);
+        }
+    }
+}
diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x81Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x81Test.cs
new file mode 100644
index 0000000..f135fee
--- /dev/null
+++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x81Test.cs
@@ -0,0 +1,280 @@
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JTNE.Protocol.Extensions;
+
+namespace JTNE.Protocol.Test.MessageBody
+{
+    public class JTNE_0x81Test
+    {
+        [Fact]
+        public void Test1()
+        {
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X81.ParamNum = 1;
+            jTNE_0X81.ParamList = new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x01{
+                     ParamId=0x01,
+                      ParamLength=2,
+                       ParamValue=10
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X81).ToHexString();
+            Assert.Equal("1301161737380101000A", hex);
+        }
+
+        [Fact]
+        public void Test1_1()
+        {
+            var data = "1301161737380101000A".ToHexBytes();
+            JTNE_0x81 jTNE_0X81 = JTNESerializer.Deserialize<JTNE_0x81>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X81.SetTime);
+            Assert.Equal(1, jTNE_0X81.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject( new JTNE_0x81_0x01
+            {
+                ParamId = 0x01,
+                ParamLength = 2,
+                ParamValue = 10
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X81.ParamList[0] ));
+        }
+        [Fact]
+        public void Test2()
+        {
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X81.ParamNum = 1;
+            jTNE_0X81.ParamList = new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x02{
+                     ParamId=0x02,
+                      ParamLength=2,
+                       ParamValue=20
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X81).ToHexString();
+            Assert.Equal("13011617373801020014", hex);
+        }
+
+        [Fact]
+        public void Test2_1()
+        {
+            var data = "13011617373801020014".ToHexBytes();
+            JTNE_0x81 jTNE_0X81 = JTNESerializer.Deserialize<JTNE_0x81>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X81.SetTime);
+            Assert.Equal(1, jTNE_0X81.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new JTNE_0x81_0x02
+            {
+                ParamId = 0x02,
+                ParamLength = 2,
+                ParamValue = 20
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X81.ParamList[0]));
+        }
+        [Fact]
+        public void Test4()
+        {
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = DateTime.Parse("2019-01-22 23:55:56");         
+            jTNE_0X81.ParamList = new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x04{
+                       ParamValue=8
+                },new JTNE_0x81_0x05{
+                       ParamValue=new byte[]{ 1, 2, 3, 4, 5, 6, 7, 8 }
+                },
+                   new JTNE_0x81_0x06{
+                       ParamValue=40
+                }
+            };
+            jTNE_0X81.ParamNum =(byte)jTNE_0X81.ParamList.Count;
+            var hex = JTNESerializer.Serialize(jTNE_0X81).ToHexString();
+            Assert.Equal("130116173738030408050102030405060708060028", hex);
+        }
+
+        [Fact]
+        public void Test4_1()
+        {
+            var data = "130116173738030408050102030405060708060028".ToHexBytes();
+            JTNE_0x81 jTNE_0X81 = JTNESerializer.Deserialize<JTNE_0x81>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X81.SetTime);
+            Assert.Equal(jTNE_0X81.ParamList.Count, jTNE_0X81.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x04{
+                       ParamValue=8
+                },new JTNE_0x81_0x05{
+                       ParamValue=new byte[]{1,2,3,4,5,6,7,8 },
+                        ParamLength=8
+                },   new JTNE_0x81_0x06{
+                       ParamValue=40
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X81.ParamList));
+        }
+
+
+        [Fact]
+        public void Test5()
+        {
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X81.ParamList = new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x0D{
+                       ParamValue=8
+                },new JTNE_0x81_0x0E{
+                       ParamValue=new byte[]{ 1, 2, 3, 4, 5, 6, 7, 8 }
+                },
+                   new JTNE_0x81_0x0F{
+                       ParamValue=40
+                }
+            };
+            jTNE_0X81.ParamNum = (byte)jTNE_0X81.ParamList.Count;
+            var hex = JTNESerializer.Serialize(jTNE_0X81).ToHexString();
+            Assert.Equal("130116173738030D080E01020304050607080F0028", hex);
+        }
+
+        [Fact]
+        public void Test5_1()
+        {
+            var data = "130116173738030D080E01020304050607080F0028".ToHexBytes();
+            JTNE_0x81 jTNE_0X81 = JTNESerializer.Deserialize<JTNE_0x81>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X81.SetTime);
+            Assert.Equal(jTNE_0X81.ParamList.Count, jTNE_0X81.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x0D{
+                       ParamValue=8
+                },new JTNE_0x81_0x0E{
+                       ParamValue=new byte[]{1,2,3,4,5,6,7,8 },
+                         ParamLength=8
+                },   new JTNE_0x81_0x0F{
+                       ParamValue=40
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X81.ParamList));
+        }
+
+
+        [Fact]
+        public void Test3()
+        {
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X81.ParamNum = 1;
+            jTNE_0X81.ParamList = new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x03{
+                     ParamId=0x03,
+                      ParamLength=2,
+                       ParamValue=30
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X81).ToHexString();
+            Assert.Equal("1301161737380103001E", hex);
+        }
+
+        [Fact]
+        public void Test3_1()
+        {
+            var data = "1301161737380103001E".ToHexBytes();
+            JTNE_0x81 jTNE_0X81 = JTNESerializer.Deserialize<JTNE_0x81>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X81.SetTime);
+            Assert.Equal(1, jTNE_0X81.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new JTNE_0x81_0x03
+            {
+                ParamId = 0x03,
+                ParamLength = 2,
+                ParamValue = 30
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X81.ParamList[0]));
+        }
+        [Fact]
+        public void TestAll()
+        {
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X81.ParamNum = 12;
+            jTNE_0X81.ParamList = new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x01{
+                     ParamValue=10
+                },
+              new JTNE_0x81_0x02{
+                     ParamValue=20
+                },
+                new JTNE_0x81_0x03{
+                       ParamValue=30
+                },
+                new JTNE_0x81_0x06{
+                       ParamValue=40
+                },
+                new JTNE_0x81_0x07{
+                       ParamValue="abcde"
+                },
+                new JTNE_0x81_0x08{
+                       ParamValue="12345"
+                },
+                new JTNE_0x81_0x09{
+                       ParamValue=50
+                },
+                new JTNE_0x81_0x0A{
+                       ParamValue=60
+                },
+                new JTNE_0x81_0x0B{
+                       ParamValue=70
+                },
+                new JTNE_0x81_0x0C{
+                       ParamValue=80
+                },
+                new JTNE_0x81_0x0F{
+                       ParamValue=90
+                },
+                new JTNE_0x81_0x10{
+                       ParamValue=0x01
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X81).ToHexString();
+            Assert.Equal("1301161737380C01000A02001403001E06002807616263646508313233343509320A003C0B00460C500F005A1001", hex);
+        }
+
+        [Fact]
+        public void TestAll_1()
+        {
+            var data = "1301161737380C01000A02001403001E06002807616263646508313233343509320A003C0B00460C500F005A1001".ToHexBytes();
+            JTNE_0x81 jTNE_0X81 = JTNESerializer.Deserialize<JTNE_0x81>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X81.SetTime);
+            Assert.Equal(12, jTNE_0X81.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x01{
+                     ParamValue=10
+                },
+              new JTNE_0x81_0x02{
+                     ParamValue=20
+                },
+                new JTNE_0x81_0x03{
+                       ParamValue=30
+                },
+                new JTNE_0x81_0x06{
+                       ParamValue=40
+                },
+                new JTNE_0x81_0x07{
+                       ParamValue="abcde"
+                },
+                new JTNE_0x81_0x08{
+                       ParamValue="12345"
+                },
+                new JTNE_0x81_0x09{
+                       ParamValue=50
+                },
+                new JTNE_0x81_0x0A{
+                       ParamValue=60
+                },
+                new JTNE_0x81_0x0B{
+                       ParamValue=70
+                },
+                new JTNE_0x81_0x0C{
+                       ParamValue=80
+                },
+                new JTNE_0x81_0x0F{
+                       ParamValue=90
+                },
+                new JTNE_0x81_0x10{
+                       ParamValue=0x01
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X81.ParamList));
+        }
+    }
+}
diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x81_CustomBodyTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x81_CustomBodyTest.cs
new file mode 100644
index 0000000..8d304da
--- /dev/null
+++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x81_CustomBodyTest.cs
@@ -0,0 +1,111 @@
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.Formatters;
+using JTNE.Protocol.Attributes;
+
+namespace JTNE.Protocol.Test.MessageBody
+{
+    public class JTNE_0x81_CustomBodyTest
+    {
+        [Fact]
+        public void Test1()
+        {
+            JTNEGlobalConfigs.Instance.Register_JTNE0x81CustomBody(0x80, typeof(JTNE_0x81_0x80));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x81CustomBody(0x81, typeof(JTNE_0x81_0x81));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x81CustomDepenedBody(0x81, 0x80);
+
+
+
+
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X81.ParamNum = 2;
+            jTNE_0X81.ParamList = new List<JTNE_0x81_Body> {
+                new JTNE_0x81_0x80{            
+                       ParamValue=6
+                },
+                new JTNE_0x81_0x81{
+                     ParamLength=6,
+                      ParamValue=new byte[]{ 1,2,3,4,5,6 }
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X81).ToHexString();
+            Assert.Equal("13011617373802800681010203040506", hex);
+        }
+        [Fact]
+        public void Test1_1()
+        {
+            JTNEGlobalConfigs.Instance.Register_JTNE0x81CustomBody(0x80, typeof(JTNE_0x81_0x80));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x81CustomBody(0x81, typeof(JTNE_0x81_0x81));
+            JTNEGlobalConfigs.Instance.Register_JTNE0x81CustomDepenedBody(0x81, 0x80);
+
+            var data = "13011617373802800681010203040506".ToHexBytes();
+            JTNE_0x81 jTNE_0X81 = JTNESerializer.Deserialize<JTNE_0x81>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X81.SetTime);
+            Assert.Equal(jTNE_0X81.ParamList.Count, jTNE_0X81.ParamNum);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new List<JTNE_0x81_Body> {
+               new JTNE_0x81_0x80{
+                       ParamValue=6
+                },
+                new JTNE_0x81_0x81{
+                     ParamLength=6,
+                      ParamValue=new byte[]{ 1,2,3,4,5,6 }
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X81.ParamList));
+        }
+    }
+    [JTNEFormatter(typeof(JTNE_0x81_0x80Formatter))]
+    public class JTNE_0x81_0x80 : JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; }= 0x80;
+        public override byte ParamLength { get; set; } = 1;
+        public byte ParamValue { get; set; }
+    }
+    [JTNEFormatter(typeof(JTNE_0x81_0x81Formatter))]
+    public class JTNE_0x81_0x81 : JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x81;
+        public override byte ParamLength { get; set; }
+        public byte[] ParamValue { get; set; }
+    }
+
+    public class JTNE_0x81_0x80Formatter : IJTNEFormatter<JTNE_0x81_0x80>
+    {
+        public JTNE_0x81_0x80 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x80 jTNE_0x81_0x80 = new JTNE_0x81_0x80();
+            jTNE_0x81_0x80.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x80;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x80 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+    public class JTNE_0x81_0x81Formatter : IJTNEFormatter<JTNE_0x81_0x81>
+    {
+        public JTNE_0x81_0x81 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x81 jTNE_0x81_0x81 = new JTNE_0x81_0x81();
+            jTNE_0x81_0x81.ParamValue = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset);
+            jTNE_0x81_0x81.ParamLength = (byte)bytes.Length;
+            readSize = offset;
+            return jTNE_0x81_0x81;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x81 value)
+        {
+            offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x82Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x82Test.cs
new file mode 100644
index 0000000..3810ad5
--- /dev/null
+++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x82Test.cs
@@ -0,0 +1,113 @@
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JTNE.Protocol.Extensions;
+using System.Linq;
+
+namespace JTNE.Protocol.Test.MessageBody
+{
+    public class JTNE_0x82Test
+    {
+        [Fact]
+        public void Test1()
+        {
+            JTNE_0x82 jTNE_0X82 = new JTNE_0x82();
+            jTNE_0X82.ControlTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X82.ParamID =0x02;
+            var hex = JTNESerializer.Serialize(jTNE_0X82).ToHexString();
+            Assert.Equal("13011617373802", hex);
+        }
+
+        [Fact]
+        public void Test2()
+        {
+            var data = "13011617373802".ToHexBytes();
+            JTNE_0x82 jTNE_0X82 = JTNESerializer.Deserialize<JTNE_0x82>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X82.ControlTime);
+            Assert.Equal(0x02, jTNE_0X82.ParamID);
+        }
+
+        [Fact]
+        public void Test3()
+        {
+            JTNE_0x82 jTNE_0X82 = new JTNE_0x82();
+            jTNE_0X82.ControlTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X82.ParamID = 0x01;
+            jTNE_0X82.Parameter = new JTNE_0x82_0x01 {
+                UpgradeCommand = new Metadata.UpgradeCommand {
+                  DialName="TK",
+                   DialUserName="TKUser",
+                    DialUserPwd="TKPwd",
+                     FirmwareVersion="1.0",
+                      HardwareVersion="2.0",
+                       ManufacturerID= "ManufacturerName",
+                        ServerAddress="http://www.baidu.com:8383",
+                          ServerUrl= JTNEGlobalConfigs.Instance.Encoding.GetBytes("bd.com"),
+                           ServerPort=8383,
+                            ConnectTimeLimit=10
+                }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X82).ToHexString();
+            Assert.Equal("13011617373801687474703A2F2F7777772E62616964752E636F6D3A383338333B544B3B544B557365723B544B5077643B62642E636F6D3B383338333B4D616E7566616374757265724E616D653B322E303B312E303B3130", hex);
+        }
+
+        [Fact]
+        public void Test4()
+        {
+            var data = "13011617373801687474703A2F2F7777772E62616964752E636F6D3A383338333B544B3B544B557365723B544B5077643B62642E636F6D3B383338333B4D616E7566616374757265724E616D653B322E303B312E303B3130".ToHexBytes();
+            JTNE_0x82 jTNE_0X82 = JTNESerializer.Deserialize<JTNE_0x82>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X82.ControlTime);
+            Assert.Equal(0x01, jTNE_0X82.ParamID);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new JTNE_0x82_0x01
+            {
+                UpgradeCommand = new Metadata.UpgradeCommand
+                {
+                    DialName = "TK",
+                    DialUserName = "TKUser",
+                    DialUserPwd = "TKPwd",
+                    FirmwareVersion = "1.0",
+                    HardwareVersion = "2.0",
+                    ManufacturerID = "ManufacturerName",
+                    ServerAddress = "http://www.baidu.com:8383",
+                    ServerUrl = JTNEGlobalConfigs.Instance.Encoding.GetBytes("bd.com"),
+                    ServerPort = 8383,
+                    ConnectTimeLimit = 10
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X82.Parameter));
+        }
+
+        [Fact]
+        public void Test5()
+        {
+            JTNE_0x82 jTNE_0X82 = new JTNE_0x82();
+            jTNE_0X82.ControlTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X82.ParamID = 0x06;
+            jTNE_0X82.Parameter = new JTNE_0x82_0x06
+            {
+              AlarmCommand=new Metadata.AlarmCommand {
+                   AlarmLevel= Enums.JTNEAlarmLevel.一级报警
+              }
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X82).ToHexString();
+            Assert.Equal("1301161737380601", hex);
+        }
+
+        [Fact]
+        public void Test6()
+        {
+            var data = "1301161737380601".ToHexBytes();
+            JTNE_0x82 jTNE_0X82 = JTNESerializer.Deserialize<JTNE_0x82>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X82.ControlTime);
+            Assert.Equal(0x06, jTNE_0X82.ParamID);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new JTNE_0x82_0x06
+            {
+                AlarmCommand = new Metadata.AlarmCommand
+                {
+                    AlarmLevel = Enums.JTNEAlarmLevel.一级报警
+                }
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0X82.Parameter));
+        }
+    }
+}
diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x82_CustomBodyTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x82_CustomBodyTest.cs
new file mode 100644
index 0000000..1390b81
--- /dev/null
+++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x82_CustomBodyTest.cs
@@ -0,0 +1,68 @@
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.Formatters;
+using JTNE.Protocol.Attributes;
+
+namespace JTNE.Protocol.Test.MessageBody
+{
+    public class JTNE_0x82_CustomBodyTest
+    {
+        [Fact]
+        public void Test1()
+        {
+            JTNEGlobalConfigs.Instance.Register_JTNE0x82CustomBody(0x80, typeof(JTNE_0x82_0x80));
+
+            JTNE_0x82 jTNE_0X82 = new JTNE_0x82();
+            jTNE_0X82.ControlTime = DateTime.Parse("2019-01-22 23:55:56");
+            jTNE_0X82.ParamID = 0x80;
+            jTNE_0X82.Parameter = new JTNE_0x82_0x80
+            {
+                ParamValue=100
+            };
+            var hex = JTNESerializer.Serialize(jTNE_0X82).ToHexString();
+            Assert.Equal("1301161737388064", hex);
+        }
+        [Fact]
+        public void Test1_1()
+        {
+            JTNEGlobalConfigs.Instance.Register_JTNE0x82CustomBody(0x80, typeof(JTNE_0x82_0x80));
+
+            var data = "1301161737388064".ToHexBytes();
+            JTNE_0x82 jTNE_0x82 = JTNESerializer.Deserialize<JTNE_0x82>(data);
+            Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0x82.ControlTime);
+            Assert.Equal(Newtonsoft.Json.JsonConvert.SerializeObject(new JTNE_0x82_0x80
+            {
+                ParamValue = 100
+            }), Newtonsoft.Json.JsonConvert.SerializeObject(jTNE_0x82.Parameter));
+        }
+    }
+    [JTNEFormatter(typeof(JTNE_0x82_0x80Formatter))]
+    public class JTNE_0x82_0x80 : JTNE_0x82_Body
+    {
+        public override byte ParamId { get; set; }= 0x80;
+        public override byte ParamLength { get; set; } = 1;
+        public byte ParamValue { get; set; }
+    }
+
+    public class JTNE_0x82_0x80Formatter : IJTNEFormatter<JTNE_0x82_0x80>
+    {
+        public JTNE_0x82_0x80 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x80 jTNE_0x82_0x80 = new JTNE_0x82_0x80();
+            jTNE_0x82_0x80.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x82_0x80;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x80 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Enums/JTNEAlarmLevel.cs b/src/JTNE.Protocol/Enums/JTNEAlarmLevel.cs
new file mode 100644
index 0000000..1ef37a9
--- /dev/null
+++ b/src/JTNE.Protocol/Enums/JTNEAlarmLevel.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Enums
+{
+    /// <summary>
+    /// 报警等级
+    /// </summary>
+    public enum JTNEAlarmLevel : byte
+    {
+        无报警 = 0x00,
+        一级报警 = 0x01,
+        二级报警 = 0x02,
+        三级报警 = 0x03,
+        无效数据 = 0xFF,
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x01Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x01Formatter.cs
new file mode 100644
index 0000000..65c08fd
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x01Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x01Formatter : IJTNEFormatter<JTNE_0x80Reply_0x01>
+    {
+        public JTNE_0x80Reply_0x01 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x01 jTNE_0x80Reply_0x01 = new JTNE_0x80Reply_0x01();
+            jTNE_0x80Reply_0x01.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x01;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x01 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x02Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x02Formatter.cs
new file mode 100644
index 0000000..2ea9489
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x02Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x02Formatter : IJTNEFormatter<JTNE_0x80Reply_0x02>
+    {
+        public JTNE_0x80Reply_0x02 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x02 jTNE_0x80Reply_0x02 = new JTNE_0x80Reply_0x02();
+            jTNE_0x80Reply_0x02.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x02;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x02 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x03Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x03Formatter.cs
new file mode 100644
index 0000000..e5c321d
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x03Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x03Formatter : IJTNEFormatter<JTNE_0x80Reply_0x03>
+    {
+        public JTNE_0x80Reply_0x03 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x03 jTNE_0x80Reply_0x03 = new JTNE_0x80Reply_0x03();
+            jTNE_0x80Reply_0x03.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x03;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x03 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x04Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x04Formatter.cs
new file mode 100644
index 0000000..c13ed48
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x04Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x04Formatter : IJTNEFormatter<JTNE_0x80Reply_0x04>
+    {
+        public JTNE_0x80Reply_0x04 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x04 jTNE_0x80Reply_0x04 = new JTNE_0x80Reply_0x04();
+            jTNE_0x80Reply_0x04.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);        
+            readSize = offset;
+            return jTNE_0x80Reply_0x04;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x04 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x05Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x05Formatter.cs
new file mode 100644
index 0000000..d2cc1a0
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x05Formatter.cs
@@ -0,0 +1,27 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x05Formatter : IJTNEFormatter<JTNE_0x80Reply_0x05>
+    {
+        public JTNE_0x80Reply_0x05 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x05 jTNE_0x80Reply_0x05 = new JTNE_0x80Reply_0x05();
+            jTNE_0x80Reply_0x05.ParamValue = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset);
+            jTNE_0x80Reply_0x05.ParamLength = (byte)bytes.Length;
+            readSize = offset;
+            return jTNE_0x80Reply_0x05;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x05 value)
+        {
+            offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x06Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x06Formatter.cs
new file mode 100644
index 0000000..94a9e3c
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x06Formatter.cs
@@ -0,0 +1,27 @@
+
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x06Formatter : IJTNEFormatter<JTNE_0x80Reply_0x06>
+    {
+        public JTNE_0x80Reply_0x06 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x06 jTNE_0x80Reply_0x06 = new JTNE_0x80Reply_0x06();
+            jTNE_0x80Reply_0x06.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x06;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x06 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x07Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x07Formatter.cs
new file mode 100644
index 0000000..cd15ea6
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x07Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x07Formatter : IJTNEFormatter<JTNE_0x80Reply_0x07>
+    {
+        public JTNE_0x80Reply_0x07 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x07 jTNE_0x80Reply_0x07 = new JTNE_0x80Reply_0x07();
+            jTNE_0x80Reply_0x07.ParamValue = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, jTNE_0x80Reply_0x07.ParamLength);
+            readSize = offset;
+            return jTNE_0x80Reply_0x07;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x07 value)
+        {
+            offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.ParamValue,value.ParamLength);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x08Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x08Formatter.cs
new file mode 100644
index 0000000..5876b42
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x08Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x08Formatter : IJTNEFormatter<JTNE_0x80Reply_0x08>
+    {
+        public JTNE_0x80Reply_0x08 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x08 jTNE_0x80Reply_0x08 = new JTNE_0x80Reply_0x08();
+            jTNE_0x80Reply_0x08.ParamValue = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, jTNE_0x80Reply_0x08.ParamLength);
+            readSize = offset;
+            return jTNE_0x80Reply_0x08;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x08 value)
+        {
+            offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.ParamValue,value.ParamLength);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x09Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x09Formatter.cs
new file mode 100644
index 0000000..aaca7ed
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x09Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x09Formatter : IJTNEFormatter<JTNE_0x80Reply_0x09>
+    {
+        public JTNE_0x80Reply_0x09 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x09 jTNE_0x80Reply_0x09 = new JTNE_0x80Reply_0x09();
+            jTNE_0x80Reply_0x09.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x09;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x09 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset,value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0AFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0AFormatter.cs
new file mode 100644
index 0000000..54b3ced
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0AFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x0AFormatter : IJTNEFormatter<JTNE_0x80Reply_0x0A>
+    {
+        public JTNE_0x80Reply_0x0A Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x0A jTNE_0x80Reply_0x0A = new JTNE_0x80Reply_0x0A();
+            jTNE_0x80Reply_0x0A.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x0A;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x0A value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0BFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0BFormatter.cs
new file mode 100644
index 0000000..851ebdf
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0BFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x0BFormatter : IJTNEFormatter<JTNE_0x80Reply_0x0B>
+    {
+        public JTNE_0x80Reply_0x0B Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x0B jTNE_0x80Reply_0x0B = new JTNE_0x80Reply_0x0B();
+            jTNE_0x80Reply_0x0B.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x0B;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x0B value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0CFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0CFormatter.cs
new file mode 100644
index 0000000..b5b5938
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0CFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x0CFormatter : IJTNEFormatter<JTNE_0x80Reply_0x0C>
+    {
+        public JTNE_0x80Reply_0x0C Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x0C jTNE_0x80Reply_0x0C = new JTNE_0x80Reply_0x0C();
+            jTNE_0x80Reply_0x0C.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x0C;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x0C value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset,value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0DFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0DFormatter.cs
new file mode 100644
index 0000000..15a9a91
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0DFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x0DFormatter : IJTNEFormatter<JTNE_0x80Reply_0x0D>
+    {
+        public JTNE_0x80Reply_0x0D Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x0D jTNE_0x80Reply_0x0D = new JTNE_0x80Reply_0x0D();
+            jTNE_0x80Reply_0x0D.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x0D;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x0D value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0EFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0EFormatter.cs
new file mode 100644
index 0000000..b38eb0e
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0EFormatter.cs
@@ -0,0 +1,27 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x0EFormatter : IJTNEFormatter<JTNE_0x80Reply_0x0E>
+    {
+        public JTNE_0x80Reply_0x0E Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x0E jTNE_0x80Reply_0x0E= new JTNE_0x80Reply_0x0E();
+            jTNE_0x80Reply_0x0E.ParamValue = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset);
+            jTNE_0x80Reply_0x0E.ParamLength = (byte)bytes.Length;
+            readSize = offset;
+            return jTNE_0x80Reply_0x0E;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x0E value)
+        {
+            offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0FFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0FFormatter.cs
new file mode 100644
index 0000000..b737598
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x0FFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x0FFormatter : IJTNEFormatter<JTNE_0x80Reply_0x0F>
+    {
+        public JTNE_0x80Reply_0x0F Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x0F jTNE_0x80Reply_0x0F = new JTNE_0x80Reply_0x0F();
+            jTNE_0x80Reply_0x0F.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x0F;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x0F value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x10Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x10Formatter.cs
new file mode 100644
index 0000000..73ea999
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_0x10Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_0x10Formatter : IJTNEFormatter<JTNE_0x80Reply_0x10>
+    {
+        public JTNE_0x80Reply_0x10 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply_0x10 jTNE_0x80Reply_0x10 = new JTNE_0x80Reply_0x10();
+            jTNE_0x80Reply_0x10.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x80Reply_0x10;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply_0x10 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset,value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_Formatter.cs
new file mode 100644
index 0000000..e81a9d7
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80Reply_Formatter.cs
@@ -0,0 +1,62 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80Reply_Formatter : IJTNEFormatter<JTNE_0x80Reply>
+    {
+        public JTNE_0x80Reply Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80Reply jTNE_0x80Reply = new JTNE_0x80Reply();
+            jTNE_0x80Reply.ReplyTime = JTNEBinaryExtensions.ReadDateTime6Little(bytes, ref offset);
+            jTNE_0x80Reply.ParamNum = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            for (int i = 0; i < jTNE_0x80Reply.ParamNum; i++)
+            {
+                var paramId = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);//参数ID         
+                int readSubBodySize = 0;
+                if (JTNE_0x80Reply_Body.JTNE_0x80ReplyMethod.TryGetValue(paramId, out Type type))
+                {
+                    ReadOnlySpan<byte> readOnlySpan = new ReadOnlySpan<byte>();
+                    if (JTNE_0x80Reply_Body.JTNE_0x80ReplyLengthOfADependOnValueOfB.TryGetValue(paramId, out byte dependOnParamId)) {
+                        var length = jTNE_0x80Reply.ParamList.FirstOrDefault(m => m.ParamId== dependOnParamId).ParamLength;
+                        int tempOffset = 0;
+                        int lengthVal = JTNEBinaryExtensions.ReadByteLittle(bytes.Slice(offset - length - 1, length), ref tempOffset);
+                        readOnlySpan = bytes.Slice(offset, lengthVal);
+                    }
+                    else {
+                        readOnlySpan = bytes.Slice(offset);
+                    }
+                    if (jTNE_0x80Reply.ParamList != null)
+                    {
+                        jTNE_0x80Reply.ParamList.Add(JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(JTNEFormatterExtensions.GetFormatter(type), readOnlySpan, out readSubBodySize));
+                    }
+                    else
+                    {
+                        jTNE_0x80Reply.ParamList = new List<JTNE_0x80Reply_Body> { JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(JTNEFormatterExtensions.GetFormatter(type), readOnlySpan, out readSubBodySize) };
+                    }
+                }
+                offset = offset + readSubBodySize;
+            }
+            readSize = offset;
+            return jTNE_0x80Reply;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80Reply value)
+        {
+            offset += JTNEBinaryExtensions.WriteDateTime6Little(bytes, offset, value.ReplyTime);
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamNum);
+            foreach (var item in value.ParamList)
+            {
+                offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, item.ParamId);
+                object obj = JTNEFormatterExtensions.GetFormatter(item.GetType());
+                offset = JTNEFormatterResolverExtensions.JTNEDynamicSerialize(obj, ref bytes, offset, item);
+            }
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80_Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80_Formatter.cs
new file mode 100644
index 0000000..43426ca
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x80_Formatter.cs
@@ -0,0 +1,30 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x80_Formatter : IJTNEFormatter<JTNE_0x80>
+    {
+        public JTNE_0x80 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x80 jTNE_0X80 = new JTNE_0x80();
+            jTNE_0X80.QueryTime = JTNEBinaryExtensions.ReadDateTime6Little(bytes, ref offset);
+            jTNE_0X80.ParamNum = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            jTNE_0X80.ParamList = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset, jTNE_0X80.ParamNum);
+            readSize = offset;
+            return jTNE_0X80;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x80 value)
+        {
+            offset += JTNEBinaryExtensions.WriteDateTime6Little(bytes, offset, value.QueryTime);
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamNum);
+            offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset,value.ParamList);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x01Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x01Formatter.cs
new file mode 100644
index 0000000..2fbc738
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x01Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x01Formatter : IJTNEFormatter<JTNE_0x81_0x01>
+    {
+        public JTNE_0x81_0x01 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x01 jTNE_0x81_0x01 = new JTNE_0x81_0x01();
+            jTNE_0x81_0x01.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x01;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x01 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x02Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x02Formatter.cs
new file mode 100644
index 0000000..85cf524
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x02Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x02Formatter : IJTNEFormatter<JTNE_0x81_0x02>
+    {
+        public JTNE_0x81_0x02 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x02 jTNE_0x81_0x02= new JTNE_0x81_0x02();
+            jTNE_0x81_0x02.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x02;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x02 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x03Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x03Formatter.cs
new file mode 100644
index 0000000..d276c3b
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x03Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x03Formatter : IJTNEFormatter<JTNE_0x81_0x03>
+    {
+        public JTNE_0x81_0x03 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x03 jTNE_0x81_0x03= new JTNE_0x81_0x03();
+            jTNE_0x81_0x03.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x03;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x03 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x04Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x04Formatter.cs
new file mode 100644
index 0000000..d2c6158
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x04Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x04Formatter : IJTNEFormatter<JTNE_0x81_0x04>
+    {
+        public JTNE_0x81_0x04 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x04 jTNE_0x81_0x04 = new JTNE_0x81_0x04();
+            jTNE_0x81_0x04.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);        
+            readSize = offset;
+            return jTNE_0x81_0x04;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x04 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x05Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x05Formatter.cs
new file mode 100644
index 0000000..4b9aad0
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x05Formatter.cs
@@ -0,0 +1,27 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x05Formatter : IJTNEFormatter<JTNE_0x81_0x05>
+    {
+        public JTNE_0x81_0x05 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x05 jTNE_0x81_0x05 = new JTNE_0x81_0x05();
+            jTNE_0x81_0x05.ParamValue = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset);
+            jTNE_0x81_0x05.ParamLength = (byte)bytes.Length;
+            readSize = offset;
+            return jTNE_0x81_0x05;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x05 value)
+        {
+            offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x06Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x06Formatter.cs
new file mode 100644
index 0000000..7651866
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x06Formatter.cs
@@ -0,0 +1,27 @@
+
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x06Formatter : IJTNEFormatter<JTNE_0x81_0x06>
+    {
+        public JTNE_0x81_0x06 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x06 jTNE_0x81_0x06 = new JTNE_0x81_0x06();
+            jTNE_0x81_0x06.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x06;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x06 value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x07Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x07Formatter.cs
new file mode 100644
index 0000000..5981159
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x07Formatter.cs
@@ -0,0 +1,28 @@
+
+
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x07Formatter : IJTNEFormatter<JTNE_0x81_0x07>
+    {
+        public JTNE_0x81_0x07 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x07 jTNE_0x81_0x07 = new JTNE_0x81_0x07();
+            jTNE_0x81_0x07.ParamValue = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, jTNE_0x81_0x07.ParamLength);
+            readSize = offset;
+            return jTNE_0x81_0x07;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x07 value)
+        {
+            offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.ParamValue,value.ParamLength);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x08Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x08Formatter.cs
new file mode 100644
index 0000000..612c252
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x08Formatter.cs
@@ -0,0 +1,29 @@
+
+
+
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x08Formatter : IJTNEFormatter<JTNE_0x81_0x08>
+    {
+        public JTNE_0x81_0x08 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x08 jTNE_0x81_0x08 = new JTNE_0x81_0x08();
+            jTNE_0x81_0x08.ParamValue = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, jTNE_0x81_0x08.ParamLength);
+            readSize = offset;
+            return jTNE_0x81_0x08;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x08 value)
+        {
+            offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.ParamValue,value.ParamLength);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x09Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x09Formatter.cs
new file mode 100644
index 0000000..8fab31e
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x09Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x09Formatter : IJTNEFormatter<JTNE_0x81_0x09>
+    {
+        public JTNE_0x81_0x09 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x09 jTNE_0x81_0x09 = new JTNE_0x81_0x09();
+            jTNE_0x81_0x09.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x09;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x09 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset,value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0AFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0AFormatter.cs
new file mode 100644
index 0000000..92c9b8c
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0AFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x0AFormatter : IJTNEFormatter<JTNE_0x81_0x0A>
+    {
+        public JTNE_0x81_0x0A Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x0A jTNE_0x81_0x0A = new JTNE_0x81_0x0A();
+            jTNE_0x81_0x0A.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x0A;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x0A value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0BFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0BFormatter.cs
new file mode 100644
index 0000000..be65908
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0BFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x0BFormatter : IJTNEFormatter<JTNE_0x81_0x0B>
+    {
+        public JTNE_0x81_0x0B Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x0B jTNE_0x81_0x0B = new JTNE_0x81_0x0B();
+            jTNE_0x81_0x0B.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x0B;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x0B value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0CFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0CFormatter.cs
new file mode 100644
index 0000000..5f6c25c
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0CFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x0CFormatter : IJTNEFormatter<JTNE_0x81_0x0C>
+    {
+        public JTNE_0x81_0x0C Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x0C jTNE_0x81_0x0C = new JTNE_0x81_0x0C();
+            jTNE_0x81_0x0C.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x0C;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x0C value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset,value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0DFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0DFormatter.cs
new file mode 100644
index 0000000..6b658dd
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0DFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x0DFormatter : IJTNEFormatter<JTNE_0x81_0x0D>
+    {
+        public JTNE_0x81_0x0D Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x0D jTNE_0x81_0x0D = new JTNE_0x81_0x0D();
+            jTNE_0x81_0x0D.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x0D;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x0D value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0EFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0EFormatter.cs
new file mode 100644
index 0000000..e6ecde8
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0EFormatter.cs
@@ -0,0 +1,27 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x0EFormatter : IJTNEFormatter<JTNE_0x81_0x0E>
+    {
+        public JTNE_0x81_0x0E Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x0E jTNE_0x81_0x0E= new JTNE_0x81_0x0E();
+            jTNE_0x81_0x0E.ParamValue = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset);
+            jTNE_0x81_0x0E.ParamLength = (byte)bytes.Length;
+            readSize = offset;
+            return jTNE_0x81_0x0E;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x0E value)
+        {
+            offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0FFormatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0FFormatter.cs
new file mode 100644
index 0000000..0c616aa
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x0FFormatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x0FFormatter : IJTNEFormatter<JTNE_0x81_0x0F>
+    {
+        public JTNE_0x81_0x0F Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x0F jTNE_0x81_0x0F = new JTNE_0x81_0x0F();
+            jTNE_0x81_0x0F.ParamValue = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x0F;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x0F value)
+        {
+            offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x10Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x10Formatter.cs
new file mode 100644
index 0000000..12eab94
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_0x10Formatter.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_0x10Formatter : IJTNEFormatter<JTNE_0x81_0x10>
+    {
+        public JTNE_0x81_0x10 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81_0x10 jTNE_0x81_0x10 = new JTNE_0x81_0x10();
+            jTNE_0x81_0x10.ParamValue = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x81_0x10;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81_0x10 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset,value.ParamValue);
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_Formatter.cs
new file mode 100644
index 0000000..0c60b9d
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x81_Formatter.cs
@@ -0,0 +1,62 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x81_Formatter : IJTNEFormatter<JTNE_0x81>
+    {
+        public JTNE_0x81 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x81 jTNE_0X81 = new JTNE_0x81();
+            jTNE_0X81.SetTime = JTNEBinaryExtensions.ReadDateTime6Little(bytes, ref offset);
+            jTNE_0X81.ParamNum = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            for (int i = 0; i < jTNE_0X81.ParamNum; i++)
+            {
+                var paramId = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);//参数ID         
+                int readSubBodySize = 0;
+                if (JTNE_0x81_Body.JTNE_0x81Method.TryGetValue(paramId, out Type type))
+                {
+                    ReadOnlySpan<byte> readOnlySpan = new ReadOnlySpan<byte>();
+                    if (JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.TryGetValue(paramId, out byte dependOnParamId)) {
+                        var length = jTNE_0X81.ParamList.FirstOrDefault(m => m.ParamId == dependOnParamId).ParamLength;
+                        int tempOffset = 0;
+                        int lengthVal = JTNEBinaryExtensions.ReadByteLittle(bytes.Slice(offset - length - 1, length), ref tempOffset);
+                        readOnlySpan = bytes.Slice(offset, lengthVal);
+                    }
+                    else {
+                        readOnlySpan = bytes.Slice(offset);
+                    }
+                    if (jTNE_0X81.ParamList != null)
+                    {
+                        jTNE_0X81.ParamList.Add(JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(JTNEFormatterExtensions.GetFormatter(type), readOnlySpan, out readSubBodySize));
+                    }
+                    else
+                    {
+                        jTNE_0X81.ParamList = new List<JTNE_0x81_Body> { JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(JTNEFormatterExtensions.GetFormatter(type), readOnlySpan, out readSubBodySize) };
+                    }
+                }
+                offset = offset + readSubBodySize;
+            }
+            readSize = offset;
+            return jTNE_0X81;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x81 value)
+        {
+            offset += JTNEBinaryExtensions.WriteDateTime6Little(bytes, offset, value.SetTime);
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamNum);
+            foreach (var item in value.ParamList)
+            {
+                offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, item.ParamId);
+                object obj = JTNEFormatterExtensions.GetFormatter(item.GetType());
+                offset = JTNEFormatterResolverExtensions.JTNEDynamicSerialize(obj, ref bytes, offset, item);
+            }
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x00Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x00Formatter.cs
new file mode 100644
index 0000000..4da73eb
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x00Formatter.cs
@@ -0,0 +1,27 @@
+using JTNE.Protocol.Enums;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x00Formatter : IJTNEFormatter<JTNE_0x82_0x00>
+    {
+        public JTNE_0x82_0x00 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x00 jTNE_0x82_0x00 = new JTNE_0x82_0x00();
+            jTNE_0x82_0x00.ParamId=JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x82_0x00;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x00 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamId);
+            return offset;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x01Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x01Formatter.cs
new file mode 100644
index 0000000..c05a62d
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x01Formatter.cs
@@ -0,0 +1,44 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x01Formatter : IJTNEFormatter<JTNE_0x82_0x01>
+    {
+        public JTNE_0x82_0x01 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x01 jTNE_0x82_0x01 = new JTNE_0x82_0x01();
+            string res = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset);
+            string[] upgradeCommands = res.Split(';');
+            jTNE_0x82_0x01.UpgradeCommand = new Metadata.UpgradeCommand();
+            jTNE_0x82_0x01.UpgradeCommand.ServerAddress = upgradeCommands[0];
+            jTNE_0x82_0x01.UpgradeCommand.DialName = upgradeCommands[1];
+            jTNE_0x82_0x01.UpgradeCommand.DialUserName = upgradeCommands[2];
+            jTNE_0x82_0x01.UpgradeCommand.DialUserPwd = upgradeCommands[3];
+            jTNE_0x82_0x01.UpgradeCommand.ServerUrl = JTNEGlobalConfigs.Instance.Encoding.GetBytes(upgradeCommands[4]);
+            if (ushort.TryParse(upgradeCommands[5], out ushort serverPort))
+            {
+                jTNE_0x82_0x01.UpgradeCommand.ServerPort = serverPort;
+            }
+            jTNE_0x82_0x01.UpgradeCommand.ManufacturerID = upgradeCommands[6];
+            jTNE_0x82_0x01.UpgradeCommand.HardwareVersion = upgradeCommands[7];
+            jTNE_0x82_0x01.UpgradeCommand.FirmwareVersion = upgradeCommands[8];   
+            if (ushort.TryParse(upgradeCommands[9], out ushort connectTimeLimit)){
+                jTNE_0x82_0x01.UpgradeCommand.ConnectTimeLimit = connectTimeLimit;
+            }
+            readSize = offset;
+            return jTNE_0x82_0x01;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x01 value)
+        {
+            offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.UpgradeCommand.ToString());
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x02Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x02Formatter.cs
new file mode 100644
index 0000000..1cfc9fe
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x02Formatter.cs
@@ -0,0 +1,27 @@
+using JTNE.Protocol.Enums;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x02Formatter : IJTNEFormatter<JTNE_0x82_0x02>
+    {
+        public JTNE_0x82_0x02 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x02 jTNE_0x82_0x02 = new JTNE_0x82_0x02();
+            jTNE_0x82_0x02.ParamId=JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x82_0x02;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x02 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamId);
+            return offset;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x03Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x03Formatter.cs
new file mode 100644
index 0000000..61a4b9d
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x03Formatter.cs
@@ -0,0 +1,27 @@
+using JTNE.Protocol.Enums;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x03Formatter : IJTNEFormatter<JTNE_0x82_0x03>
+    {
+        public JTNE_0x82_0x03 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x03 jTNE_0x82_0x03 = new JTNE_0x82_0x03();
+            jTNE_0x82_0x03.ParamId= JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+            readSize = offset;
+            return jTNE_0x82_0x03;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x03 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamId);
+            return offset;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x04Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x04Formatter.cs
new file mode 100644
index 0000000..7451876
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x04Formatter.cs
@@ -0,0 +1,28 @@
+using JTNE.Protocol.Enums;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x04Formatter : IJTNEFormatter<JTNE_0x82_0x04>
+    {
+        public JTNE_0x82_0x04 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x04 jTNE_0x82_0x04 = new JTNE_0x82_0x04();
+            jTNE_0x82_0x04.ParamId=JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+
+            readSize = offset;
+            return jTNE_0x82_0x04;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x04 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamId);
+            return offset;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x05Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x05Formatter.cs
new file mode 100644
index 0000000..ee1e455
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x05Formatter.cs
@@ -0,0 +1,28 @@
+using JTNE.Protocol.Enums;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x05Formatter : IJTNEFormatter<JTNE_0x82_0x05>
+    {
+        public JTNE_0x82_0x05 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x05 jTNE_0x82_0x05 = new JTNE_0x82_0x05();
+            jTNE_0x82_0x05.ParamId=JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+
+            readSize = offset;
+            return jTNE_0x82_0x05;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x05 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamId);
+            return offset;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x06Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x06Formatter.cs
new file mode 100644
index 0000000..8ea1459
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x06Formatter.cs
@@ -0,0 +1,32 @@
+using JTNE.Protocol.Enums;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x06Formatter : IJTNEFormatter<JTNE_0x82_0x06>
+    {
+        public JTNE_0x82_0x06 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x06 jTNE_0x82_0x06 = new JTNE_0x82_0x06();
+            jTNE_0x82_0x06.AlarmCommand = new Metadata.AlarmCommand();
+            jTNE_0x82_0x06.AlarmCommand.AlarmLevel= (JTNEAlarmLevel)JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+
+            readSize = offset;
+            return jTNE_0x82_0x06;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x06 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.AlarmCommand.AlarmLevel.ToByteValue());
+            //if (!string.IsNullOrEmpty(value.AlarmCommand.Alarm)) {
+            //    offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.AlarmCommand.Alarm);
+            //}
+            return offset;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x07Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x07Formatter.cs
new file mode 100644
index 0000000..785bf5b
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_0x07Formatter.cs
@@ -0,0 +1,28 @@
+using JTNE.Protocol.Enums;
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_0x07Formatter : IJTNEFormatter<JTNE_0x82_0x07>
+    {
+        public JTNE_0x82_0x07 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82_0x07 jTNE_0x82_0x07 = new JTNE_0x82_0x07();
+            jTNE_0x82_0x07.ParamId=JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
+
+            readSize = offset;
+            return jTNE_0x82_0x07;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82_0x07 value)
+        {
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamId);
+            return offset;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_Formatter.cs
new file mode 100644
index 0000000..838a5fb
--- /dev/null
+++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x82_Formatter.cs
@@ -0,0 +1,39 @@
+using JTNE.Protocol.Extensions;
+using JTNE.Protocol.MessageBody;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Formatters.MessageBodyFormatters
+{
+    public class JTNE_0x82_Formatter : IJTNEFormatter<JTNE_0x82>
+    {
+        public JTNE_0x82 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
+        {
+            int offset = 0;
+            JTNE_0x82 jTNE_0x82 = new JTNE_0x82();
+            jTNE_0x82.ControlTime = JTNEBinaryExtensions.ReadDateTime6Little(bytes, ref offset);
+            jTNE_0x82.ParamID = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);//参数ID         
+
+            if (JTNE_0x82_Body.JTNE_0x82Method.TryGetValue(jTNE_0x82.ParamID, out Type type))
+            {
+                int readSubBodySize = 0;
+                jTNE_0x82.Parameter = JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(JTNEFormatterExtensions.GetFormatter(type), bytes.Slice(offset), out readSubBodySize);
+                offset = offset + readSubBodySize;
+            }
+            readSize = offset;
+            return jTNE_0x82;
+        }
+
+        public int Serialize(ref byte[] bytes, int offset, JTNE_0x82 value)
+        {
+            offset += JTNEBinaryExtensions.WriteDateTime6Little(bytes, offset, value.ControlTime);
+            offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.ParamID);
+            if (JTNE_0x82_Body.JTNE_0x82Method.TryGetValue(value.ParamID, out Type type))
+            {
+                offset =JTNEFormatterResolverExtensions.JTNEDynamicSerialize(JTNEFormatterExtensions.GetFormatter(type),ref bytes, offset, value.Parameter);
+            }
+            return offset;
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/JTNE.Protocol.csproj b/src/JTNE.Protocol/JTNE.Protocol.csproj
index 30dcbfb..707dcf4 100644
--- a/src/JTNE.Protocol/JTNE.Protocol.csproj
+++ b/src/JTNE.Protocol/JTNE.Protocol.csproj
@@ -25,6 +25,15 @@
     <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\JTNE.Protocol.xml</DocumentationFile>
   </PropertyGroup>
 
+  <ItemGroup>
+    <Compile Remove="Formatters\MessageBodyFormatters\JTNE_0x82_0x00Formatter.cs" />
+    <Compile Remove="Formatters\MessageBodyFormatters\JTNE_0x82_0x02Formatter.cs" />
+    <Compile Remove="Formatters\MessageBodyFormatters\JTNE_0x82_0x03Formatter.cs" />
+    <Compile Remove="Formatters\MessageBodyFormatters\JTNE_0x82_0x04Formatter.cs" />
+    <Compile Remove="Formatters\MessageBodyFormatters\JTNE_0x82_0x05Formatter.cs" />
+    <Compile Remove="Formatters\MessageBodyFormatters\JTNE_0x82_0x07Formatter.cs" />
+  </ItemGroup>
+
   <ItemGroup>
     <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
     <PackageReference Include="System.Buffers" Version="4.5.0" />
diff --git a/src/JTNE.Protocol/JTNEGlobalConfigs.cs b/src/JTNE.Protocol/JTNEGlobalConfigs.cs
index 46f741e..83d3567 100644
--- a/src/JTNE.Protocol/JTNEGlobalConfigs.cs
+++ b/src/JTNE.Protocol/JTNEGlobalConfigs.cs
@@ -101,6 +101,76 @@ namespace JTNE.Protocol
             return instance.Value;
         }
         /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="typeCode">自定义类型编码</param>
+        /// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
+        /// <returns></returns>
+        public JTNEGlobalConfigs Register_JTNE0x81CustomBody(byte typeCode, Type type)
+        {
+            if (!JTNE_0x81_Body.JTNE_0x81Method.ContainsKey(typeCode))
+            {
+                JTNE_0x81_Body.JTNE_0x81Method.Add(typeCode, type);
+            }
+            return instance.Value;
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="typeCode">自定义类型编码</param>
+        /// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
+        /// <returns></returns>
+        public JTNEGlobalConfigs Register_JTNE0x81CustomDepenedBody(byte DependerParamId, byte DependedParamId)
+        {
+            if (!JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.ContainsKey(DependerParamId))
+            {
+                JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.Add(DependerParamId, DependedParamId);
+            }
+            return instance.Value;
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="typeCode">自定义类型编码</param>
+        /// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x80Reply_Body</param>
+        /// <returns></returns>
+        public JTNEGlobalConfigs Register_JTNE0x80ReplyCustomBody(byte typeCode, Type type)
+        {
+            if (!JTNE_0x80Reply_Body.JTNE_0x80ReplyMethod.ContainsKey(typeCode))
+            {
+                JTNE_0x80Reply_Body.JTNE_0x80ReplyMethod.Add(typeCode, type);
+            }
+            return instance.Value;
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="typeCode">自定义类型编码</param>
+        /// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x80Reply_Body</param>
+        /// <returns></returns>
+        public JTNEGlobalConfigs Register_JTNE0x80ReplyCustomDepenedBody(byte DependerParamId, byte DependedParamId)
+        {
+            if (!JTNE_0x80Reply_Body.JTNE_0x80ReplyLengthOfADependOnValueOfB.ContainsKey(DependerParamId))
+            {
+                JTNE_0x80Reply_Body.JTNE_0x80ReplyLengthOfADependOnValueOfB.Add(DependerParamId, DependedParamId);
+            }
+            return instance.Value;
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="typeCode">自定义类型编码</param>
+        /// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
+        /// <returns></returns>
+        public JTNEGlobalConfigs Register_JTNE0x82CustomBody(byte typeCode, Type type)
+        {
+            if (!JTNE_0x82_Body.JTNE_0x82Method.ContainsKey(typeCode))
+            {
+                JTNE_0x82_Body.JTNE_0x82Method.Add(typeCode, type);
+            }
+            return instance.Value;
+        }
+        /// <summary>
         /// 设置跳过校验码
         /// 场景:测试的时候,可能需要手动改数据,所以测试的时候有用
         /// </summary>
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80.cs
new file mode 100644
index 0000000..6df04af
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80.cs
@@ -0,0 +1,28 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 参数查询
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80_Formatter))]
+    public class JTNE_0x80 : JTNEBodies
+    {
+        /// <summary>
+        /// 查询时间
+        /// </summary>
+        public DateTime QueryTime { get; set; }
+        /// <summary>
+        /// 参数总数
+        /// </summary>
+        public byte ParamNum { get; set; }
+        /// <summary>
+        /// 参数列表
+        /// </summary>
+        public byte[] ParamList { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply.cs
new file mode 100644
index 0000000..9c5dd08
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply.cs
@@ -0,0 +1,28 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 参数查询响应
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_Formatter))]
+    public class JTNE_0x80Reply : JTNEBodies
+    {
+        /// <summary>
+        /// 响应查询时间
+        /// </summary>
+        public DateTime ReplyTime { get; set; }
+        /// <summary>
+        /// 参数总数
+        /// </summary>
+        public byte ParamNum { get; set; }
+        /// <summary>
+        /// 参数列表
+        /// </summary>
+        public List<JTNE_0x80Reply_Body> ParamList { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x01.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x01.cs
new file mode 100644
index 0000000..eb4f1b0
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x01.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 车载终端本地存储时间周期,有效值范围:0~60 000(表示0ms~60 000ms)最小计量单元:1ms
+    /// 0x81_0x01
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x01Formatter))]
+    public class JTNE_0x80Reply_0x01: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x01;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        /// 车载终端本地存储时间周期,(表示0ms~60 000ms)最小计量单元:1ms
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x02.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x02.cs
new file mode 100644
index 0000000..9109fdb
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x02.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 正常时,信息上报时间周期,有效值范围:1~600(表示1s~600s) 最小计量单元:1s
+    /// 0x81_0x02
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x02Formatter))]
+    public class JTNE_0x80Reply_0x02: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x02;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        /// 正常时,信息上报时间周期,有效值范围:1~600(表示1s~600s) 最小计量单元:1s
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x03.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x03.cs
new file mode 100644
index 0000000..8ca4298
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x03.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 出现报警时,信息上报时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x03Formatter))]
+    public class JTNE_0x80Reply_0x03: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x03;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///出现报警时,信息上报时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x04.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x04.cs
new file mode 100644
index 0000000..32fdb0e
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x04.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///  远程服务和管理平台域名长度M
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x04Formatter))]
+    public class JTNE_0x80Reply_0x04: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x04;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        ///远程服务和管理平台域名长度M
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x05.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x05.cs
new file mode 100644
index 0000000..8c14a74
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x05.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 远程服务和管理平台域名
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x05Formatter))]
+    public class JTNE_0x80Reply_0x05: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x05;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; }
+        /// <summary>
+        ///远程服务和管理平台域名
+        /// </summary>
+        public byte[] ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x06.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x06.cs
new file mode 100644
index 0000000..1e5e31c
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x06.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 远程服务和管理平台端口,有效值范围:0~65531
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x06Formatter))]
+    public class JTNE_0x80Reply_0x06: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x06;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///远程服务和管理平台端口,有效值范围:0~65531
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x07.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x07.cs
new file mode 100644
index 0000000..724efb8
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x07.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 硬件版本,车载终端厂商自行定义
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x07Formatter))]
+    public class JTNE_0x80Reply_0x07: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x07;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 5;
+        /// <summary>
+        ///硬件版本,车载终端厂商自行定义 数据长度= 5;
+        /// </summary>
+        public string ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x08.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x08.cs
new file mode 100644
index 0000000..364e54f
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x08.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 固件版本,车载终端厂商自行定义
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x08Formatter))]
+    public class JTNE_0x80Reply_0x08: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x08;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 5;
+        /// <summary>
+        ///固件版本,车载终端厂商自行定义
+        /// </summary>
+        public string ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x09.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x09.cs
new file mode 100644
index 0000000..3385c9e
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x09.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///  车载终端心跳发送周期,有效值范围:1~240(表示1s~240s)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x09Formatter))]
+    public class JTNE_0x80Reply_0x09: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x09;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        /// 车载终端心跳发送周期,有效值范围:1~240(表示1s~240s)
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0A.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0A.cs
new file mode 100644
index 0000000..49bf2f5
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0A.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 终端应答超时时间,有效值范围:1~600(表示1s~600s)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x0AFormatter))]
+    public class JTNE_0x80Reply_0x0A: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x0A;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///终端应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0B.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0B.cs
new file mode 100644
index 0000000..c0a6fd8
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0B.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 平台应答超时时间,有效值范围:1~600(表示1s~600s)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x0BFormatter))]
+    public class JTNE_0x80Reply_0x0B: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x0B;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///平台应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0C.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0C.cs
new file mode 100644
index 0000000..90b8dff
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0C.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///   连续三次登入失败后,到下一次登入的时间间隔。有效值范围:1~240(表示1min~240min)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x0CFormatter))]
+    public class JTNE_0x80Reply_0x0C: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x0C;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        ///  连续三次登入失败后,到下一次登入的时间间隔。有效值范围:1~240(表示1min~240min)
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0D.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0D.cs
new file mode 100644
index 0000000..29b23c2
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0D.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///  公共平台域名长度N
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x0DFormatter))]
+    public class JTNE_0x80Reply_0x0D: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x0D;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        ///公共平台域名长度N
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0E.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0E.cs
new file mode 100644
index 0000000..1a4edb9
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0E.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 公共平台域名
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x0EFormatter))]
+    public class JTNE_0x80Reply_0x0E: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x0E;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; }
+        /// <summary>
+        ///公共平台域名
+        /// </summary>
+        public byte[] ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0F.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0F.cs
new file mode 100644
index 0000000..5b6ce32
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x0F.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 公共平台端口,有效值访问:0~65531
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x0FFormatter))]
+    public class JTNE_0x80Reply_0x0F: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x0F;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///公共平台端口,有效值访问:0~65531
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x10.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x10.cs
new file mode 100644
index 0000000..6972185
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_0x10.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///   是否处于抽样监测中 0x01 表示是    0x02 表示否
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x80Reply_0x10Formatter))]
+    public class JTNE_0x80Reply_0x10: JTNE_0x80Reply_Body
+    {
+        public override byte ParamId { get; set; } = 0x10;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        /// 是否处于抽样监测中 0x01 表示是    0x02 表示否
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_Body.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_Body.cs
new file mode 100644
index 0000000..0d87f8a
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x80Reply_Body.cs
@@ -0,0 +1,165 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 参数查询
+    /// </summary>
+    public abstract class  JTNE_0x80Reply_Body
+    {
+        /// <summary>
+        /// 车载终端本地存储时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+        /// 最小计量单元:1ms
+        /// 0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x01_Type = 0x01;
+        /// <summary>
+        /// 正常时,信息上报时间周期,有效值范围:1~600(表示1s~600s)
+        /// 最小计量单元:1s
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x02_Type = 0x02;
+        /// <summary>
+        /// 出现报警时,信息上报时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+        ///  最小计量单元:1ms
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x03_Type = 0x03;
+        /// <summary>
+        /// 远程服务和管理平台域名长度M
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x04_Type = 0x04;
+        /// <summary>
+        /// 远程服务和管理平台域名
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x05_Type = 0x05;
+        /// <summary>
+        /// 远程服务和管理平台端口,有效值范围:0~65531
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x06_Type = 0x06;
+        /// <summary>
+        /// 硬件版本,车载终端厂商自行定义
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x07_Type = 0x07;
+        /// <summary>
+        /// 固件版本,车载终端厂商自行定义
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x08_Type = 0x08;
+        /// <summary>
+        /// 车载终端心跳发送周期,有效值范围:1~240(表示1s~240s)
+        /// 最小计量单元:1s
+        ///  0xFE表示异常,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x09_Type = 0x09;
+        /// <summary>
+        /// 终端应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// 最小计量单元:1s
+        ///   0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x0A_Type = 0x0A;
+        /// <summary>
+        ///平台应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// 最小计量单元:1s
+        ///   0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x0B_Type = 0x0B;
+        /// <summary>
+        /// 连续三次登入失败后,到下一次登入的时间间隔。有效值范围:1~240(表示1min~240min)
+        /// 最小计量单元:1min
+        /// 0xFE表示异常,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x0C_Type = 0x0C;
+        /// <summary>
+        /// 公共平台域名长度N
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x0D_Type = 0x0D;
+        /// <summary>
+        /// 公共平台域名
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x0E_Type = 0x0E;
+        /// <summary>
+        /// 公共平台端口,有效值访问:0~65531
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x0F_Type = 0x0F;
+        /// <summary>
+        /// 是否处于抽样监测中
+        /// 0x01 表示是    0x02 表示否
+        /// 0xFE表示异常,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x80Reply_0x10_Type = 0x10;
+
+        internal static IDictionary<byte, Type> JTNE_0x80ReplyMethod { get; private set; }
+        /// <summary>
+        /// A对象的长度,依赖于B对象的值 (数据长度为byte类型)
+        /// </summary>
+        internal static IDictionary<byte, byte> JTNE_0x80ReplyLengthOfADependOnValueOfB { get; private set; }
+        /// <summary>
+        /// 参数 ID
+        /// </summary>
+        public abstract byte ParamId { get; set; }
+
+        /// <summary>
+        /// 参数长度
+        /// </summary>
+        public abstract byte ParamLength { get; set; }
+
+        static JTNE_0x80Reply_Body()
+        {
+            JTNE_0x80ReplyMethod = new Dictionary<byte, Type>();
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x01_Type, typeof(JTNE_0x80Reply_0x01));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x02_Type, typeof(JTNE_0x80Reply_0x02));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x03_Type, typeof(JTNE_0x80Reply_0x03));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x04_Type, typeof(JTNE_0x80Reply_0x04));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x05_Type, typeof(JTNE_0x80Reply_0x05));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x06_Type, typeof(JTNE_0x80Reply_0x06));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x07_Type, typeof(JTNE_0x80Reply_0x07));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x08_Type, typeof(JTNE_0x80Reply_0x08));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x09_Type, typeof(JTNE_0x80Reply_0x09));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x0A_Type, typeof(JTNE_0x80Reply_0x0A));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x0B_Type, typeof(JTNE_0x80Reply_0x0B));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x0C_Type, typeof(JTNE_0x80Reply_0x0C));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x0D_Type, typeof(JTNE_0x80Reply_0x0D));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x0E_Type, typeof(JTNE_0x80Reply_0x0E));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x0F_Type, typeof(JTNE_0x80Reply_0x0F));
+            JTNE_0x80ReplyMethod.Add(JTNE_0x80Reply_0x10_Type, typeof(JTNE_0x80Reply_0x10));
+
+            JTNE_0x80ReplyLengthOfADependOnValueOfB = new Dictionary<byte, byte>();
+            JTNE_0x80ReplyLengthOfADependOnValueOfB.Add(JTNE_0x80Reply_0x05_Type, JTNE_0x80Reply_0x04_Type);
+            JTNE_0x80ReplyLengthOfADependOnValueOfB.Add(JTNE_0x80Reply_0x0E_Type, JTNE_0x80Reply_0x0D_Type);
+        }
+
+        internal static void AddJTNE_0x80ReplyMethod(byte paramId, Type type)
+        {
+            if (!JTNE_0x80ReplyMethod.ContainsKey(paramId))
+            {
+                JTNE_0x80ReplyMethod.Add(paramId, type);
+            }
+            else
+            {
+                JTNE_0x80ReplyMethod[paramId] = type;
+            }
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="DependerParamId">依赖者</param>
+        /// <param name="DependedParamId">被依赖者</param>
+        internal static void AddJTNE_0x80ReplyLengthOfADependOnValueOfBMethod(byte DependerParamId, byte DependedParamId)
+        {
+            if (!JTNE_0x80ReplyLengthOfADependOnValueOfB.ContainsKey(DependerParamId))
+            {
+                JTNE_0x80ReplyLengthOfADependOnValueOfB.Add(DependerParamId, DependedParamId);
+            }
+            else
+            {
+                JTNE_0x80ReplyLengthOfADependOnValueOfB[DependerParamId] = DependedParamId;
+            }
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81.cs
new file mode 100644
index 0000000..92ef3bf
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81.cs
@@ -0,0 +1,28 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 参数查询
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_Formatter))]
+    public class JTNE_0x81 : JTNEBodies
+    {
+        /// <summary>
+        /// 设置时间
+        /// </summary>
+        public DateTime SetTime { get; set; }
+        /// <summary>
+        /// 参数总数
+        /// </summary>
+        public byte ParamNum { get; set; } 
+        /// <summary>
+        /// 参数列表
+        /// </summary>
+        public List<JTNE_0x81_Body> ParamList { get; set; } 
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x01.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x01.cs
new file mode 100644
index 0000000..f686449
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x01.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 车载终端本地存储时间周期,有效值范围:0~60 000(表示0ms~60 000ms)最小计量单元:1ms
+    /// 0x81_0x01
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x01Formatter))]
+    public class JTNE_0x81_0x01: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x01;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        /// 车载终端本地存储时间周期,(表示0ms~60 000ms)最小计量单元:1ms
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x02.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x02.cs
new file mode 100644
index 0000000..8b8ad6a
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x02.cs
@@ -0,0 +1,26 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 正常时,信息上报时间周期,有效值范围:1~600(表示1s~600s) 最小计量单元:1s
+    /// 0x81_0x02
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x02Formatter))]
+    public class JTNE_0x81_0x02: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x02;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        /// 正常时,信息上报时间周期,有效值范围:1~600(表示1s~600s) 最小计量单元:1s
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x03.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x03.cs
new file mode 100644
index 0000000..4619c16
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x03.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 出现报警时,信息上报时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x03Formatter))]
+    public class JTNE_0x81_0x03: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x03;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///出现报警时,信息上报时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x04.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x04.cs
new file mode 100644
index 0000000..d5452fb
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x04.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///  远程服务和管理平台域名长度M
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x04Formatter))]
+    public class JTNE_0x81_0x04: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x04;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        ///远程服务和管理平台域名长度M
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x05.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x05.cs
new file mode 100644
index 0000000..8fb603c
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x05.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 远程服务和管理平台域名
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x05Formatter))]
+    public class JTNE_0x81_0x05: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x05;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; }
+        /// <summary>
+        ///远程服务和管理平台域名
+        /// </summary>
+        public byte[] ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x06.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x06.cs
new file mode 100644
index 0000000..054d2c9
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x06.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 远程服务和管理平台端口,有效值范围:0~65531
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x06Formatter))]
+    public class JTNE_0x81_0x06: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x06;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///远程服务和管理平台端口,有效值范围:0~65531
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x07.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x07.cs
new file mode 100644
index 0000000..1f5abc9
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x07.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 硬件版本,车载终端厂商自行定义
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x07Formatter))]
+    public class JTNE_0x81_0x07: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x07;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 5;
+        /// <summary>
+        ///硬件版本,车载终端厂商自行定义 数据长度= 5;
+        /// </summary>
+        public string ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x08.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x08.cs
new file mode 100644
index 0000000..30e4146
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x08.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 固件版本,车载终端厂商自行定义
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x08Formatter))]
+    public class JTNE_0x81_0x08: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x08;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 5;
+        /// <summary>
+        ///固件版本,车载终端厂商自行定义
+        /// </summary>
+        public string ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x09.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x09.cs
new file mode 100644
index 0000000..c143b70
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x09.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///  车载终端心跳发送周期,有效值范围:1~240(表示1s~240s)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x09Formatter))]
+    public class JTNE_0x81_0x09: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x09;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        /// 车载终端心跳发送周期,有效值范围:1~240(表示1s~240s)
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0A.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0A.cs
new file mode 100644
index 0000000..5be86e6
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0A.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 终端应答超时时间,有效值范围:1~600(表示1s~600s)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x0AFormatter))]
+    public class JTNE_0x81_0x0A: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x0A;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///终端应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0B.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0B.cs
new file mode 100644
index 0000000..7057f0a
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0B.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 平台应答超时时间,有效值范围:1~600(表示1s~600s)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x0BFormatter))]
+    public class JTNE_0x81_0x0B: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x0B;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///平台应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0C.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0C.cs
new file mode 100644
index 0000000..bb20d52
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0C.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///   连续三次登入失败后,到下一次登入的时间间隔。有效值范围:1~240(表示1min~240min)
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x0CFormatter))]
+    public class JTNE_0x81_0x0C: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x0C;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        ///  连续三次登入失败后,到下一次登入的时间间隔。有效值范围:1~240(表示1min~240min)
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0D.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0D.cs
new file mode 100644
index 0000000..d93c38d
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0D.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///  公共平台域名长度N
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x0DFormatter))]
+    public class JTNE_0x81_0x0D: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x0D;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        ///公共平台域名长度N
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0E.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0E.cs
new file mode 100644
index 0000000..b9da336
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0E.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 公共平台域名
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x0EFormatter))]
+    public class JTNE_0x81_0x0E: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x0E;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; }
+        /// <summary>
+        ///公共平台域名
+        /// </summary>
+        public byte[] ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0F.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0F.cs
new file mode 100644
index 0000000..78fb111
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x0F.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 公共平台端口,有效值访问:0~65531
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x0FFormatter))]
+    public class JTNE_0x81_0x0F: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x0F;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 2;
+        /// <summary>
+        ///公共平台端口,有效值访问:0~65531
+        /// </summary>
+        public ushort ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x10.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x10.cs
new file mode 100644
index 0000000..ba043c3
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_0x10.cs
@@ -0,0 +1,25 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///   是否处于抽样监测中 0x01 表示是    0x02 表示否
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x81_0x10Formatter))]
+    public class JTNE_0x81_0x10: JTNE_0x81_Body
+    {
+        public override byte ParamId { get; set; } = 0x10;
+        /// <summary>
+        /// 数据 长度
+        /// </summary>
+        public override byte ParamLength { get; set; } = 1;
+        /// <summary>
+        /// 是否处于抽样监测中 0x01 表示是    0x02 表示否
+        /// </summary>
+        public byte ParamValue { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x81_Body.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x81_Body.cs
new file mode 100644
index 0000000..77f332b
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x81_Body.cs
@@ -0,0 +1,165 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 参数查询
+    /// </summary>
+    public abstract class  JTNE_0x81_Body
+    {
+        /// <summary>
+        /// 车载终端本地存储时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+        /// 最小计量单元:1ms
+        /// 0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x01_Type = 0x01;
+        /// <summary>
+        /// 正常时,信息上报时间周期,有效值范围:1~600(表示1s~600s)
+        /// 最小计量单元:1s
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x02_Type = 0x02;
+        /// <summary>
+        /// 出现报警时,信息上报时间周期,有效值范围:0~60 000(表示0ms~60 000ms)
+        ///  最小计量单元:1ms
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x03_Type = 0x03;
+        /// <summary>
+        /// 远程服务和管理平台域名长度M
+        /// </summary>
+        public const byte JTNE_0x81_0x04_Type = 0x04;
+        /// <summary>
+        /// 远程服务和管理平台域名
+        /// </summary>
+        public const byte JTNE_0x81_0x05_Type = 0x05;
+        /// <summary>
+        /// 远程服务和管理平台端口,有效值范围:0~65531
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x06_Type = 0x06;
+        /// <summary>
+        /// 硬件版本,车载终端厂商自行定义
+        /// </summary>
+        public const byte JTNE_0x81_0x07_Type = 0x07;
+        /// <summary>
+        /// 固件版本,车载终端厂商自行定义
+        /// </summary>
+        public const byte JTNE_0x81_0x08_Type = 0x08;
+        /// <summary>
+        /// 车载终端心跳发送周期,有效值范围:1~240(表示1s~240s)
+        /// 最小计量单元:1s
+        ///  0xFE表示异常,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x09_Type = 0x09;
+        /// <summary>
+        /// 终端应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// 最小计量单元:1s
+        ///   0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x0A_Type = 0x0A;
+        /// <summary>
+        ///平台应答超时时间,有效值范围:1~600(表示1s~600s)
+        /// 最小计量单元:1s
+        ///   0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x0B_Type = 0x0B;
+        /// <summary>
+        /// 连续三次登入失败后,到下一次登入的时间间隔。有效值范围:1~240(表示1min~240min)
+        /// 最小计量单元:1min
+        /// 0xFE表示异常,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x0C_Type = 0x0C;
+        /// <summary>
+        /// 公共平台域名长度N
+        /// </summary>
+        public const byte JTNE_0x81_0x0D_Type = 0x0D;
+        /// <summary>
+        /// 公共平台域名
+        /// </summary>
+        public const byte JTNE_0x81_0x0E_Type = 0x0E;
+        /// <summary>
+        /// 公共平台端口,有效值访问:0~65531
+        ///  0xFF,0xFE表示异常,0xFF,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x0F_Type = 0x0F;
+        /// <summary>
+        /// 是否处于抽样监测中
+        /// 0x01 表示是    0x02 表示否
+        /// 0xFE表示异常,0xFF表示无效
+        /// </summary>
+        public const byte JTNE_0x81_0x10_Type = 0x10;
+
+        internal static IDictionary<byte, Type> JTNE_0x81Method { get; private set; }
+        /// <summary>
+        /// A对象的长度,依赖于B对象的值 (数据长度为byte类型)
+        /// </summary>
+        internal static IDictionary<byte, byte> JTNE_0x81LengthOfADependOnValueOfB { get; private set; }
+        /// <summary>
+        /// 参数 ID
+        /// </summary>
+        public abstract byte ParamId { get; set; }
+
+        /// <summary>
+        /// 参数长度
+        /// </summary>
+        public abstract byte ParamLength { get; set; }
+
+        static JTNE_0x81_Body()
+        {
+            JTNE_0x81Method = new Dictionary<byte, Type>();
+            JTNE_0x81Method.Add(JTNE_0x81_0x01_Type, typeof(JTNE_0x81_0x01));
+            JTNE_0x81Method.Add(JTNE_0x81_0x02_Type, typeof(JTNE_0x81_0x02));
+            JTNE_0x81Method.Add(JTNE_0x81_0x03_Type, typeof(JTNE_0x81_0x03));
+            JTNE_0x81Method.Add(JTNE_0x81_0x04_Type, typeof(JTNE_0x81_0x04));
+            JTNE_0x81Method.Add(JTNE_0x81_0x05_Type, typeof(JTNE_0x81_0x05));
+            JTNE_0x81Method.Add(JTNE_0x81_0x06_Type, typeof(JTNE_0x81_0x06));
+            JTNE_0x81Method.Add(JTNE_0x81_0x07_Type, typeof(JTNE_0x81_0x07));
+            JTNE_0x81Method.Add(JTNE_0x81_0x08_Type, typeof(JTNE_0x81_0x08));
+            JTNE_0x81Method.Add(JTNE_0x81_0x09_Type, typeof(JTNE_0x81_0x09));
+            JTNE_0x81Method.Add(JTNE_0x81_0x0A_Type, typeof(JTNE_0x81_0x0A));
+            JTNE_0x81Method.Add(JTNE_0x81_0x0B_Type, typeof(JTNE_0x81_0x0B));
+            JTNE_0x81Method.Add(JTNE_0x81_0x0C_Type, typeof(JTNE_0x81_0x0C));
+            JTNE_0x81Method.Add(JTNE_0x81_0x0D_Type, typeof(JTNE_0x81_0x0D));
+            JTNE_0x81Method.Add(JTNE_0x81_0x0E_Type, typeof(JTNE_0x81_0x0E));
+            JTNE_0x81Method.Add(JTNE_0x81_0x0F_Type, typeof(JTNE_0x81_0x0F));
+            JTNE_0x81Method.Add(JTNE_0x81_0x10_Type, typeof(JTNE_0x81_0x10));
+
+            JTNE_0x81LengthOfADependOnValueOfB = new Dictionary<byte, byte>();
+            JTNE_0x81LengthOfADependOnValueOfB.Add(JTNE_0x81_0x05_Type, JTNE_0x81_0x04_Type);
+            JTNE_0x81LengthOfADependOnValueOfB.Add(JTNE_0x81_0x0E_Type, JTNE_0x81_0x0D_Type);
+        }
+
+        internal static void AddJTNE_0x81Method(byte paramId, Type type)
+        {
+            if (!JTNE_0x81Method.ContainsKey(paramId))
+            {
+                JTNE_0x81Method.Add(paramId, type);
+            }
+            else
+            {
+                JTNE_0x81Method[paramId] = type;
+            }
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="DependerParamId">依赖者</param>
+        /// <param name="DependedParamId">被依赖者</param>
+        internal static void AddJTNE_0x81LengthOfADependOnValueOfBMethod(byte DependerParamId, byte DependedParamId)
+        {
+            if (!JTNE_0x81LengthOfADependOnValueOfB.ContainsKey(DependerParamId))
+            {
+                JTNE_0x81LengthOfADependOnValueOfB.Add(DependerParamId, DependedParamId);
+            }
+            else
+            {
+                JTNE_0x81LengthOfADependOnValueOfB[DependerParamId] = DependedParamId;
+            }
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x82.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x82.cs
new file mode 100644
index 0000000..a186e48
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x82.cs
@@ -0,0 +1,28 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 终端控制
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x82_Formatter))]
+    public class JTNE_0x82 : JTNEBodies
+    {
+        /// <summary>
+        /// 控制时间
+        /// </summary>
+        public DateTime ControlTime { get; set; }
+        /// <summary>
+        /// 参数 
+        /// </summary>
+        public byte ParamID { get; set; }
+        /// <summary>
+        /// 参数 
+        /// </summary>
+        public JTNE_0x82_Body Parameter { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x82_0x01.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x82_0x01.cs
new file mode 100644
index 0000000..51d20ff
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x82_0x01.cs
@@ -0,0 +1,24 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using JTNE.Protocol.Metadata;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 远程升级:根据需要组合升级参数,参数之间用半角分号分割。
+    /// 指令如下:“URL地址;拨号点名称;拨号用户名;拨号密码;地址;端口;生产厂商代码
+    ///  ;硬件版本;固件版本;连接到升级服务器时限"
+    ///   如某个参数无值,则为空
+    ///   远程升级操作建议但不限于采用FTP方式进行操作,数据定义见表B.16
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x82_0x01Formatter))]
+    public class JTNE_0x82_0x01 : JTNE_0x82_Body
+    {
+        public override byte ParamId { get; set; } = 0x01;
+        public override byte ParamLength { get; set; }
+        public UpgradeCommand UpgradeCommand { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x82_0x06.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x82_0x06.cs
new file mode 100644
index 0000000..82fc66f
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x82_0x06.cs
@@ -0,0 +1,21 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using JTNE.Protocol.Metadata;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    ///  车载终端报警
+    /// </summary>
+    [JTNEFormatter(typeof(JTNE_0x82_0x06Formatter))]
+   public  class JTNE_0x82_0x06 : JTNE_0x82_Body
+    {
+        public override byte ParamId { get; set; } = 0x06;
+        public override byte ParamLength { get; set; }
+        public AlarmCommand AlarmCommand { get; set; }
+    }
+}
+
diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x82_Body.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x82_Body.cs
new file mode 100644
index 0000000..7a6aebb
--- /dev/null
+++ b/src/JTNE.Protocol/MessageBody/JTNE_0x82_Body.cs
@@ -0,0 +1,83 @@
+using JTNE.Protocol.Attributes;
+using JTNE.Protocol.Formatters.MessageBodyFormatters;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.MessageBody
+{
+    /// <summary>
+    /// 参数查询
+    /// </summary>
+    public class  JTNE_0x82_Body
+    {
+        /// <summary>
+        /// 未用
+        /// </summary>
+        public const byte JTNE_0x82_0x00_Type = 0x00;
+        /// <summary>
+        /// 远程升级:根据需要组合升级参数,参数之间用半角分号分割。
+        /// 指令如下:“URL地址;拨号点名称;拨号用户名;拨号密码;地址;端口;生产厂商代码
+        ///  ;硬件版本;固件版本;连接到升级服务器时限"
+        ///   如某个参数无值,则为空
+        ///   远程升级操作建议但不限于采用FTP方式进行操作,数据定义见表B.16
+        /// </summary>
+        public const byte JTNE_0x82_0x01_Type = 0x01;
+        /// <summary>
+        /// 车载终端关机
+        /// </summary>
+        public const byte JTNE_0x82_0x02_Type = 0x02;
+        /// <summary>
+        /// 车载终端复位
+        /// </summary>
+        public const byte JTNE_0x82_0x03_Type = 0x03;
+        /// <summary>
+        /// 车载终端恢复出厂设置,其中包括本地存储时间周期,信息上报时间周期,心跳发送时间周期,终端应答超时时间等
+        /// </summary>
+        public const byte JTNE_0x82_0x04_Type = 0x04;
+        /// <summary>
+        /// 断开数据通信链路
+        /// </summary>
+        public const byte JTNE_0x82_0x05_Type = 0x05;
+        /// <summary>
+        /// 车载终端报警
+        ///  报警命令参数数据格式和定义见表B.17
+        /// </summary>
+        public const byte JTNE_0x82_0x06_Type = 0x06;
+        /// <summary>
+        /// 开启抽样监测链路
+        /// </summary>
+        public const byte JTNE_0x82_0x07_Type = 0x07;
+     
+
+        public static IDictionary<byte, Type> JTNE_0x82Method { get; private set; }
+        /// <summary>
+        /// 参数 ID
+        /// </summary>
+        public virtual byte ParamId { get; set; }
+
+        /// <summary>
+        /// 参数长度
+        /// </summary>
+        public virtual byte ParamLength { get; set; }
+
+        static JTNE_0x82_Body()
+        {
+            JTNE_0x82Method = new Dictionary<byte, Type>();
+            JTNE_0x82Method.Add(JTNE_0x82_0x01_Type, typeof(JTNE_0x82_0x01));
+            JTNE_0x82Method.Add(JTNE_0x82_0x06_Type, typeof(JTNE_0x82_0x06));
+        }
+
+        internal static void AddJTNE_0x82Method(byte paramId, Type type)
+        {
+            if (!JTNE_0x82Method.ContainsKey(paramId))
+            {
+                JTNE_0x82Method.Add(paramId, type);
+            }
+            else
+            {
+                JTNE_0x82Method[paramId] = type;
+            }
+        }
+    }
+}
diff --git a/src/JTNE.Protocol/Metadata/AlarmCommand.cs b/src/JTNE.Protocol/Metadata/AlarmCommand.cs
new file mode 100644
index 0000000..d12b811
--- /dev/null
+++ b/src/JTNE.Protocol/Metadata/AlarmCommand.cs
@@ -0,0 +1,22 @@
+using JTNE.Protocol.Enums;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Metadata
+{
+    /// <summary>
+    /// 升级命令
+    /// </summary>
+    public class AlarmCommand
+    {
+        /// <summary>
+        /// 报警等级
+        /// </summary>
+        public JTNEAlarmLevel AlarmLevel { get; set; }
+        /// <summary>
+        /// 报警信息
+        /// </summary>
+        public string  Alarm { get; set; }
+    }
+}
diff --git a/src/JTNE.Protocol/Metadata/UpgradeCommand.cs b/src/JTNE.Protocol/Metadata/UpgradeCommand.cs
new file mode 100644
index 0000000..fbbeefe
--- /dev/null
+++ b/src/JTNE.Protocol/Metadata/UpgradeCommand.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JTNE.Protocol.Metadata
+{
+    /// <summary>
+    /// 升级命令
+    /// </summary>
+    public class UpgradeCommand
+    {
+        /// <summary>
+        /// 拨号点名称
+        /// 升级服务器的APN,无线通信拨号访问点
+        /// 如果网络制式为CDMA,则该值为PPP连接拨号号码
+        /// </summary>
+        public string DialName { get; set; }
+        /// <summary>
+        /// 拨号用户名
+        /// </summary>
+        public string  DialUserName { get; set; }
+        /// <summary>
+        /// 拨号用户名
+        /// </summary>
+        public string DialUserPwd { get; set; }
+        /// <summary>
+        /// 升级服务器地址
+        /// IP或域名 IPV4的前2个字节为0
+        /// </summary>
+        public byte[] ServerUrl { get; set; }
+        /// <summary>
+        /// 升级服务器端口
+        /// </summary>
+        public ushort ServerPort { get; set; }
+        /// <summary>
+        /// 车载终端制造商ID
+        /// </summary>
+        public string ManufacturerID { get; set; }
+        /// <summary>
+        /// 硬件版本
+        /// </summary>
+        public string HardwareVersion { get; set; }
+        /// <summary>
+        /// 固件版本
+        /// </summary>
+        public string FirmwareVersion { get; set; }
+        /// <summary>
+        /// 升级URL地址,完整URL地址
+        /// 宜使用FTP协议,通过FTP协议从FTP服务器上获取新的软件
+        /// </summary>
+        public string ServerAddress { get; set; }
+        /// <summary>
+        /// 连接到升级服务器时限
+        /// 有效值范围:0~60 000(表示0min~60 000min)最小计量单元:1min
+        /// 在车载终端接收到升级命令后的有效期截止前,车载终端连回远程服务和管理平台
+        /// </summary>
+        public ushort ConnectTimeLimit { get; set; }
+
+        public override string ToString()
+        {
+            return $"{ServerAddress};{DialName};{DialUserName};{DialUserPwd};{JTNEGlobalConfigs.Instance.Encoding.GetString(ServerUrl)};{ServerPort};{ManufacturerID};{HardwareVersion};{FirmwareVersion};{ConnectTimeLimit}";
+        }
+    }
+}