소스 검색

fix Property EncryptMethod to JTNEEncryptMethod, Allow JTNEGlobalConfigs Set Encoding

pull/1/head
zwq00000 4 년 전
부모
커밋
759506b7a6
13개의 변경된 파일206개의 추가작업 그리고 252개의 파일을 삭제
  1. +51
    -55
      src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs
  2. +1
    -0
      src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs
  3. +1
    -0
      src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs
  4. +1
    -1
      src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs
  5. +8
    -8
      src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs
  6. +25
    -29
      src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs
  7. +1
    -1
      src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs
  8. +62
    -86
      src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs
  9. +4
    -3
      src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x05_Formatter.cs
  10. +4
    -7
      src/JTNE.Protocol/JTNE.Protocol.csproj
  11. +42
    -60
      src/JTNE.Protocol/JTNEGlobalConfigs.cs
  12. +2
    -1
      src/JTNE.Protocol/JTNEPackage.cs
  13. +4
    -1
      src/JTNE.Protocol/MessageBody/JTNE_0x05.cs

+ 51
- 55
src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs 파일 보기

@@ -1,83 +1,79 @@
using JTNE.Protocol.Enums;
using System;
using System.Collections.Generic;
using System.Text;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Extensions;
using JTNE.Protocol.MessageBody;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using Xunit.Abstractions;

namespace JTNE.Protocol.Test
{
public class JTNEHeaderPackageTest
{
namespace JTNE.Protocol.Test {
public class JTNEHeaderPackageTest {
private readonly ITestOutputHelper output;

public JTNEHeaderPackageTest(ITestOutputHelper outputHelper)
{
public JTNEHeaderPackageTest (ITestOutputHelper outputHelper) {
this.output = outputHelper;
}

[Fact]
public void Test1()
{
JTNEHeaderPackage jTNEHeaderPackage = new JTNEHeaderPackage();
public void Test1 () {
JTNEHeaderPackage jTNEHeaderPackage = new JTNEHeaderPackage ();
jTNEHeaderPackage.VIN = "123456789";
jTNEHeaderPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEHeaderPackage.MsgId = JTNEMsgId.login.ToByteValue();
JTNE_0x01 jTNE_0X01 = new JTNE_0x01();
jTNE_0X01.PDATime = DateTime.Parse("2019-01-22 23:55:56");
jTNEHeaderPackage.AskId = JTNEAskId.CMD.ToByteValue ();
jTNEHeaderPackage.MsgId = JTNEMsgId.login.ToByteValue ();
JTNE_0x01 jTNE_0X01 = new JTNE_0x01 ();
jTNE_0X01.PDATime = DateTime.Parse ("2019-01-22 23:55:56");
jTNE_0X01.LoginNum = 1;
jTNE_0X01.BatteryLength = 0x04;
jTNE_0X01.SIM = "12345678998765432100";
jTNE_0X01.BatteryNos = new List<string>()
{
"1234",
"4567",
"9870"
jTNE_0X01.BatteryNos = new List<string> () {
"1234",
"4567",
"9870"
};
jTNEHeaderPackage.Bodies = JTNESerializer.Serialize(jTNE_0X01);
var hex = JTNESerializer.Serialize(jTNEHeaderPackage).ToHexString();
Assert.Equal("232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD", hex);
jTNEHeaderPackage.Bodies = JTNESerializer.Serialize (jTNE_0X01);
var hex = JTNESerializer.Serialize (jTNEHeaderPackage).ToHexString ();
Assert.Equal ("232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD", hex);
}

[Fact]
public void Test2()
{
var data= "232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD".ToHexBytes();
JTNEHeaderPackage jTNEHeaderPackage = JTNESerializer.Deserialize<JTNEHeaderPackage>(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEHeaderPackage.AskId);
Assert.Equal(JTNEMsgId.login.ToByteValue(), jTNEHeaderPackage.MsgId);
Assert.Equal("123456789", jTNEHeaderPackage.VIN);
JTNE_0x01 jTNE_0X01 = JTNESerializer.Deserialize<JTNE_0x01>(jTNEHeaderPackage.Bodies);
Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X01.PDATime);
Assert.Equal(1, jTNE_0X01.LoginNum);
Assert.Equal(0x04, jTNE_0X01.BatteryLength);
Assert.Equal("12345678998765432100", jTNE_0X01.SIM);
Assert.Equal(3, jTNE_0X01.BatteryCount);
Assert.Equal("1234", jTNE_0X01.BatteryNos[0]);
Assert.Equal("4567", jTNE_0X01.BatteryNos[1]);
Assert.Equal("9870", jTNE_0X01.BatteryNos[2]);
public void Test2 () {
var data = "232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD".ToHexBytes ();
JTNEHeaderPackage jTNEHeaderPackage = JTNESerializer.Deserialize<JTNEHeaderPackage> (data);
Assert.Equal (JTNEAskId.CMD.ToByteValue (), jTNEHeaderPackage.AskId);
Assert.Equal (JTNEMsgId.login.ToByteValue (), jTNEHeaderPackage.MsgId);
Assert.Equal ("123456789", jTNEHeaderPackage.VIN);
JTNE_0x01 jTNE_0X01 = JTNESerializer.Deserialize<JTNE_0x01> (jTNEHeaderPackage.Bodies);
Assert.Equal (DateTime.Parse ("2019-01-22 23:55:56"), jTNE_0X01.PDATime);
Assert.Equal (1, jTNE_0X01.LoginNum);
Assert.Equal (0x04, jTNE_0X01.BatteryLength);
Assert.Equal ("12345678998765432100", jTNE_0X01.SIM);
Assert.Equal (3, jTNE_0X01.BatteryCount);
Assert.Equal ("1234", jTNE_0X01.BatteryNos[0]);
Assert.Equal ("4567", jTNE_0X01.BatteryNos[1]);
Assert.Equal ("9870", jTNE_0X01.BatteryNos[2]);
}

[Fact]
public void TestGuangtai(){
var data = "23 23 05 FE 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 31 31 01 29 00 14 07 14 13 26 22 00 01 CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB B3 B5 C1 AA CD F2 01 02 01 A1".ToHexBytes();
var package = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), package.AskId);
Assert.Equal(JTNEMsgId.platformlogin.ToByteValue(), package.MsgId);
Assert.Equal(41,package.DataUnitLength);
Assert.NotNull(package.Bodies);
[Fact]
public void TestGuangtai () {
JTNEGlobalConfigs.Instance.Encoding = Encoding.GetEncoding ("GB18030");
var data = "23 23 05 FE 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 31 31 01 00 29 14 07 14 13 26 22 00 01 CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB B3 B5 C1 AA CD F2 01 02 01 A1".ToHexBytes ();
var package = JTNESerializer.Deserialize (data);
Assert.Equal (JTNEAskId.CMD.ToByteValue (), package.AskId);
Assert.Equal (JTNEMsgId.platformlogin.ToByteValue (), package.MsgId);
Assert.Equal (41, package.DataUnitLength);
Assert.NotNull (package.Bodies);

Assert.IsType<JTNE_0x05>(package.Bodies);
Assert.IsType<JTNE_0x05> (package.Bodies);

output.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(package.Bodies,Formatting.Indented));
output.WriteLine (Newtonsoft.Json.JsonConvert.SerializeObject (package.Bodies, Formatting.Indented));

var loginbody = (JTNE_0x05) package.Bodies;
Assert.Equal("威海广泰空港",loginbody.PlatformUserName);
Assert.Equal(256,loginbody.LoginNum);
Assert.Equal ("威海广泰空港", loginbody.PlatformUserName);
Assert.Equal (1, loginbody.LoginNum);
Assert.Equal (JTNEEncryptMethod.None, loginbody.EncryptMethod);

}
}
}
}
}

+ 1
- 0
src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs 파일 보기

@@ -95,6 +95,7 @@ namespace JTNE.Protocol.Test.MessageBody
{
JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1));
JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2));
JTNEGlobalConfigs.Instance.Encoding = Encoding.UTF8;

var data = "01040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000".ToHexBytes();
JTNE_0x02 jTNE_0X02 = JTNESerializer.Deserialize<JTNE_0x02>(data);


+ 1
- 0
src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs 파일 보기

@@ -39,6 +39,7 @@ namespace JTNE.Protocol.Test.MessageBody
{
JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1));
JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2));
JTNEGlobalConfigs.Instance.Encoding = Encoding.UTF8;

var data = "A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000".ToHexBytes();
JTNE_0x02 jTNE_0X02 = JTNESerializer.Deserialize<JTNE_0x02>(data);


+ 1
- 1
src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs 파일 보기

@@ -31,7 +31,7 @@ namespace JTNE.Protocol.Test.MessageBody
Assert.Equal(6666, jTNE_0X05.LoginNum);
Assert.Equal("SmallChi518", jTNE_0X05.PlatformUserName);
Assert.Equal("1234567890123456789", jTNE_0X05.PlatformPassword);
Assert.Equal(0x00, jTNE_0X05.EncryptMethod);
Assert.Equal(0x00, (byte)jTNE_0X05.EncryptMethod);
}
}
}

+ 8
- 8
src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs 파일 보기

@@ -57,11 +57,11 @@ namespace JTNE.Protocol.Test.Package
[Fact]
public void Test3()
{
JTNEGlobalConfigs.Instance.SetDataBodiesEncrypt((msgId)=>
JTNEGlobalConfigs.Instance.SetDataBodiesEncrypt((encryptMethod)=>
{
switch (msgId)
switch (encryptMethod)
{
case 0x03:
case JTNEEncryptMethod.AES128:
return new Default_AES128EncryptImpl();
default:
return default;
@@ -71,7 +71,7 @@ namespace JTNE.Protocol.Test.Package
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.login.ToByteValue();
jTNEPackage.VIN = "123456789";
jTNEPackage.EncryptMethod = JTNEEncryptMethod.AES128.ToByteValue();
jTNEPackage.EncryptMethod = JTNEEncryptMethod.AES128;
JTNE_0x01 jTNE_0X01 = new JTNE_0x01();
jTNE_0X01.PDATime = DateTime.Parse("2019-01-22 23:55:56");
jTNE_0X01.LoginNum = 1;
@@ -91,11 +91,11 @@ namespace JTNE.Protocol.Test.Package
[Fact]
public void Test4()
{
JTNEGlobalConfigs.Instance.SetDataBodiesEncrypt((msgId) =>
JTNEGlobalConfigs.Instance.SetDataBodiesEncrypt((encryptMethod) =>
{
switch (msgId)
switch (encryptMethod)
{
case 0x03:
case JTNEEncryptMethod.AES128:
return new Default_AES128EncryptImpl();
default:
return default;
@@ -106,7 +106,7 @@ namespace JTNE.Protocol.Test.Package
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.login.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);
Assert.Equal(JTNEEncryptMethod.AES128.ToByteValue(), jTNEPackage.EncryptMethod);
Assert.Equal(JTNEEncryptMethod.AES128, jTNEPackage.EncryptMethod);

JTNE_0x01 jTNE_0X01 = jTNEPackage.Bodies as JTNE_0x01;
Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X01.PDATime);


+ 25
- 29
src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs 파일 보기

@@ -1,46 +1,42 @@
using JTNE.Protocol.Extensions;
using System;
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Extensions;
using JTNE.Protocol.MessageBody;
using Xunit;

namespace JTNE.Protocol.Test.Package
{
public class JTNE_0x05_PackageTest
{
namespace JTNE.Protocol.Test.Package {
public class JTNE_0x05_PackageTest {
[Fact]
public void Test1()
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.platformlogin.ToByteValue();
public void Test1 () {
JTNEPackage jTNEPackage = new JTNEPackage ();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue ();
jTNEPackage.MsgId = JTNEMsgId.platformlogin.ToByteValue ();
jTNEPackage.VIN = "123456789";
JTNE_0x05 jTNE_0X05 = new JTNE_0x05();
jTNE_0X05.LoginTime = DateTime.Parse("2019-01-23 23:55:56");
JTNE_0x05 jTNE_0X05 = new JTNE_0x05 ();
jTNE_0X05.LoginTime = DateTime.Parse ("2019-01-23 23:55:56");
jTNE_0X05.LoginNum = 6666;
jTNE_0X05.PlatformUserName = "SmallChi518";
jTNE_0X05.PlatformPassword = "1234567890123456789";
jTNEPackage.Bodies = jTNE_0X05;
var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString();
Assert.Equal("232305FE31323334353637383900000000000000000100291301171737381A0A536D616C6C43686935313800313233343536373839303132333435363738390001FF", hex);
var hex = JTNESerializer.Serialize (jTNEPackage).ToHexString ();
Assert.Equal ("232305FE31323334353637383900000000000000000100291301171737381A0A536D616C6C43686935313800313233343536373839303132333435363738390001FF", hex);
}

[Fact]
public void Test2()
{
var data = "232305FE31323334353637383900000000000000000100291301171737381A0A536D616C6C43686935313800313233343536373839303132333435363738390001FF".ToHexBytes();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.platformlogin.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);
public void Test2 () {
var data = "232305FE31323334353637383900000000000000000100291301171737381A0A536D616C6C43686935313800313233343536373839303132333435363738390001FF".ToHexBytes ();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize (data);
Assert.Equal (JTNEAskId.CMD.ToByteValue (), jTNEPackage.AskId);
Assert.Equal (JTNEMsgId.platformlogin.ToByteValue (), jTNEPackage.MsgId);
Assert.Equal ("123456789", jTNEPackage.VIN);
JTNE_0x05 jTNE_0X05 = jTNEPackage.Bodies as JTNE_0x05;
Assert.Equal(DateTime.Parse("2019-01-23 23:55:56"), jTNE_0X05.LoginTime);
Assert.Equal(6666, jTNE_0X05.LoginNum);
Assert.Equal("SmallChi518", jTNE_0X05.PlatformUserName);
Assert.Equal("1234567890123456789", jTNE_0X05.PlatformPassword);
Assert.Equal(0x01, jTNE_0X05.EncryptMethod);
Assert.Equal (DateTime.Parse ("2019-01-23 23:55:56"), jTNE_0X05.LoginTime);
Assert.Equal (6666, jTNE_0X05.LoginNum);
Assert.Equal ("SmallChi518", jTNE_0X05.PlatformUserName);
Assert.Equal ("1234567890123456789", jTNE_0X05.PlatformPassword);
Assert.Equal (JTNEEncryptMethod.None, jTNE_0X05.EncryptMethod);
}
}
}
}

+ 1
- 1
src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs 파일 보기

@@ -24,7 +24,7 @@ namespace JTNE.Protocol.Extensions
public static ushort ReadUInt16Little(ReadOnlySpan<byte> read, ref int offset)
{
//ushort value = (ushort)((read[offset] << 8) | (read[offset + 1]));
var value = BinaryPrimitives.ReadUInt16LittleEndian(read.Slice(offset,2));
var value = BinaryPrimitives.ReadUInt16BigEndian(read.Slice(offset,2)); // BinaryPrimitives.ReadUInt16LittleEndian(read.Slice(offset,2));
offset = offset + 2;
return value;
}


+ 62
- 86
src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs 파일 보기

@@ -1,156 +1,132 @@
using JTNE.Protocol.Enums;
using System;
using System.Collections.Generic;
using System.Text;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Exceptions;
using JTNE.Protocol.Extensions;
using JTNE.Protocol.Internal;
using System;
using System.Collections.Generic;
using System.Text;

namespace JTNE.Protocol.Formatters
{
public class JTNEPackageFormatter : IJTNEFormatter<JTNEPackage>
{
namespace JTNE.Protocol.Formatters {
public class JTNEPackageFormatter : IJTNEFormatter<JTNEPackage> {
private const byte FixedDataBodyLength = 2;

public JTNEPackage Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
{
public JTNEPackage Deserialize (ReadOnlySpan<byte> bytes, out int readSize) {
int offset = 0;
// 1.进行固定头校验
if (bytes[offset] != JTNEPackage.BeginFlag && bytes[offset + 1] == JTNEPackage.BeginFlag)
throw new JTNEException(JTNEErrorCode.BeginFlagError, $"{bytes[offset]},{bytes[offset + 1]}");
throw new JTNEException (JTNEErrorCode.BeginFlagError, $"{bytes[offset]},{bytes[offset + 1]}");
// 2.进行BCC校验码
// 校验位 = 报文长度 - 最后一位(校验位)
if (!JTNEGlobalConfigs.Instance.SkipCRCCode)
{
if (!JTNEGlobalConfigs.Instance.SkipCRCCode) {
byte bCCCode = bytes[bytes.Length - 1];
byte bCCCode2 = bytes.ToXor(2, bytes.Length - 1);
byte bCCCode2 = bytes.ToXor (2, bytes.Length - 1);
if (bCCCode != bCCCode2)
throw new JTNEException(JTNEErrorCode.BCCCodeError, $"request:{bCCCode}!=calculate:{bCCCode2}");
throw new JTNEException (JTNEErrorCode.BCCCodeError, $"request:{bCCCode}!=calculate:{bCCCode2}");
}
JTNEPackage jTNEPackage = new JTNEPackage();
JTNEPackage jTNEPackage = new JTNEPackage ();
offset += 2;
// 3.命令标识
jTNEPackage.MsgId = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
jTNEPackage.MsgId = JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
// 4.应答标识
jTNEPackage.AskId = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
jTNEPackage.AskId = JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
// 5.VIN
jTNEPackage.VIN = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, 17);
jTNEPackage.VIN = JTNEBinaryExtensions.ReadStringLittle (bytes, ref offset, 17);
// 6.数据加密方式
jTNEPackage.EncryptMethod = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
jTNEPackage.EncryptMethod = (JTNEEncryptMethod) JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
// 7.数据单元长度是数据单元的总字节数
jTNEPackage.DataUnitLength = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
jTNEPackage.DataUnitLength = JTNEBinaryExtensions.ReadUInt16Little (bytes, ref offset);
// 8.数据体
// 8.1.根据数据加密方式进行解码
// 8.2.解析出对应数据体
if (jTNEPackage.DataUnitLength > 0)
{
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId(jTNEPackage.MsgId);
if (jTNEBodiesImplType != null)
{
if (jTNEPackage.DataUnitLength > 0) {
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId (jTNEPackage.MsgId);
if (jTNEBodiesImplType != null) {
int bodyReadSize = 0;
try
{
if (jTNEPackage.EncryptMethod == 0x01)
{
jTNEPackage.Bodies = JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(
JTNEFormatterExtensions.GetFormatter(jTNEBodiesImplType),
bytes.Slice(offset, jTNEPackage.DataUnitLength),
try {
if (jTNEPackage.EncryptMethod == JTNEEncryptMethod.None) {
jTNEPackage.Bodies = JTNEFormatterResolverExtensions.JTNEDynamicDeserialize (
JTNEFormatterExtensions.GetFormatter (jTNEBodiesImplType),
bytes.Slice (offset, jTNEPackage.DataUnitLength),
out bodyReadSize);
}
else
{
if (JTNEGlobalConfigs.Instance.DataBodiesEncrypt != null)
{
var data = JTNEGlobalConfigs.Instance.DataBodiesEncrypt(jTNEPackage.EncryptMethod)
.Decrypt(bytes.Slice(offset, jTNEPackage.DataUnitLength).ToArray());
jTNEPackage.Bodies = JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(
JTNEFormatterExtensions.GetFormatter(jTNEBodiesImplType),
} else {
if (JTNEGlobalConfigs.Instance.DataBodiesEncrypt != null) {
var data = JTNEGlobalConfigs.Instance.DataBodiesEncrypt (jTNEPackage.EncryptMethod)
.Decrypt (bytes.Slice (offset, jTNEPackage.DataUnitLength).ToArray ());
jTNEPackage.Bodies = JTNEFormatterResolverExtensions.JTNEDynamicDeserialize (
JTNEFormatterExtensions.GetFormatter (jTNEBodiesImplType),
data,
out bodyReadSize);
}
}
}
catch (Exception ex)
{
throw new JTNEException(JTNEErrorCode.BodiesParseError, ex);
} catch (Exception ex) {
throw new JTNEException (JTNEErrorCode.BodiesParseError, ex);
}
offset += bodyReadSize;
}
}
// 9.校验码
jTNEPackage.BCCCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
jTNEPackage.BCCCode = JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
readSize = offset;
return jTNEPackage;
}

public int Serialize(ref byte[] bytes, int offset, JTNEPackage value)
{
public int Serialize (ref byte[] bytes, int offset, JTNEPackage value) {
// 1.起始符1
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.BeginFlag1);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, value.BeginFlag1);
// 2.起始符2
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.BeginFlag2);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, value.BeginFlag2);
// 3.命令标识
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.MsgId);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, value.MsgId);
// 4.应答标识
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.AskId);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, value.AskId);
// 5.VIN
offset += JTNEBinaryExtensions.WriteStringPadRightLittle(bytes, offset, value.VIN, 17);
offset += JTNEBinaryExtensions.WriteStringPadRightLittle (bytes, offset, value.VIN, 17);
// 6.数据加密方式
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.EncryptMethod);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, (byte) value.EncryptMethod);
// 7.记录当前偏移量
int tmpOffset = offset;
// 8.数据体
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId(value.MsgId);
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId (value.MsgId);
int messageBodyOffset = 0;
if (jTNEBodiesImplType != null)
{
if (value.Bodies != null)
{
if (jTNEBodiesImplType != null) {
if (value.Bodies != null) {
// 8.1.处理数据体
// 8.2.判断是否有加密
messageBodyOffset = JTNEFormatterResolverExtensions.JTNEDynamicSerialize(
JTNEFormatterExtensions.GetFormatter(jTNEBodiesImplType),
messageBodyOffset = JTNEFormatterResolverExtensions.JTNEDynamicSerialize (
JTNEFormatterExtensions.GetFormatter (jTNEBodiesImplType),
ref bytes,
offset + FixedDataBodyLength,
value.Bodies);
if (value.EncryptMethod == 0x01)
{
if (value.EncryptMethod == JTNEEncryptMethod.None) {
// 9.通过tmpOffset反写数据单元长度
JTNEBinaryExtensions.WriteUInt16Little(bytes, tmpOffset, (ushort)(messageBodyOffset - offset- FixedDataBodyLength));
JTNEBinaryExtensions.WriteUInt16Little (bytes, tmpOffset, (ushort) (messageBodyOffset - offset - FixedDataBodyLength));
offset = messageBodyOffset;
}
else
{
if (JTNEGlobalConfigs.Instance.DataBodiesEncrypt != null)
{
} else {
if (JTNEGlobalConfigs.Instance.DataBodiesEncrypt != null) {
// 8.1.先进行分割数据体
var bodiesData = bytes.AsSpan(tmpOffset+ FixedDataBodyLength, messageBodyOffset - offset - FixedDataBodyLength).ToArray();
var bodiesData = bytes.AsSpan (tmpOffset + FixedDataBodyLength, messageBodyOffset - offset - FixedDataBodyLength).ToArray ();
// 8.2.将数据体进行加密
var data = JTNEGlobalConfigs.Instance.DataBodiesEncrypt(value.EncryptMethod)
.Encrypt(bodiesData);
var data = JTNEGlobalConfigs.Instance.DataBodiesEncrypt (value.EncryptMethod)
.Encrypt (bodiesData);
// 9.通过tmpOffset反写加密后数据单元长度
JTNEBinaryExtensions.WriteUInt16Little(bytes, tmpOffset, (ushort)data.Length);
JTNEBinaryExtensions.WriteUInt16Little (bytes, tmpOffset, (ushort) data.Length);
// 8.3.写入加密后的数据体
offset += FixedDataBodyLength;
offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, data);
offset += JTNEBinaryExtensions.WriteBytesLittle (bytes, offset, data);
}
}
}
else
{
} else {
// 9.数据单元长度
offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, 0);
offset += JTNEBinaryExtensions.WriteUInt16Little (bytes, offset, 0);
}
}
else
{
} else {
// 9.数据单元长度
offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, 0);
offset += JTNEBinaryExtensions.WriteUInt16Little (bytes, offset, 0);
}
// 10.校验码
var bccCode = bytes.ToXor(2, offset);
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, bccCode);
var bccCode = bytes.ToXor (2, offset);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, bccCode);
return offset;
}
}
}
}

+ 4
- 3
src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x05_Formatter.cs 파일 보기

@@ -1,4 +1,5 @@
using JTNE.Protocol.Extensions;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Extensions;
using JTNE.Protocol.MessageBody;
using System;
using System.Collections.Generic;
@@ -16,7 +17,7 @@ namespace JTNE.Protocol.Formatters.MessageBodyFormatters
jTNE_0X05.LoginNum = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
jTNE_0X05.PlatformUserName = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset,12);
jTNE_0X05.PlatformPassword = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, 20);
jTNE_0X05.EncryptMethod = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
jTNE_0X05.EncryptMethod = (JTNEEncryptMethod)JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
readSize = offset;
return jTNE_0X05;
}
@@ -27,7 +28,7 @@ namespace JTNE.Protocol.Formatters.MessageBodyFormatters
offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.LoginNum);
offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.PlatformUserName,12);
offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.PlatformPassword, 20);
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.EncryptMethod);
offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, (byte)value.EncryptMethod);
return offset;
}
}


+ 4
- 7
src/JTNE.Protocol/JTNE.Protocol.csproj 파일 보기

@@ -14,11 +14,12 @@
<PackageProjectUrl>https://github.com/SmallChi/JTNewEnergy</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JTNewEnergy/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.0</Version>
<Version>1.0.1</Version>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile></DocumentationFile>
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>1591</NoWarn>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
@@ -74,8 +75,4 @@
<PackageReference Include="System.Memory" Version="4.5.2" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.1" />
</ItemGroup>

<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
</Project>

+ 42
- 60
src/JTNE.Protocol/JTNEGlobalConfigs.cs 파일 보기

@@ -1,38 +1,35 @@
using JTNE.Protocol.Interfaces;
using System;
using System.Text;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Interfaces;
using JTNE.Protocol.Internal;
using JTNE.Protocol.MessageBody;
using System;
using System.Text;

namespace JTNE.Protocol
{
namespace JTNE.Protocol {
/// <summary>
///
/// </summary>
public class JTNEGlobalConfigs
{
private static readonly Lazy<JTNEGlobalConfigs> instance = new Lazy<JTNEGlobalConfigs>(() => new JTNEGlobalConfigs());
public class JTNEGlobalConfigs {
private static readonly Lazy<JTNEGlobalConfigs> instance = new Lazy<JTNEGlobalConfigs> (() => new JTNEGlobalConfigs ());

private JTNEGlobalConfigs()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding = Encoding.GetEncoding("GB18030");
private JTNEGlobalConfigs () {
Encoding.RegisterProvider (CodePagesEncodingProvider.Instance);
Encoding = Encoding.UTF8;
SkipCRCCode = false;
DeviceMsgSNDistributed = new DefaultDeviceMsgSNDistributedImpl();
PlatformMsgSNDistributed = new DefaultPlatformMsgSNDistributedImpl();
DeviceMsgSNDistributed = new DefaultDeviceMsgSNDistributedImpl ();
PlatformMsgSNDistributed = new DefaultPlatformMsgSNDistributedImpl ();
}

/// <summary>
/// 字符串编码,默认 GB18030
/// </summary>
public Encoding Encoding { get; }
public Encoding Encoding { get; set;}

/// <summary>
///
/// </summary>
public static JTNEGlobalConfigs Instance
{
get
{
public static JTNEGlobalConfigs Instance {
get {
return instance.Value;
}
}
@@ -55,23 +52,22 @@ namespace JTNE.Protocol
/// RSA=>IJTNEEncryptImpl
/// AES=>IJTNEEncryptImpl
/// </summary>
public Func<byte,IJTNEEncrypt> DataBodiesEncrypt { get; private set; }
public Func<JTNEEncryptMethod, IJTNEEncrypt> DataBodiesEncrypt { get; private set; }
/// <summary>
/// 平台登入加密算法
/// RSA=>IJTNEEncryptImpl
/// AES=>IJTNEEncryptImpl
/// </summary>
public Func<byte, IJTNEEncrypt> PlatformLoginEncrypt { get; private set; }
public Func<JTNEEncryptMethod, IJTNEEncrypt> PlatformLoginEncrypt { get; private set; }
/// <summary>
/// 注册自定义消息
/// </summary>
/// <typeparam name="TJTNEBodies"></typeparam>
/// <param name="msgId"></param>
/// <returns></returns>
public JTNEGlobalConfigs Register_CustomMsgId<TJTNEBodies>(byte customMsgId)
where TJTNEBodies : JTNEBodies
{
JTNEMsgIdFactory.SetMap<TJTNEBodies>(customMsgId);
public JTNEGlobalConfigs Register_CustomMsgId<TJTNEBodies> (byte customMsgId)
where TJTNEBodies : JTNEBodies {
JTNEMsgIdFactory.SetMap<TJTNEBodies> (customMsgId);
return instance.Value;
}
/// <summary>
@@ -80,10 +76,9 @@ namespace JTNE.Protocol
/// <typeparam name="TJTNEBodies"></typeparam>
/// <param name="overwriteMsgId"></param>
/// <returns></returns>
public JTNEGlobalConfigs Overwrite_MsgId<TJTNEBodies>(byte overwriteMsgId)
where TJTNEBodies : JTNEBodies
{
JTNEMsgIdFactory.ReplaceMap<TJTNEBodies>(overwriteMsgId);
public JTNEGlobalConfigs Overwrite_MsgId<TJTNEBodies> (byte overwriteMsgId)
where TJTNEBodies : JTNEBodies {
JTNEMsgIdFactory.ReplaceMap<TJTNEBodies> (overwriteMsgId);
return instance.Value;
}
/// <summary>
@@ -92,11 +87,9 @@ namespace JTNE.Protocol
/// <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);
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;
}
@@ -106,11 +99,9 @@ namespace JTNE.Protocol
/// <param name="typeCode">自定义类型编码</param>
/// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
/// <returns></returns>
public JTNEGlobalConfigs Register_JTNE0x81CustomBody(byte typeCode, Type type)
{
if (!JTNE_0x81_Body.JTNE_0x81Method.ContainsKey(typeCode))
{
JTNE_0x81_Body.JTNE_0x81Method.Add(typeCode, type);
public JTNEGlobalConfigs Register_JTNE0x81CustomBody (byte typeCode, Type type) {
if (!JTNE_0x81_Body.JTNE_0x81Method.ContainsKey (typeCode)) {
JTNE_0x81_Body.JTNE_0x81Method.Add (typeCode, type);
}
return instance.Value;
}
@@ -120,11 +111,9 @@ namespace JTNE.Protocol
/// <param name="typeCode">自定义类型编码</param>
/// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
/// <returns></returns>
public JTNEGlobalConfigs Register_JTNE0x81CustomDepenedBody(byte DependerParamId, byte DependedParamId)
{
if (!JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.ContainsKey(DependerParamId))
{
JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.Add(DependerParamId, DependedParamId);
public JTNEGlobalConfigs Register_JTNE0x81CustomDepenedBody (byte DependerParamId, byte DependedParamId) {
if (!JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.ContainsKey (DependerParamId)) {
JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.Add (DependerParamId, DependedParamId);
}
return instance.Value;
}
@@ -134,11 +123,9 @@ namespace JTNE.Protocol
/// <param name="typeCode">自定义类型编码</param>
/// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
/// <returns></returns>
public JTNEGlobalConfigs Register_JTNE0x82CustomBody(byte typeCode, Type type)
{
if (!JTNE_0x82_Body.JTNE_0x82Method.ContainsKey(typeCode))
{
JTNE_0x82_Body.JTNE_0x82Method.Add(typeCode, type);
public JTNEGlobalConfigs Register_JTNE0x82CustomBody (byte typeCode, Type type) {
if (!JTNE_0x82_Body.JTNE_0x82Method.ContainsKey (typeCode)) {
JTNE_0x82_Body.JTNE_0x82Method.Add (typeCode, type);
}
return instance.Value;
}
@@ -148,8 +135,7 @@ namespace JTNE.Protocol
/// </summary>
/// <param name="skipCRCCode"></param>
/// <returns></returns>
public JTNEGlobalConfigs SetSkipCRCCode(bool skipCRCCode)
{
public JTNEGlobalConfigs SetSkipCRCCode (bool skipCRCCode) {
instance.Value.SkipCRCCode = skipCRCCode;
return instance.Value;
}
@@ -158,8 +144,7 @@ namespace JTNE.Protocol
/// </summary>
/// <param name="deviceMsgSNDistributed"></param>
/// <returns></returns>
public JTNEGlobalConfigs SetDeviceMsgSNDistributed(IDeviceMsgSNDistributed deviceMsgSNDistributed)
{
public JTNEGlobalConfigs SetDeviceMsgSNDistributed (IDeviceMsgSNDistributed deviceMsgSNDistributed) {
instance.Value.DeviceMsgSNDistributed = deviceMsgSNDistributed;
return instance.Value;
}
@@ -168,8 +153,7 @@ namespace JTNE.Protocol
/// </summary>
/// <param name="platformMsgSNDistributed"></param>
/// <returns></returns>
public JTNEGlobalConfigs SetPlatformMsgSNDistributed(IPlatformMsgSNDistributed platformMsgSNDistributed)
{
public JTNEGlobalConfigs SetPlatformMsgSNDistributed (IPlatformMsgSNDistributed platformMsgSNDistributed) {
instance.Value.PlatformMsgSNDistributed = platformMsgSNDistributed;
return instance.Value;
}
@@ -178,8 +162,7 @@ namespace JTNE.Protocol
/// </summary>
/// <param name="dataBodiesEncrypt"></param>
/// <returns></returns>
public JTNEGlobalConfigs SetDataBodiesEncrypt(Func<byte, IJTNEEncrypt> dataBodiesEncrypt)
{
public JTNEGlobalConfigs SetDataBodiesEncrypt (Func<JTNEEncryptMethod, IJTNEEncrypt> dataBodiesEncrypt) {
instance.Value.DataBodiesEncrypt = dataBodiesEncrypt;
return instance.Value;
}
@@ -188,10 +171,9 @@ namespace JTNE.Protocol
/// </summary>
/// <param name="platformLoginEncrypt"></param>
/// <returns></returns>
public JTNEGlobalConfigs SetPlatformLoginEncrypt(Func<byte, IJTNEEncrypt> platformLoginEncrypt)
{
public JTNEGlobalConfigs SetPlatformLoginEncrypt (Func<JTNEEncryptMethod, IJTNEEncrypt> platformLoginEncrypt) {
instance.Value.PlatformLoginEncrypt = platformLoginEncrypt;
return instance.Value;
}
}
}
}

+ 2
- 1
src/JTNE.Protocol/JTNEPackage.cs 파일 보기

@@ -1,4 +1,5 @@
using JTNE.Protocol.Attributes;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Formatters;
using System;
using System.IO;
@@ -40,7 +41,7 @@ namespace JTNE.Protocol
/// 0x01:数据不加密;0x02:数据经过 RSA 算法加密;0x03:数据经过 AES128 位算法加密;“0xFE”表示异常,“0xFF”表示无效
/// <see cref="JTNE.Protocol.Enums.JTNEEncryptMethod"/>
/// </summary>
public byte EncryptMethod { get; set; } = 0x01;
public JTNEEncryptMethod EncryptMethod { get; set; } = JTNEEncryptMethod.None;
/// <summary>
/// 数据单元长度是数据单元的总字节数,有效值范围:0-65531
/// </summary>


+ 4
- 1
src/JTNE.Protocol/MessageBody/JTNE_0x05.cs 파일 보기

@@ -1,7 +1,9 @@
using JTNE.Protocol.Attributes;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Formatters.MessageBodyFormatters;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

namespace JTNE.Protocol.MessageBody
@@ -34,6 +36,7 @@ namespace JTNE.Protocol.MessageBody
/// 0x01:数据不加密;0x02:数据经过 RSA 算法加密;0x03:数据经过 AES128 位算法加密;“0xFE”表示异常,“0xFF”表示无效
/// <see cref="JTNE.Protocol.Enums.JTNEEncryptMethod"/>
/// </summary>
public byte EncryptMethod { get; set; } = 0x01;
[DefaultValue(JTNEEncryptMethod.None)]
public JTNEEncryptMethod EncryptMethod { get; set; } = JTNEEncryptMethod.None;
}
}

불러오는 중...
취소
저장