@@ -30,7 +30,7 @@ | |||||
| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 | | | 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 | | ||||
| :---: | :-----------: | :------: | :------: | :----------------------------: | | | :---: | :-----------: | :------: | :------: | :----------------------------: | | ||||
| 1 | 0x01 | √ | √ | 车辆登入 | | | 1 | 0x01 | √ | √ | 车辆登入 | | ||||
| 2 | 0x02 | x | x | 实时信息上传 | | |||||
| 2 | 0x02 | √ | √ | 实时信息上传 | | |||||
| 3 | 0x03 | x | x | 补传信息上传 | | | 3 | 0x03 | x | x | 补传信息上传 | | ||||
| 4 | 0x04 | √ | √ | 车辆登出 | | | 4 | 0x04 | √ | √ | 车辆登出 | | ||||
| 5 | 0x05 | √ | √ | 平台登入 | | | 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) | 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 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; | readSize = offset; | ||||
return jTNE_0X02; | return jTNE_0X02; | ||||
} | } | ||||
public int Serialize(ref byte[] bytes, int offset, JTNE_0x02 value) | 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; | return offset; | ||||
} | } | ||||
} | } | ||||
@@ -1,5 +1,6 @@ | |||||
using JTNE.Protocol.Interfaces; | using JTNE.Protocol.Interfaces; | ||||
using JTNE.Protocol.Internal; | using JTNE.Protocol.Internal; | ||||
using JTNE.Protocol.MessageBody; | |||||
using System; | using System; | ||||
using System.Text; | using System.Text; | ||||
@@ -86,6 +87,20 @@ namespace JTNE.Protocol | |||||
return instance.Value; | return instance.Value; | ||||
} | } | ||||
/// <summary> | /// <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> | /// </summary> | ||||
@@ -1,5 +1,8 @@ | |||||
using JTNE.Protocol.Extensions; | using JTNE.Protocol.Extensions; | ||||
using System; | using System; | ||||
using System.Runtime.CompilerServices; | |||||
[assembly: InternalsVisibleTo("JTNE.Protocol.Test")] | |||||
namespace JTNE.Protocol | namespace JTNE.Protocol | ||||
{ | { | ||||
@@ -17,6 +17,10 @@ namespace JTNE.Protocol.MessageBody | |||||
/// </summary> | /// </summary> | ||||
public Dictionary<byte, JTNE_0x02_Body> Values { get; set; } | public Dictionary<byte, JTNE_0x02_Body> Values { get; set; } | ||||
/// <summary> | /// <summary> | ||||
/// 用于构造序列化自定义值 | |||||
/// </summary> | |||||
public Dictionary<byte, JTNE_0x02_CustomBody> CusotmSerializeObjectValues { get; set; } | |||||
/// <summary> | |||||
/// 自定义值 | /// 自定义值 | ||||
/// </summary> | /// </summary> | ||||
public Dictionary<byte, byte[]> CusotmValues { get; set; } | public Dictionary<byte, byte[]> CusotmValues { get; set; } | ||||
@@ -6,6 +6,9 @@ namespace JTNE.Protocol.MessageBody | |||||
{ | { | ||||
public abstract class JTNE_0x02_Body | public abstract class JTNE_0x02_Body | ||||
{ | { | ||||
/// <summary> | |||||
/// 类型编码 | |||||
/// </summary> | |||||
public abstract byte TypeCode { get; set; } | public abstract byte TypeCode { get; set; } | ||||
/// <summary> | /// <summary> | ||||
@@ -47,19 +50,19 @@ namespace JTNE.Protocol.MessageBody | |||||
static JTNE_0x02_Body() | 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; | |||||
} | |||||
} |