From 759506b7a65e46b4c988fec6cc4270ed5494370a Mon Sep 17 00:00:00 2001 From: zwq00000 Date: Tue, 21 Jul 2020 16:09:41 +0800 Subject: [PATCH] fix Property EncryptMethod to JTNEEncryptMethod, Allow JTNEGlobalConfigs Set Encoding --- .../JTNEHeaderPackageTest.cs | 106 ++++++------- .../MessageBody/JTNE_0x02_CompositeTest.cs | 1 + .../MessageBody/JTNE_0x02_CustomBodyTest.cs | 1 + .../MessageBody/JTNE_0x05Test.cs | 2 +- .../Package/JTNE_0x01_PackageTest.cs | 16 +- .../Package/JTNE_0x05_PackageTest.cs | 54 +++---- .../Extensions/JTNEBinaryExtensions.cs | 2 +- .../Formatters/JTNEPackageFormatter.cs | 148 ++++++++---------- .../JTNE_0x05_Formatter.cs | 7 +- src/JTNE.Protocol/JTNE.Protocol.csproj | 11 +- src/JTNE.Protocol/JTNEGlobalConfigs.cs | 102 +++++------- src/JTNE.Protocol/JTNEPackage.cs | 3 +- src/JTNE.Protocol/MessageBody/JTNE_0x05.cs | 5 +- 13 files changed, 206 insertions(+), 252 deletions(-) diff --git a/src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs b/src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs index 5867915..4ec5720 100644 --- a/src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs +++ b/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() - { - "1234", - "4567", - "9870" + jTNE_0X01.BatteryNos = new List () { + "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(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(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 (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 (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(package.Bodies); + Assert.IsType (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); - } + } } -} +} \ No newline at end of file diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs index c871ed0..277afd9 100644 --- a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CompositeTest.cs +++ b/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(data); diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs index 81fb27d..36f1c43 100644 --- a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x02_CustomBodyTest.cs +++ b/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(data); diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs index 4bfeb12..a89faa0 100644 --- a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs +++ b/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); } } } diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs index 7741a0c..04736e6 100644 --- a/src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs +++ b/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); diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs index e2dfdbd..2c42291 100644 --- a/src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs +++ b/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); } } -} +} \ No newline at end of file diff --git a/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs b/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs index 718b18a..43438d6 100644 --- a/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs +++ b/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs @@ -24,7 +24,7 @@ namespace JTNE.Protocol.Extensions public static ushort ReadUInt16Little(ReadOnlySpan 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; } diff --git a/src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs b/src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs index 5eee4cf..8f73403 100644 --- a/src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs +++ b/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 - { +namespace JTNE.Protocol.Formatters { + public class JTNEPackageFormatter : IJTNEFormatter { private const byte FixedDataBodyLength = 2; - public JTNEPackage Deserialize(ReadOnlySpan bytes, out int readSize) - { + public JTNEPackage Deserialize (ReadOnlySpan 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; } } -} +} \ No newline at end of file diff --git a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x05_Formatter.cs b/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x05_Formatter.cs index 1e14bde..36808fa 100644 --- a/src/JTNE.Protocol/Formatters/MessageBodyFormatters/JTNE_0x05_Formatter.cs +++ b/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; } } diff --git a/src/JTNE.Protocol/JTNE.Protocol.csproj b/src/JTNE.Protocol/JTNE.Protocol.csproj index 307c4aa..d238415 100644 --- a/src/JTNE.Protocol/JTNE.Protocol.csproj +++ b/src/JTNE.Protocol/JTNE.Protocol.csproj @@ -14,11 +14,12 @@ https://github.com/SmallChi/JTNewEnergy https://github.com/SmallChi/JTNewEnergy/blob/master/LICENSE true - 1.0.0 + 1.0.1 - - + + true + 1591 @@ -74,8 +75,4 @@ - - - - diff --git a/src/JTNE.Protocol/JTNEGlobalConfigs.cs b/src/JTNE.Protocol/JTNEGlobalConfigs.cs index c3ce772..6f45257 100644 --- a/src/JTNE.Protocol/JTNEGlobalConfigs.cs +++ b/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 { /// /// /// - public class JTNEGlobalConfigs - { - private static readonly Lazy instance = new Lazy(() => new JTNEGlobalConfigs()); + public class JTNEGlobalConfigs { + private static readonly Lazy instance = new Lazy (() => 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 (); } + /// /// 字符串编码,默认 GB18030 /// - public Encoding Encoding { get; } + public Encoding Encoding { get; set;} /// /// /// - public static JTNEGlobalConfigs Instance - { - get - { + public static JTNEGlobalConfigs Instance { + get { return instance.Value; } } @@ -55,23 +52,22 @@ namespace JTNE.Protocol /// RSA=>IJTNEEncryptImpl /// AES=>IJTNEEncryptImpl /// - public Func DataBodiesEncrypt { get; private set; } + public Func DataBodiesEncrypt { get; private set; } /// /// 平台登入加密算法 /// RSA=>IJTNEEncryptImpl /// AES=>IJTNEEncryptImpl /// - public Func PlatformLoginEncrypt { get; private set; } + public Func PlatformLoginEncrypt { get; private set; } /// /// 注册自定义消息 /// /// /// /// - public JTNEGlobalConfigs Register_CustomMsgId(byte customMsgId) - where TJTNEBodies : JTNEBodies - { - JTNEMsgIdFactory.SetMap(customMsgId); + public JTNEGlobalConfigs Register_CustomMsgId (byte customMsgId) + where TJTNEBodies : JTNEBodies { + JTNEMsgIdFactory.SetMap (customMsgId); return instance.Value; } /// @@ -80,10 +76,9 @@ namespace JTNE.Protocol /// /// /// - public JTNEGlobalConfigs Overwrite_MsgId(byte overwriteMsgId) - where TJTNEBodies : JTNEBodies - { - JTNEMsgIdFactory.ReplaceMap(overwriteMsgId); + public JTNEGlobalConfigs Overwrite_MsgId (byte overwriteMsgId) + where TJTNEBodies : JTNEBodies { + JTNEMsgIdFactory.ReplaceMap (overwriteMsgId); return instance.Value; } /// @@ -92,11 +87,9 @@ namespace JTNE.Protocol /// 自定义类型编码 /// 继承JTNE.Protocol.MessageBody.JTNE_0x02_CustomBody /// - public JTNEGlobalConfigs Register_JTNE0x02CustomBody(byte typeCode, Type type) - { - if (!JTNE_0x02_CustomBody.CustomTypeCodes.ContainsKey(typeCode)) - { - JTNE_0x02_CustomBody.CustomTypeCodes.Add(typeCode, type); + 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 /// 自定义类型编码 /// 继承JTNE.Protocol.MessageBody.JTNE_0x81_Body /// - 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 /// 自定义类型编码 /// 继承JTNE.Protocol.MessageBody.JTNE_0x81_Body /// - 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 /// 自定义类型编码 /// 继承JTNE.Protocol.MessageBody.JTNE_0x81_Body /// - 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 /// /// /// - public JTNEGlobalConfigs SetSkipCRCCode(bool skipCRCCode) - { + public JTNEGlobalConfigs SetSkipCRCCode (bool skipCRCCode) { instance.Value.SkipCRCCode = skipCRCCode; return instance.Value; } @@ -158,8 +144,7 @@ namespace JTNE.Protocol /// /// /// - public JTNEGlobalConfigs SetDeviceMsgSNDistributed(IDeviceMsgSNDistributed deviceMsgSNDistributed) - { + public JTNEGlobalConfigs SetDeviceMsgSNDistributed (IDeviceMsgSNDistributed deviceMsgSNDistributed) { instance.Value.DeviceMsgSNDistributed = deviceMsgSNDistributed; return instance.Value; } @@ -168,8 +153,7 @@ namespace JTNE.Protocol /// /// /// - public JTNEGlobalConfigs SetPlatformMsgSNDistributed(IPlatformMsgSNDistributed platformMsgSNDistributed) - { + public JTNEGlobalConfigs SetPlatformMsgSNDistributed (IPlatformMsgSNDistributed platformMsgSNDistributed) { instance.Value.PlatformMsgSNDistributed = platformMsgSNDistributed; return instance.Value; } @@ -178,8 +162,7 @@ namespace JTNE.Protocol /// /// /// - public JTNEGlobalConfigs SetDataBodiesEncrypt(Func dataBodiesEncrypt) - { + public JTNEGlobalConfigs SetDataBodiesEncrypt (Func dataBodiesEncrypt) { instance.Value.DataBodiesEncrypt = dataBodiesEncrypt; return instance.Value; } @@ -188,10 +171,9 @@ namespace JTNE.Protocol /// /// /// - public JTNEGlobalConfigs SetPlatformLoginEncrypt(Func platformLoginEncrypt) - { + public JTNEGlobalConfigs SetPlatformLoginEncrypt (Func platformLoginEncrypt) { instance.Value.PlatformLoginEncrypt = platformLoginEncrypt; return instance.Value; } } -} +} \ No newline at end of file diff --git a/src/JTNE.Protocol/JTNEPackage.cs b/src/JTNE.Protocol/JTNEPackage.cs index d65607f..345e600 100644 --- a/src/JTNE.Protocol/JTNEPackage.cs +++ b/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”表示无效 /// /// - public byte EncryptMethod { get; set; } = 0x01; + public JTNEEncryptMethod EncryptMethod { get; set; } = JTNEEncryptMethod.None; /// /// 数据单元长度是数据单元的总字节数,有效值范围:0-65531 /// diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x05.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x05.cs index 9612f4b..6379299 100644 --- a/src/JTNE.Protocol/MessageBody/JTNE_0x05.cs +++ b/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”表示无效 /// /// - public byte EncryptMethod { get; set; } = 0x01; + [DefaultValue(JTNEEncryptMethod.None)] + public JTNEEncryptMethod EncryptMethod { get; set; } = JTNEEncryptMethod.None; } }