Browse Source

增加实时信息上传及自定义类型编码解析及对应单元测试

tags/1.0.0
SmallChi 6 years ago
parent
commit
9184c4fedb
10 changed files with 567 additions and 16 deletions
  1. +1
    -1
      README.md
  2. +143
    -0
      src/JTNE.Protocol.Test/MessageBody/JTNE_0x02Test.cs
  3. +170
    -0
      src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs
  4. +139
    -0
      src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs
  5. +52
    -4
      src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x02_Formatter.cs
  6. +15
    -0
      src/JTNE.Protocol/JTNEGlobalConfigs.cs
  7. +3
    -0
      src/JTNE.Protocol/JTNESerializer.cs
  8. +4
    -0
      src/JTNE.Protocol/MessageBody/JTNE_0x02.cs
  9. +14
    -11
      src/JTNE.Protocol/MessageBody/JTNE_0x02_Body.cs
  10. +26
    -0
      src/JTNE.Protocol/MessageBody/JTNE_0x02_CustomBody.cs

+ 1
- 1
README.md View File

@@ -30,7 +30,7 @@
| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 |
| :---: | :-----------: | :------: | :------: | :----------------------------: |
| 1 | 0x01 | √ | √ | 车辆登入 |
| 2 | 0x02 | x | x | 实时信息上传 |
| 2 | 0x02 | √ | √ | 实时信息上传 |
| 3 | 0x03 | x | x | 补传信息上传 |
| 4 | 0x04 | √ | √ | 车辆登出 |
| 5 | 0x05 | √ | √ | 平台登入 |


+ 143
- 0
src/JTNE.Protocol.Test/MessageBody/JTNE_0x02Test.cs View File

@@ -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);
}
}
}

+ 170
- 0
src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs View File

@@ -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);
}

}
}

+ 139
- 0
src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs View File

@@ -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;
}
}

}

+ 52
- 4
src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x02_Formatter.cs View File

@@ -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;
}
}


+ 15
- 0
src/JTNE.Protocol/JTNEGlobalConfigs.cs View File

@@ -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>


+ 3
- 0
src/JTNE.Protocol/JTNESerializer.cs View File

@@ -1,5 +1,8 @@
using JTNE.Protocol.Extensions;
using System;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("JTNE.Protocol.Test")]

namespace JTNE.Protocol
{


+ 4
- 0
src/JTNE.Protocol/MessageBody/JTNE_0x02.cs View File

@@ -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; }


+ 14
- 11
src/JTNE.Protocol/MessageBody/JTNE_0x02_Body.cs View File

@@ -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;


}


+ 26
- 0
src/JTNE.Protocol/MessageBody/JTNE_0x02_CustomBody.cs View File

@@ -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;
}
}

Loading…
Cancel
Save