diff --git a/README.md b/README.md index 8525f17..f153e8c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ | 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 | | :---: | :-----------: | :------: | :------: | :----------------------------: | | 1 | 0x01 | √ | √ | 车辆登入 | -| 2 | 0x02 | x | x | 实时信息上传 | +| 2 | 0x02 | √ | √ | 实时信息上传 | | 3 | 0x03 | x | x | 补传信息上传 | | 4 | 0x04 | √ | √ | 车辆登出 | | 5 | 0x05 | √ | √ | 平台登入 | diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02Test.cs new file mode 100644 index 0000000..d95ed8c --- /dev/null +++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02Test.cs @@ -0,0 +1,143 @@ +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_0x02Test + { + [Fact] + public void Test1() + { + JTNE_0x02 jTNE_0X02 = new JTNE_0x02(); + jTNE_0X02.Values = new Dictionary(); + + JTNE_0x02_0x01 jTNE_0X02_0X01 = new JTNE_0x02_0x01(); + jTNE_0X02_0X01.Accelerator = 0x02; + jTNE_0X02_0X01.Brakes = 0x03; + jTNE_0X02_0X01.CarStatus = 0x04; + jTNE_0X02_0X01.ChargeStatus = 0x05; + jTNE_0X02_0X01.DCStatus = 0x06; + jTNE_0X02_0X01.OperationMode = 0x07; + jTNE_0X02_0X01.Resistance = 123; + jTNE_0X02_0X01.SOC = 0x03; + jTNE_0X02_0X01.Speed = 58; + jTNE_0X02_0X01.Stall = 0x02; + jTNE_0X02_0X01.TotalDis = 6666; + jTNE_0X02_0X01.TotalTemp = 99; + jTNE_0X02_0X01.TotalVoltage = 100; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x01, jTNE_0X02_0X01); + + JTNE_0x02_0x02 jTNE_0X02_0X02 = new JTNE_0x02_0x02(); + jTNE_0X02_0X02.Electricals = new List(); + Metadata.Electrical electrical1 = new Metadata.Electrical(); + electrical1.ElControlTemp = 0x01; + electrical1.ElCurrent = 100; + electrical1.ElNo = 0x01; + electrical1.ElSpeed = 65; + electrical1.ElStatus = 0x02; + electrical1.ElTemp = 0x03; + electrical1.ElTorque = 55; + electrical1.ElVoltage = 236; + Metadata.Electrical electrical2 = new Metadata.Electrical(); + electrical2.ElControlTemp = 0x02; + electrical2.ElCurrent = 101; + electrical2.ElNo = 0x02; + electrical2.ElSpeed = 66; + electrical2.ElStatus = 0x03; + electrical2.ElTemp = 0x05; + electrical2.ElTorque = 566; + electrical2.ElVoltage = 2136; + jTNE_0X02_0X02.Electricals.Add(electrical1); + jTNE_0X02_0X02.Electricals.Add(electrical2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x02, jTNE_0X02_0X02); + + JTNE_0x02_0x03 jTNE_0X02_0X03 = new JTNE_0x02_0x03(); + jTNE_0X02_0X03.DCStatus = 0x02; + jTNE_0X02_0X03.FuelBatteryCurrent = 111; + jTNE_0X02_0X03.FuelBatteryVoltage = 2222; + jTNE_0X02_0X03.FuelConsumptionRate = 3222; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrations = 6666; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrationsNo = 0x56; + jTNE_0X02_0X03.HydrogenSystemMaxPressure = 3336; + jTNE_0X02_0X03.HydrogenSystemMaxPressureNo = 0x65; + jTNE_0X02_0X03.HydrogenSystemMaxTemp = 3355; + jTNE_0X02_0X03.HydrogenSystemMaxTempNo = 0x22; + jTNE_0X02_0X03.Temperatures = new byte[] + { + 0x01,0x02,0x03 + }; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x03, jTNE_0X02_0X03); + + var hex = JTNESerializer.Serialize(jTNE_0X02).ToHexString(); + //01 04 05 07 00 3A 00 00 1A 0A 00 64 00 63 03 06 02 00 7B 02 03 -21 + //02 02 01 02 01 00 41 00 37 03 00 EC 00 64 02 03 02 00 42 02 36 05 08 58 00 65 -26 + //03 08 AE 00 6F 0C 96 00 03 01 02 03 0D 1B 22 1A 0A 56 0D 08 65 02 + Assert.Equal("01040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502", hex); + } + + [Fact] + public void Test2() + { + var data = "01040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502".ToHexBytes(); + JTNE_0x02 jTNE_0X02 = JTNESerializer.Deserialize(data); + + JTNE_0x02_0x01 jTNE_0X02_0X01 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x01] as JTNE_0x02_0x01; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x01, jTNE_0X02_0X01.TypeCode); + Assert.Equal(0x02, jTNE_0X02_0X01.Accelerator); + Assert.Equal(0x03, jTNE_0X02_0X01.Brakes); + Assert.Equal(0x04, jTNE_0X02_0X01.CarStatus); + Assert.Equal(0x05, jTNE_0X02_0X01.ChargeStatus); + Assert.Equal(0x06, jTNE_0X02_0X01.DCStatus); + Assert.Equal(0x07, jTNE_0X02_0X01.OperationMode); + Assert.Equal(123, jTNE_0X02_0X01.Resistance); + Assert.Equal(0x03, jTNE_0X02_0X01.SOC); + Assert.Equal(58, jTNE_0X02_0X01.Speed); + Assert.Equal(0x02, jTNE_0X02_0X01.Stall); + Assert.Equal((uint)6666, jTNE_0X02_0X01.TotalDis); + Assert.Equal(99, jTNE_0X02_0X01.TotalTemp); + Assert.Equal(100, jTNE_0X02_0X01.TotalVoltage); + + + JTNE_0x02_0x02 jTNE_0X02_0X02 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x02] as JTNE_0x02_0x02; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x02, jTNE_0X02_0X02.TypeCode); + Assert.Equal(2, jTNE_0X02_0X02.ElectricalCount); + Metadata.Electrical electrical1 = jTNE_0X02_0X02.Electricals[0]; + Assert.Equal(0x01, electrical1.ElControlTemp); + Assert.Equal(100, electrical1.ElCurrent); + Assert.Equal(0x01, electrical1.ElNo); + Assert.Equal(65, electrical1.ElSpeed); + Assert.Equal(0x02, electrical1.ElStatus); + Assert.Equal(0x03, electrical1.ElTemp); + Assert.Equal(55, electrical1.ElTorque); + Assert.Equal(236, electrical1.ElVoltage); + Metadata.Electrical electrical2 = jTNE_0X02_0X02.Electricals[1]; + Assert.Equal(0x02, electrical2.ElControlTemp); + Assert.Equal(101, electrical2.ElCurrent); + Assert.Equal(0x02, electrical2.ElNo); + Assert.Equal(66, electrical2.ElSpeed); + Assert.Equal(0x03, electrical2.ElStatus); + Assert.Equal(0x05, electrical2.ElTemp); + Assert.Equal(566, electrical2.ElTorque); + Assert.Equal(2136, electrical2.ElVoltage); + + JTNE_0x02_0x03 jTNE_0X02_0X03 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x03] as JTNE_0x02_0x03; + + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x03, jTNE_0X02_0X03.TypeCode); + Assert.Equal(0x02, jTNE_0X02_0X03.DCStatus); + Assert.Equal(111, jTNE_0X02_0X03.FuelBatteryCurrent); + Assert.Equal(2222, jTNE_0X02_0X03.FuelBatteryVoltage); + Assert.Equal(3222, jTNE_0X02_0X03.FuelConsumptionRate); + Assert.Equal(6666, jTNE_0X02_0X03.HydrogenSystemMaxConcentrations); + Assert.Equal(0x56, jTNE_0X02_0X03.HydrogenSystemMaxConcentrationsNo); + Assert.Equal(3336, jTNE_0X02_0X03.HydrogenSystemMaxPressure); + Assert.Equal(0x65, jTNE_0X02_0X03.HydrogenSystemMaxPressureNo); + Assert.Equal(3355, jTNE_0X02_0X03.HydrogenSystemMaxTemp); + Assert.Equal(0x22, jTNE_0X02_0X03.HydrogenSystemMaxTempNo); + Assert.Equal(new byte[] { 0x01, 0x02, 0x03 }, jTNE_0X02_0X03.Temperatures); + } + } +} diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs new file mode 100644 index 0000000..c871ed0 --- /dev/null +++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs @@ -0,0 +1,170 @@ +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_0x02_CompositeTest + { + [Fact] + public void Test1() + { + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1)); + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2)); + + JTNE_0x02 jTNE_0X02 = new JTNE_0x02(); + jTNE_0X02.Values = new Dictionary(); + jTNE_0X02.CusotmSerializeObjectValues = new Dictionary(); + + JTNE_0x02_0x01 jTNE_0X02_0X01 = new JTNE_0x02_0x01(); + jTNE_0X02_0X01.Accelerator = 0x02; + jTNE_0X02_0X01.Brakes = 0x03; + jTNE_0X02_0X01.CarStatus = 0x04; + jTNE_0X02_0X01.ChargeStatus = 0x05; + jTNE_0X02_0X01.DCStatus = 0x06; + jTNE_0X02_0X01.OperationMode = 0x07; + jTNE_0X02_0X01.Resistance = 123; + jTNE_0X02_0X01.SOC = 0x03; + jTNE_0X02_0X01.Speed = 58; + jTNE_0X02_0X01.Stall = 0x02; + jTNE_0X02_0X01.TotalDis = 6666; + jTNE_0X02_0X01.TotalTemp = 99; + jTNE_0X02_0X01.TotalVoltage = 100; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x01, jTNE_0X02_0X01); + + JTNE_0x02_0x02 jTNE_0X02_0X02 = new JTNE_0x02_0x02(); + jTNE_0X02_0X02.Electricals = new List(); + Metadata.Electrical electrical1 = new Metadata.Electrical(); + electrical1.ElControlTemp = 0x01; + electrical1.ElCurrent = 100; + electrical1.ElNo = 0x01; + electrical1.ElSpeed = 65; + electrical1.ElStatus = 0x02; + electrical1.ElTemp = 0x03; + electrical1.ElTorque = 55; + electrical1.ElVoltage = 236; + Metadata.Electrical electrical2 = new Metadata.Electrical(); + electrical2.ElControlTemp = 0x02; + electrical2.ElCurrent = 101; + electrical2.ElNo = 0x02; + electrical2.ElSpeed = 66; + electrical2.ElStatus = 0x03; + electrical2.ElTemp = 0x05; + electrical2.ElTorque = 566; + electrical2.ElVoltage = 2136; + jTNE_0X02_0X02.Electricals.Add(electrical1); + jTNE_0X02_0X02.Electricals.Add(electrical2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x02, jTNE_0X02_0X02); + + JTNE_0x02_0x03 jTNE_0X02_0X03 = new JTNE_0x02_0x03(); + jTNE_0X02_0X03.DCStatus = 0x02; + jTNE_0X02_0X03.FuelBatteryCurrent = 111; + jTNE_0X02_0X03.FuelBatteryVoltage = 2222; + jTNE_0X02_0X03.FuelConsumptionRate = 3222; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrations = 6666; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrationsNo = 0x56; + jTNE_0X02_0X03.HydrogenSystemMaxPressure = 3336; + jTNE_0X02_0X03.HydrogenSystemMaxPressureNo = 0x65; + jTNE_0X02_0X03.HydrogenSystemMaxTemp = 3355; + jTNE_0X02_0X03.HydrogenSystemMaxTempNo = 0x22; + jTNE_0X02_0X03.Temperatures = new byte[] + { + 0x01,0x02,0x03 + }; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x03, jTNE_0X02_0X03); + + JTNE_0x02_0xA1 jTNE_0X02_0XA1 = new JTNE_0x02_0xA1(); + jTNE_0X02_0XA1.UserName = "SmallChi"; + jTNE_0X02_0XA1.Age = 18; + jTNE_0X02.CusotmSerializeObjectValues.Add(0xA1, jTNE_0X02_0XA1); + + JTNE_0x02_0xA2 jTNE_0X02_0XA2 = new JTNE_0x02_0xA2(); + jTNE_0X02_0XA2.CompanyName = "小池有限公司"; + jTNE_0X02.CusotmSerializeObjectValues.Add(0xA2, jTNE_0X02_0XA2); + + + var hex = JTNESerializer.Serialize(jTNE_0X02).ToHexString(); + Assert.Equal("01040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000", hex); + } + + [Fact] + public void Test2() + { + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1)); + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2)); + + var data = "01040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000".ToHexBytes(); + JTNE_0x02 jTNE_0X02 = JTNESerializer.Deserialize(data); + + JTNE_0x02_0x01 jTNE_0X02_0X01 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x01] as JTNE_0x02_0x01; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x01, jTNE_0X02_0X01.TypeCode); + Assert.Equal(0x02, jTNE_0X02_0X01.Accelerator); + Assert.Equal(0x03, jTNE_0X02_0X01.Brakes); + Assert.Equal(0x04, jTNE_0X02_0X01.CarStatus); + Assert.Equal(0x05, jTNE_0X02_0X01.ChargeStatus); + Assert.Equal(0x06, jTNE_0X02_0X01.DCStatus); + Assert.Equal(0x07, jTNE_0X02_0X01.OperationMode); + Assert.Equal(123, jTNE_0X02_0X01.Resistance); + Assert.Equal(0x03, jTNE_0X02_0X01.SOC); + Assert.Equal(58, jTNE_0X02_0X01.Speed); + Assert.Equal(0x02, jTNE_0X02_0X01.Stall); + Assert.Equal((uint)6666, jTNE_0X02_0X01.TotalDis); + Assert.Equal(99, jTNE_0X02_0X01.TotalTemp); + Assert.Equal(100, jTNE_0X02_0X01.TotalVoltage); + + + JTNE_0x02_0x02 jTNE_0X02_0X02 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x02] as JTNE_0x02_0x02; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x02, jTNE_0X02_0X02.TypeCode); + Assert.Equal(2, jTNE_0X02_0X02.ElectricalCount); + Metadata.Electrical electrical1 = jTNE_0X02_0X02.Electricals[0]; + Assert.Equal(0x01, electrical1.ElControlTemp); + Assert.Equal(100, electrical1.ElCurrent); + Assert.Equal(0x01, electrical1.ElNo); + Assert.Equal(65, electrical1.ElSpeed); + Assert.Equal(0x02, electrical1.ElStatus); + Assert.Equal(0x03, electrical1.ElTemp); + Assert.Equal(55, electrical1.ElTorque); + Assert.Equal(236, electrical1.ElVoltage); + Metadata.Electrical electrical2 = jTNE_0X02_0X02.Electricals[1]; + Assert.Equal(0x02, electrical2.ElControlTemp); + Assert.Equal(101, electrical2.ElCurrent); + Assert.Equal(0x02, electrical2.ElNo); + Assert.Equal(66, electrical2.ElSpeed); + Assert.Equal(0x03, electrical2.ElStatus); + Assert.Equal(0x05, electrical2.ElTemp); + Assert.Equal(566, electrical2.ElTorque); + Assert.Equal(2136, electrical2.ElVoltage); + + JTNE_0x02_0x03 jTNE_0X02_0X03 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x03] as JTNE_0x02_0x03; + + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x03, jTNE_0X02_0X03.TypeCode); + Assert.Equal(0x02, jTNE_0X02_0X03.DCStatus); + Assert.Equal(111, jTNE_0X02_0X03.FuelBatteryCurrent); + Assert.Equal(2222, jTNE_0X02_0X03.FuelBatteryVoltage); + Assert.Equal(3222, jTNE_0X02_0X03.FuelConsumptionRate); + Assert.Equal(6666, jTNE_0X02_0X03.HydrogenSystemMaxConcentrations); + Assert.Equal(0x56, jTNE_0X02_0X03.HydrogenSystemMaxConcentrationsNo); + Assert.Equal(3336, jTNE_0X02_0X03.HydrogenSystemMaxPressure); + Assert.Equal(0x65, jTNE_0X02_0X03.HydrogenSystemMaxPressureNo); + Assert.Equal(3355, jTNE_0X02_0X03.HydrogenSystemMaxTemp); + Assert.Equal(0x22, jTNE_0X02_0X03.HydrogenSystemMaxTempNo); + Assert.Equal(new byte[] { 0x01, 0x02, 0x03 }, jTNE_0X02_0X03.Temperatures); + + + JTNE_0x02_0xA1 jTNE_0X02_0XA1 = JTNESerializer.Deserialize(jTNE_0X02.CusotmValues[0xA1]); + Assert.Equal(0xA1, jTNE_0X02_0XA1.TypeCode); + Assert.Equal(14, jTNE_0X02_0XA1.Length); + Assert.Equal("SmallChi", jTNE_0X02_0XA1.UserName); + Assert.Equal(18, jTNE_0X02_0XA1.Age); + + JTNE_0x02_0xA2 jTNE_0X02_0XA2 = JTNESerializer.Deserialize(jTNE_0X02.CusotmValues[0xA2]); + Assert.Equal(0xA2, jTNE_0X02_0XA2.TypeCode); + Assert.Equal(20, jTNE_0X02_0XA2.Length); + Assert.Equal("小池有限公司", jTNE_0X02_0XA2.CompanyName); + } + + } +} diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs new file mode 100644 index 0000000..81fb27d --- /dev/null +++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs @@ -0,0 +1,139 @@ +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_0x02_CustomBodyTest + { + + [Fact] + public void Test1() + { + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1)); + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2)); + + JTNE_0x02 jTNE_0X02 = new JTNE_0x02(); + jTNE_0X02.CusotmSerializeObjectValues = new Dictionary(); + + JTNE_0x02_0xA1 jTNE_0X02_0XA1 = new JTNE_0x02_0xA1(); + jTNE_0X02_0XA1.UserName = "SmallChi"; + jTNE_0X02_0XA1.Age = 18; + jTNE_0X02.CusotmSerializeObjectValues.Add(0xA1, jTNE_0X02_0XA1); + + JTNE_0x02_0xA2 jTNE_0X02_0XA2 = new JTNE_0x02_0xA2(); + jTNE_0X02_0XA2.CompanyName = "小池有限公司"; + jTNE_0X02.CusotmSerializeObjectValues.Add(0xA2, jTNE_0X02_0XA2); + + var hex = JTNESerializer.Serialize(jTNE_0X02).ToHexString(); + Assert.Equal("A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000", hex); + } + + [Fact] + public void Test2() + { + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1)); + JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2)); + + var data = "A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000".ToHexBytes(); + JTNE_0x02 jTNE_0X02 = JTNESerializer.Deserialize(data); + Assert.Empty(jTNE_0X02.Values); + + JTNE_0x02_0xA1 jTNE_0X02_0XA1 = JTNESerializer.Deserialize(jTNE_0X02.CusotmValues[0xA1]); + Assert.Equal(0xA1, jTNE_0X02_0XA1.TypeCode); + Assert.Equal(14, jTNE_0X02_0XA1.Length); + Assert.Equal("SmallChi", jTNE_0X02_0XA1.UserName); + Assert.Equal(18, jTNE_0X02_0XA1.Age); + + JTNE_0x02_0xA2 jTNE_0X02_0XA2 = JTNESerializer.Deserialize(jTNE_0X02.CusotmValues[0xA2]); + Assert.Equal(0xA2, jTNE_0X02_0XA2.TypeCode); + Assert.Equal(20, jTNE_0X02_0XA2.Length); + Assert.Equal("小池有限公司", jTNE_0X02_0XA2.CompanyName); + } + } + + /// + ///自定义0xA1消息 + /// + [JTNEFormatter(typeof(JTNE_0x02_0xA1_Formatter))] + public class JTNE_0x02_0xA1: JTNE_0x02_CustomBody + { + public override ushort Length { get; set; } = 14; + + public override byte TypeCode { get; set; } = 0xA1; + + public string UserName { get; set; } + + public ushort Age { get; set; } + } + + /// + ///自定义0xA2消息 + /// + [JTNEFormatter(typeof(JTNE_0x02_0xA2_Formatter))] + public class JTNE_0x02_0xA2 : JTNE_0x02_CustomBody + { + public override ushort Length { get; set; } = 20; + + public override byte TypeCode { get; set; } = 0xA2; + + public string CompanyName { get; set; } + } + + /// + /// 自定义0xA1消息序列化器 + /// + public class JTNE_0x02_0xA1_Formatter : IJTNEFormatter + { + public JTNE_0x02_0xA1 Deserialize(ReadOnlySpan bytes, out int readSize) + { + int offset = 0; + JTNE_0x02_0xA1 jTNE_0X02_0XA1 = new JTNE_0x02_0xA1(); + jTNE_0X02_0XA1.TypeCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); + jTNE_0X02_0XA1.Length = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset); + jTNE_0X02_0XA1.UserName = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset,12); + jTNE_0X02_0XA1.Age = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset); + readSize = offset; + return jTNE_0X02_0XA1; + } + + public int Serialize(ref byte[] bytes, int offset, JTNE_0x02_0xA1 value) + { + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.TypeCode); + offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.Length); + offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.UserName,12); + offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.Age); + return offset; + } + } + /// + /// 自定义0xA2消息序列化器 + /// + public class JTNE_0x02_0xA2_Formatter : IJTNEFormatter + { + public JTNE_0x02_0xA2 Deserialize(ReadOnlySpan bytes, out int readSize) + { + int offset = 0; + JTNE_0x02_0xA2 jTNE_0X02_0XA2 = new JTNE_0x02_0xA2(); + jTNE_0X02_0XA2.TypeCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); + jTNE_0X02_0XA2.Length = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset); + jTNE_0X02_0XA2.CompanyName = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, 20); + readSize = offset; + return jTNE_0X02_0XA2; + } + + public int Serialize(ref byte[] bytes, int offset, JTNE_0x02_0xA2 value) + { + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.TypeCode); + offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.Length); + offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.CompanyName, 20); + return offset; + } + } + +} diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x02_Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x02_Formatter.cs index bf1108c..820217a 100644 --- a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x02_Formatter.cs +++ b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x02_Formatter.cs @@ -10,17 +10,65 @@ namespace JTNE.Protocol.Formatters.MessageBodyFormatters { public JTNE_0x02 Deserialize(ReadOnlySpan bytes, out int readSize) { - int offset = 0; + int offset = 0, bodyReadSize = 0; JTNE_0x02 jTNE_0X02 = new JTNE_0x02(); - - + jTNE_0X02.Values = new Dictionary(); + jTNE_0X02.CusotmValues = new Dictionary(); + while (offset < bytes.Length) + { + byte typeCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); + if (JTNE_0x02_Body.TypeCodes.TryGetValue(typeCode, out Type jTNE_0x02_BodyImpl)) + { + var bodyImplFormatter = JTNEFormatterExtensions.GetFormatter(jTNE_0x02_BodyImpl); + //从类型编码开始取 offset - 1 + var bodyData = JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(bodyImplFormatter, bytes.Slice(offset - 1), out bodyReadSize); + jTNE_0X02.Values.Add(typeCode, bodyData); + offset += bodyReadSize - 1; + } + else if (JTNE_0x02_CustomBody.CustomTypeCodes.TryGetValue(typeCode, out Type jTNE_0x02_CustomBodyImpl)) + { + int length = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset); + //从类型编码开始取 offset - 1 - 2 + //1:类型编码 + //2:自定义数据长度 + byte[] customBodyData = bytes.Slice(offset - 1 - 2, length + 1 + 2).ToArray(); + jTNE_0X02.CusotmValues.Add(typeCode, customBodyData); + offset += customBodyData.Length - 1 - 2; + } + else + { + offset += bodyReadSize; + break; + } + } readSize = offset; return jTNE_0X02; } public int Serialize(ref byte[] bytes, int offset, JTNE_0x02 value) { - + if (value.Values != null && value.Values.Count > 0) + { + foreach (var item in value.Values) + { + if (JTNE_0x02_Body.TypeCodes.TryGetValue(item.Key, out Type jTNE_0x02_BodyImpl)) + { + var bodyImplFormatter = JTNEFormatterExtensions.GetFormatter(jTNE_0x02_BodyImpl); + offset = JTNEFormatterResolverExtensions.JTNEDynamicSerialize(bodyImplFormatter, ref bytes, offset, item.Value); + } + } + } + if (value.CusotmSerializeObjectValues != null && value.CusotmSerializeObjectValues.Count > 0) + { + foreach (var item in value.CusotmSerializeObjectValues) + { + if (JTNE_0x02_CustomBody.CustomTypeCodes.TryGetValue(item.Key, out Type jTNE_0x02_CustomBodyImpl)) + { + var customBodyImplFormatter = JTNEFormatterExtensions.GetFormatter(jTNE_0x02_CustomBodyImpl); + offset = JTNEFormatterResolverExtensions.JTNEDynamicSerialize(customBodyImplFormatter, ref bytes, offset, item.Value); + } + } + } return offset; } } diff --git a/src/JTNE.Protocol/JTNEGlobalConfigs.cs b/src/JTNE.Protocol/JTNEGlobalConfigs.cs index 0baf1e0..46f741e 100644 --- a/src/JTNE.Protocol/JTNEGlobalConfigs.cs +++ b/src/JTNE.Protocol/JTNEGlobalConfigs.cs @@ -1,5 +1,6 @@ using JTNE.Protocol.Interfaces; using JTNE.Protocol.Internal; +using JTNE.Protocol.MessageBody; using System; using System.Text; @@ -86,6 +87,20 @@ namespace JTNE.Protocol return instance.Value; } /// + /// + /// + /// 自定义类型编码 + /// 继承JTNE.Protocol.MessageBody.JTNE_0x02_CustomBody + /// + public JTNEGlobalConfigs Register_JTNE0x02CustomBody(byte typeCode, Type type) + { + if (!JTNE_0x02_CustomBody.CustomTypeCodes.ContainsKey(typeCode)) + { + JTNE_0x02_CustomBody.CustomTypeCodes.Add(typeCode, type); + } + return instance.Value; + } + /// /// 设置跳过校验码 /// 场景:测试的时候,可能需要手动改数据,所以测试的时候有用 /// diff --git a/src/JTNE.Protocol/JTNESerializer.cs b/src/JTNE.Protocol/JTNESerializer.cs index cf80b88..38c65c5 100644 --- a/src/JTNE.Protocol/JTNESerializer.cs +++ b/src/JTNE.Protocol/JTNESerializer.cs @@ -1,5 +1,8 @@ using JTNE.Protocol.Extensions; using System; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("JTNE.Protocol.Test")] namespace JTNE.Protocol { diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x02.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x02.cs index cddde89..9c9dc56 100644 --- a/src/JTNE.Protocol/MessageBody/JTNE_0x02.cs +++ b/src/JTNE.Protocol/MessageBody/JTNE_0x02.cs @@ -17,6 +17,10 @@ namespace JTNE.Protocol.MessageBody /// public Dictionary Values { get; set; } /// + /// 用于构造序列化自定义值 + /// + public Dictionary CusotmSerializeObjectValues { get; set; } + /// /// 自定义值 /// public Dictionary CusotmValues { get; set; } diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x02_Body.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x02_Body.cs index aec4c94..690ee24 100644 --- a/src/JTNE.Protocol/MessageBody/JTNE_0x02_Body.cs +++ b/src/JTNE.Protocol/MessageBody/JTNE_0x02_Body.cs @@ -6,6 +6,9 @@ namespace JTNE.Protocol.MessageBody { public abstract class JTNE_0x02_Body { + /// + /// 类型编码 + /// public abstract byte TypeCode { get; set; } /// @@ -47,19 +50,19 @@ namespace JTNE.Protocol.MessageBody static JTNE_0x02_Body() { - Keys = new Dictionary(); - Keys.Add(JTNE_0x02_0x01, typeof(JTNE_0x02_0x01)); - Keys.Add(JTNE_0x02_0x02, typeof(JTNE_0x02_0x02)); - Keys.Add(JTNE_0x02_0x03, typeof(JTNE_0x02_0x03)); - Keys.Add(JTNE_0x02_0x04, typeof(JTNE_0x02_0x04)); - Keys.Add(JTNE_0x02_0x05, typeof(JTNE_0x02_0x05)); - Keys.Add(JTNE_0x02_0x06, typeof(JTNE_0x02_0x06)); - Keys.Add(JTNE_0x02_0x07, typeof(JTNE_0x02_0x07)); - Keys.Add(JTNE_0x02_0x08, typeof(JTNE_0x02_0x08)); - Keys.Add(JTNE_0x02_0x09, typeof(JTNE_0x02_0x09)); + TypeCodes = new Dictionary(); + TypeCodes.Add(JTNE_0x02_0x01, typeof(JTNE_0x02_0x01)); + TypeCodes.Add(JTNE_0x02_0x02, typeof(JTNE_0x02_0x02)); + TypeCodes.Add(JTNE_0x02_0x03, typeof(JTNE_0x02_0x03)); + TypeCodes.Add(JTNE_0x02_0x04, typeof(JTNE_0x02_0x04)); + TypeCodes.Add(JTNE_0x02_0x05, typeof(JTNE_0x02_0x05)); + TypeCodes.Add(JTNE_0x02_0x06, typeof(JTNE_0x02_0x06)); + TypeCodes.Add(JTNE_0x02_0x07, typeof(JTNE_0x02_0x07)); + TypeCodes.Add(JTNE_0x02_0x08, typeof(JTNE_0x02_0x08)); + TypeCodes.Add(JTNE_0x02_0x09, typeof(JTNE_0x02_0x09)); } - internal static Dictionary Keys; + internal static Dictionary TypeCodes; } diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x02_CustomBody.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x02_CustomBody.cs new file mode 100644 index 0000000..6739cb1 --- /dev/null +++ b/src/JTNE.Protocol/MessageBody/JTNE_0x02_CustomBody.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JTNE.Protocol.MessageBody +{ + /// + /// 自定义类型数据体 + /// + public abstract class JTNE_0x02_CustomBody: JTNE_0x02_Body + { + /// + /// 自定义数据长度 + /// + public abstract ushort Length { get; set; } + + static JTNE_0x02_CustomBody() + { + CustomTypeCodes = new Dictionary(); + } + /// + /// 自定义类型编码 + /// + internal static Dictionary CustomTypeCodes; + } +}