@@ -30,7 +30,7 @@ | |||
| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 | | |||
| :---: | :-----------: | :------: | :------: | :----------------------------: | | |||
| 1 | 0x01 | √ | √ | 车辆登入 | | |||
| 2 | 0x02 | x | x | 实时信息上传 | | |||
| 2 | 0x02 | √ | √ | 实时信息上传 | | |||
| 3 | 0x03 | x | x | 补传信息上传 | | |||
| 4 | 0x04 | √ | √ | 车辆登出 | | |||
| 5 | 0x05 | √ | √ | 平台登入 | | |||
@@ -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<byte, JTNE_0x02_Body>(); | |||
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>(); | |||
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<JTNE_0x02>(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); | |||
} | |||
} | |||
} |
@@ -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<byte, JTNE_0x02_Body>(); | |||
jTNE_0X02.CusotmSerializeObjectValues = new Dictionary<byte, JTNE_0x02_CustomBody>(); | |||
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>(); | |||
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<JTNE_0x02>(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_0xA1>(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_0xA2>(jTNE_0X02.CusotmValues[0xA2]); | |||
Assert.Equal(0xA2, jTNE_0X02_0XA2.TypeCode); | |||
Assert.Equal(20, jTNE_0X02_0XA2.Length); | |||
Assert.Equal("小池有限公司", jTNE_0X02_0XA2.CompanyName); | |||
} | |||
} | |||
} |
@@ -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<byte, JTNE_0x02_CustomBody>(); | |||
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<JTNE_0x02>(data); | |||
Assert.Empty(jTNE_0X02.Values); | |||
JTNE_0x02_0xA1 jTNE_0X02_0XA1 = JTNESerializer.Deserialize<JTNE_0x02_0xA1>(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_0xA2>(jTNE_0X02.CusotmValues[0xA2]); | |||
Assert.Equal(0xA2, jTNE_0X02_0XA2.TypeCode); | |||
Assert.Equal(20, jTNE_0X02_0XA2.Length); | |||
Assert.Equal("小池有限公司", jTNE_0X02_0XA2.CompanyName); | |||
} | |||
} | |||
/// <summary> | |||
///自定义0xA1消息 | |||
/// </summary> | |||
[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; } | |||
} | |||
/// <summary> | |||
///自定义0xA2消息 | |||
/// </summary> | |||
[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; } | |||
} | |||
/// <summary> | |||
/// 自定义0xA1消息序列化器 | |||
/// </summary> | |||
public class JTNE_0x02_0xA1_Formatter : IJTNEFormatter<JTNE_0x02_0xA1> | |||
{ | |||
public JTNE_0x02_0xA1 Deserialize(ReadOnlySpan<byte> 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; | |||
} | |||
} | |||
/// <summary> | |||
/// 自定义0xA2消息序列化器 | |||
/// </summary> | |||
public class JTNE_0x02_0xA2_Formatter : IJTNEFormatter<JTNE_0x02_0xA2> | |||
{ | |||
public JTNE_0x02_0xA2 Deserialize(ReadOnlySpan<byte> 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; | |||
} | |||
} | |||
} |
@@ -10,17 +10,65 @@ namespace JTNE.Protocol.Formatters.MessageBodyFormatters | |||
{ | |||
public JTNE_0x02 Deserialize(ReadOnlySpan<byte> bytes, out int readSize) | |||
{ | |||
int offset = 0; | |||
int offset = 0, bodyReadSize = 0; | |||
JTNE_0x02 jTNE_0X02 = new JTNE_0x02(); | |||
jTNE_0X02.Values = new Dictionary<byte, JTNE_0x02_Body>(); | |||
jTNE_0X02.CusotmValues = new Dictionary<byte, byte[]>(); | |||
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; | |||
} | |||
} | |||
@@ -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; | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="typeCode">自定义类型编码</param> | |||
/// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x02_CustomBody</param> | |||
/// <returns></returns> | |||
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; | |||
} | |||
/// <summary> | |||
/// 设置跳过校验码 | |||
/// 场景:测试的时候,可能需要手动改数据,所以测试的时候有用 | |||
/// </summary> | |||
@@ -1,5 +1,8 @@ | |||
using JTNE.Protocol.Extensions; | |||
using System; | |||
using System.Runtime.CompilerServices; | |||
[assembly: InternalsVisibleTo("JTNE.Protocol.Test")] | |||
namespace JTNE.Protocol | |||
{ | |||
@@ -17,6 +17,10 @@ namespace JTNE.Protocol.MessageBody | |||
/// </summary> | |||
public Dictionary<byte, JTNE_0x02_Body> Values { get; set; } | |||
/// <summary> | |||
/// 用于构造序列化自定义值 | |||
/// </summary> | |||
public Dictionary<byte, JTNE_0x02_CustomBody> CusotmSerializeObjectValues { get; set; } | |||
/// <summary> | |||
/// 自定义值 | |||
/// </summary> | |||
public Dictionary<byte, byte[]> CusotmValues { get; set; } | |||
@@ -6,6 +6,9 @@ namespace JTNE.Protocol.MessageBody | |||
{ | |||
public abstract class JTNE_0x02_Body | |||
{ | |||
/// <summary> | |||
/// 类型编码 | |||
/// </summary> | |||
public abstract byte TypeCode { get; set; } | |||
/// <summary> | |||
@@ -47,19 +50,19 @@ namespace JTNE.Protocol.MessageBody | |||
static JTNE_0x02_Body() | |||
{ | |||
Keys = new Dictionary<byte, Type>(); | |||
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<byte, Type>(); | |||
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<byte, Type> Keys; | |||
internal static Dictionary<byte, Type> TypeCodes; | |||
} | |||
@@ -0,0 +1,26 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JTNE.Protocol.MessageBody | |||
{ | |||
/// <summary> | |||
/// 自定义类型数据体 | |||
/// </summary> | |||
public abstract class JTNE_0x02_CustomBody: JTNE_0x02_Body | |||
{ | |||
/// <summary> | |||
/// 自定义数据长度 | |||
/// </summary> | |||
public abstract ushort Length { get; set; } | |||
static JTNE_0x02_CustomBody() | |||
{ | |||
CustomTypeCodes = new Dictionary<byte, Type>(); | |||
} | |||
/// <summary> | |||
/// 自定义类型编码 | |||
/// </summary> | |||
internal static Dictionary<byte, Type> CustomTypeCodes; | |||
} | |||
} |