From 340db935a7a8a632fa0c3acb4f55adec6ab91640 Mon Sep 17 00:00:00 2001 From: SmallChi <564952747@qq.com> Date: Wed, 23 Jan 2019 21:47:21 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=A4=B4=E5=8C=85=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E5=99=A8=202.=E4=BF=AE=E6=94=B9=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=97=A5=E6=9C=9F=E8=BD=AC=E6=8D=A2=E4=B8=BA10?= =?UTF-8?q?=E8=BF=9B=E5=88=B6=203.=E5=A2=9E=E5=8A=A0=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8C=85=E6=B5=8B=E8=AF=95=204.=E5=A2=9E=E5=8A=A0=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E5=8F=8A=E8=AE=BE=E5=A4=87=E6=B5=81=E6=B0=B4=E5=8F=B7?= =?UTF-8?q?=E7=9A=84=E9=BB=98=E8=AE=A4=E5=AE=9E=E7=8E=B0=205.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=BB=98=E8=AE=A4=E6=B6=88=E6=81=AF=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E5=A4=84=E7=90=86=206.=E5=A2=9E=E5=8A=A0=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8F=8A=E9=BB=98=E8=AE=A4=E9=87=8D=E5=86=99=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JTNE.Protocol.Test/JTNEPackageTest.cs | 24 ----- .../MessageBody/JTNE_0x01Test.cs | 4 +- .../MessageBody/JTNE_0x04Test.cs | 4 +- .../MessageBody/JTNE_0x05Test.cs | 4 +- .../MessageBody/JTNE_0x06Test.cs | 4 +- .../Package/JTNE_0x01_PackageTest.cs | 56 +++++++++++ .../Package/JTNE_0x04_PackageTest.cs | 41 ++++++++ .../Package/JTNE_0x05_PackageTest.cs | 46 +++++++++ .../Package/JTNE_0x06_PackageTest.cs | 41 ++++++++ .../Package/JTNE_0x07_PackageTest.cs | 35 +++++++ .../Package/JTNE_0x08_PackageTest.cs | 35 +++++++ src/JTNE.Protocol/Enums/JTNEErrorCode.cs | 6 +- src/JTNE.Protocol/Enums/JTNEMsgId.cs | 10 +- src/JTNE.Protocol/Exceptions/JTNEException.cs | 9 ++ .../Extensions/JTNEDateTimeExtensions.cs | 8 +- .../Extensions/JTNEPackageExtensions.cs | 93 ++++++++++++++++++ .../Formatters/JTNEHeaderPackageFormatter.cs | 97 +++++++++++++++++++ .../Formatters/JTNEPackageFormatter.cs | 64 +++++++++--- .../Interfaces/IDeviceMsgSNDistributed.cs | 14 +++ .../Interfaces/IMsgSNDistributed.cs | 18 ++++ .../Interfaces/IPlatformMsgSNDistributed.cs | 14 +++ .../DefaultDeviceMsgSNDistributedImpl.cs | 18 ++++ .../DefaultPlatformMsgSNDistributedImpl.cs | 18 ++++ .../Internal/JTNEMsgIdFactory.cs | 48 +++++++++ src/JTNE.Protocol/JTNE.Protocol.csproj | 2 +- src/JTNE.Protocol/JTNE.Protocol.xml | 56 ----------- src/JTNE.Protocol/JTNEGlobalConfigs.cs | 59 ++++++++++- src/JTNE.Protocol/JTNEHeaderPackage.cs | 56 +++++++++++ src/JTNE.Protocol/JTNEPackage.cs | 15 +-- src/JTNE.Protocol/MessageBody/JTNE_0x05.cs | 6 +- 30 files changed, 783 insertions(+), 122 deletions(-) delete mode 100644 src/JTNE.Protocol.Test/JTNEPackageTest.cs create mode 100644 src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs create mode 100644 src/JTNE.Protocol.Test/Package/JTNE_0x04_PackageTest.cs create mode 100644 src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs create mode 100644 src/JTNE.Protocol.Test/Package/JTNE_0x06_PackageTest.cs create mode 100644 src/JTNE.Protocol.Test/Package/JTNE_0x07_PackageTest.cs create mode 100644 src/JTNE.Protocol.Test/Package/JTNE_0x08_PackageTest.cs create mode 100644 src/JTNE.Protocol/Extensions/JTNEPackageExtensions.cs create mode 100644 src/JTNE.Protocol/Formatters/JTNEHeaderPackageFormatter.cs create mode 100644 src/JTNE.Protocol/Interfaces/IDeviceMsgSNDistributed.cs create mode 100644 src/JTNE.Protocol/Interfaces/IMsgSNDistributed.cs create mode 100644 src/JTNE.Protocol/Interfaces/IPlatformMsgSNDistributed.cs create mode 100644 src/JTNE.Protocol/Internal/DefaultDeviceMsgSNDistributedImpl.cs create mode 100644 src/JTNE.Protocol/Internal/DefaultPlatformMsgSNDistributedImpl.cs create mode 100644 src/JTNE.Protocol/Internal/JTNEMsgIdFactory.cs delete mode 100644 src/JTNE.Protocol/JTNE.Protocol.xml create mode 100644 src/JTNE.Protocol/JTNEHeaderPackage.cs diff --git a/src/JTNE.Protocol.Test/JTNEPackageTest.cs b/src/JTNE.Protocol.Test/JTNEPackageTest.cs deleted file mode 100644 index 1c5d642..0000000 --- a/src/JTNE.Protocol.Test/JTNEPackageTest.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using JTNE.Protocol.Extensions; -using JTNE.Protocol.Enums; - -namespace JTNE.Protocol.Test -{ - public class JTNEPackageTest - { - [Fact] - public void Test1() - { - var hex = "23 23 05 FE 4C 47 48 43 34 56 31 44 33 48 45 32 30 32 36 35 32 01 00 08 12 06 08 12 06 3A 00 01 E9".ToHexBytes(); - var package = JTNESerializer.Deserialize(hex); - Assert.Equal("LGHC4V1D3HE202652", package.VIN); - Assert.Equal(JTNEAskId.CMD.ToByteValue(), package.AskId); - Assert.Equal((ushort)8, package.DataUnitLength); - Assert.Equal(0x01, package.EncryptMethod); - Assert.Equal(JTNEMsgId.platformlogin.ToByteValue(), package.MsgId); - } - } -} diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x01Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x01Test.cs index fcf9092..7390f91 100644 --- a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x01Test.cs +++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x01Test.cs @@ -24,13 +24,13 @@ namespace JTNE.Protocol.Test.MessageBody "9870" }; var hex = JTNESerializer.Serialize(jTNE_0X01).ToHexString(); - Assert.Equal("190122235556000131323334353637383939383736353433323130300304313233343435363739383730", hex); + Assert.Equal("130116173738000131323334353637383939383736353433323130300304313233343435363739383730", hex); } [Fact] public void Test2() { - var data = "190122235556000131323334353637383939383736353433323130300304313233343435363739383730".ToHexBytes(); + var data = "130116173738000131323334353637383939383736353433323130300304313233343435363739383730".ToHexBytes(); JTNE_0x01 jTNE_0X01 = JTNESerializer.Deserialize(data); Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X01.PDATime); Assert.Equal(1, jTNE_0X01.LoginNum); diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x04Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x04Test.cs index 451746f..a9779a9 100644 --- a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x04Test.cs +++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x04Test.cs @@ -16,13 +16,13 @@ namespace JTNE.Protocol.Test.MessageBody jTNE_0X04.LogoutTime = DateTime.Parse("2019-01-22 23:55:56"); jTNE_0X04.LogoutNum = 4444; var hex = JTNESerializer.Serialize(jTNE_0X04).ToHexString(); - Assert.Equal("190122235556115C", hex); + Assert.Equal("130116173738115C", hex); } [Fact] public void Test2() { - var data = "190122235556115C".ToHexBytes(); + var data = "130116173738115C".ToHexBytes(); JTNE_0x04 jTNE_0X04 = JTNESerializer.Deserialize(data); Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X04.LogoutTime); Assert.Equal(4444, jTNE_0X04.LogoutNum); diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs index 63c35ed..4bfeb12 100644 --- a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs +++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x05Test.cs @@ -19,13 +19,13 @@ namespace JTNE.Protocol.Test.MessageBody jTNE_0X05.PlatformPassword = "1234567890123456789"; jTNE_0X05.EncryptMethod = 0x00; var hex = JTNESerializer.Serialize(jTNE_0X05).ToHexString(); - Assert.Equal("1901222355561A0A536D616C6C43686935313800313233343536373839303132333435363738390000", hex); + Assert.Equal("1301161737381A0A536D616C6C43686935313800313233343536373839303132333435363738390000", hex); } [Fact] public void Test2() { - var data = "1901222355561A0A536D616C6C43686935313800313233343536373839303132333435363738390000".ToHexBytes(); + var data = "1301161737381A0A536D616C6C43686935313800313233343536373839303132333435363738390000".ToHexBytes(); JTNE_0x05 jTNE_0X05 = JTNESerializer.Deserialize(data); Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X05.LoginTime); Assert.Equal(6666, jTNE_0X05.LoginNum); diff --git a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x06Test.cs b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x06Test.cs index 1914b0e..eea35bd 100644 --- a/src/JTNE.Protocol.Test/MessageBody/JTNE_0x06Test.cs +++ b/src/JTNE.Protocol.Test/MessageBody/JTNE_0x06Test.cs @@ -16,13 +16,13 @@ namespace JTNE.Protocol.Test.MessageBody jTNE_0X06.LogoutTime = DateTime.Parse("2019-01-22 23:55:56"); jTNE_0X06.LogoutNum = 6666; var hex = JTNESerializer.Serialize(jTNE_0X06).ToHexString(); - Assert.Equal("1901222355561A0A", hex); + Assert.Equal("1301161737381A0A", hex); } [Fact] public void Test2() { - var data = "1901222355561A0A".ToHexBytes(); + var data = "1301161737381A0A".ToHexBytes(); JTNE_0x06 jTNE_0X06 = JTNESerializer.Deserialize(data); Assert.Equal(DateTime.Parse("2019-01-22 23:55:56"), jTNE_0X06.LogoutTime); Assert.Equal(6666, jTNE_0X06.LogoutNum); diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs new file mode 100644 index 0000000..4e07b99 --- /dev/null +++ b/src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs @@ -0,0 +1,56 @@ +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JTNE.Protocol.Enums; +using JTNE.Protocol.MessageBody; + +namespace JTNE.Protocol.Test.Package +{ + public class JTNE_0x01_PackageTest + { + [Fact] + public void Test1() + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue(); + jTNEPackage.MsgId = JTNEMsgId.login.ToByteValue(); + jTNEPackage.VIN = "123456789"; + 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" + }; + jTNEPackage.Bodies = jTNE_0X01; + var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString(); + Assert.Equal("232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD", hex); + } + + [Fact] + public void Test2() + { + var data = "232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD".ToHexBytes(); + JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data); + Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId); + Assert.Equal(JTNEMsgId.login.ToByteValue(), jTNEPackage.MsgId); + Assert.Equal("123456789", jTNEPackage.VIN); + + JTNE_0x01 jTNE_0X01 = jTNEPackage.Bodies as JTNE_0x01; + 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]); + } + } +} diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x04_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x04_PackageTest.cs new file mode 100644 index 0000000..104e8b6 --- /dev/null +++ b/src/JTNE.Protocol.Test/Package/JTNE_0x04_PackageTest.cs @@ -0,0 +1,41 @@ +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JTNE.Protocol.Enums; +using JTNE.Protocol.MessageBody; + +namespace JTNE.Protocol.Test.Package +{ + public class JTNE_0x04_PackageTest + { + [Fact] + public void Test1() + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue(); + jTNEPackage.MsgId = JTNEMsgId.loginout.ToByteValue(); + jTNEPackage.VIN = "123456789"; + JTNE_0x04 jTNE_0X04 = new JTNE_0x04(); + jTNE_0X04.LogoutTime = DateTime.Parse("2019-01-23 23:55:56"); + jTNE_0X04.LogoutNum = 1; + jTNEPackage.Bodies = jTNE_0X04; + var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString(); + Assert.Equal("232304FE31323334353637383900000000000000000100081301171737380001DE", hex); + } + + [Fact] + public void Test2() + { + var data = "232304FE31323334353637383900000000000000000100081301171737380001DE".ToHexBytes(); + JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data); + Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId); + Assert.Equal(JTNEMsgId.loginout.ToByteValue(), jTNEPackage.MsgId); + Assert.Equal("123456789", jTNEPackage.VIN); + JTNE_0x04 jTNE_0X04 = jTNEPackage.Bodies as JTNE_0x04; + Assert.Equal(DateTime.Parse("2019-01-23 23:55:56"), jTNE_0X04.LogoutTime); + Assert.Equal(1, jTNE_0X04.LogoutNum); + } + } +} diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs new file mode 100644 index 0000000..e2dfdbd --- /dev/null +++ b/src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs @@ -0,0 +1,46 @@ +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JTNE.Protocol.Enums; +using JTNE.Protocol.MessageBody; + +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(); + jTNEPackage.VIN = "123456789"; + 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); + } + + [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); + 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); + } + } +} diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x06_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x06_PackageTest.cs new file mode 100644 index 0000000..28a0c79 --- /dev/null +++ b/src/JTNE.Protocol.Test/Package/JTNE_0x06_PackageTest.cs @@ -0,0 +1,41 @@ +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JTNE.Protocol.Enums; +using JTNE.Protocol.MessageBody; + +namespace JTNE.Protocol.Test.Package +{ + public class JTNE_0x06_PackageTest + { + [Fact] + public void Test1() + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue(); + jTNEPackage.MsgId = JTNEMsgId.platformlogout.ToByteValue(); + jTNEPackage.VIN = "123456789"; + JTNE_0x06 jTNE_0X06 = new JTNE_0x06(); + jTNE_0X06.LogoutTime = DateTime.Parse("2019-01-23 23:55:56"); + jTNE_0X06.LogoutNum = 1; + jTNEPackage.Bodies = jTNE_0X06; + var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString(); + Assert.Equal("232306FE31323334353637383900000000000000000100081301171737380001DC", hex); + } + + [Fact] + public void Test2() + { + var data = "232306FE31323334353637383900000000000000000100081301171737380001DC".ToHexBytes(); + JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data); + Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId); + Assert.Equal(JTNEMsgId.platformlogout.ToByteValue(), jTNEPackage.MsgId); + Assert.Equal("123456789", jTNEPackage.VIN); + JTNE_0x06 jTNE_0X06 = jTNEPackage.Bodies as JTNE_0x06; + Assert.Equal(DateTime.Parse("2019-01-23 23:55:56"), jTNE_0X06.LogoutTime); + Assert.Equal(1, jTNE_0X06.LogoutNum); + } + } +} diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x07_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x07_PackageTest.cs new file mode 100644 index 0000000..61211a4 --- /dev/null +++ b/src/JTNE.Protocol.Test/Package/JTNE_0x07_PackageTest.cs @@ -0,0 +1,35 @@ +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JTNE.Protocol.Enums; +using JTNE.Protocol.MessageBody; + +namespace JTNE.Protocol.Test.Package +{ + public class JTNE_0x07_PackageTest + { + [Fact] + public void Test1() + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue(); + jTNEPackage.MsgId = JTNEMsgId.heartbeat.ToByteValue(); + jTNEPackage.VIN = "123456789"; + var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString(); + Assert.Equal("232307FE3132333435363738390000000000000000010000C9", hex); + } + + [Fact] + public void Test2() + { + var data = "232307FE3132333435363738390000000000000000010000C9".ToHexBytes(); + JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data); + Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId); + Assert.Equal(JTNEMsgId.heartbeat.ToByteValue(), jTNEPackage.MsgId); + Assert.Equal("123456789", jTNEPackage.VIN); + Assert.Null(jTNEPackage.Bodies); + } + } +} diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x08_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x08_PackageTest.cs new file mode 100644 index 0000000..c460e15 --- /dev/null +++ b/src/JTNE.Protocol.Test/Package/JTNE_0x08_PackageTest.cs @@ -0,0 +1,35 @@ +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JTNE.Protocol.Enums; +using JTNE.Protocol.MessageBody; + +namespace JTNE.Protocol.Test.Package +{ + public class JTNE_0x08_PackageTest + { + [Fact] + public void Test1() + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue(); + jTNEPackage.MsgId = JTNEMsgId.checktime.ToByteValue(); + jTNEPackage.VIN = "123456789"; + var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString(); + Assert.Equal("232308FE3132333435363738390000000000000000010000C6", hex); + } + + [Fact] + public void Test2() + { + var data = "232308FE3132333435363738390000000000000000010000C6".ToHexBytes(); + JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data); + Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId); + Assert.Equal(JTNEMsgId.checktime.ToByteValue(), jTNEPackage.MsgId); + Assert.Equal("123456789", jTNEPackage.VIN); + Assert.Null(jTNEPackage.Bodies); + } + } +} diff --git a/src/JTNE.Protocol/Enums/JTNEErrorCode.cs b/src/JTNE.Protocol/Enums/JTNEErrorCode.cs index 02da28d..b32926e 100644 --- a/src/JTNE.Protocol/Enums/JTNEErrorCode.cs +++ b/src/JTNE.Protocol/Enums/JTNEErrorCode.cs @@ -19,8 +19,12 @@ namespace JTNE.Protocol.Enums BCCCodeError = 1002, /// /// 没有标记 - /// + /// /// GetFormatterAttributeError = 1003, + /// + /// 解析数据体错误 + /// + BodiesParseError=1004, } } diff --git a/src/JTNE.Protocol/Enums/JTNEMsgId.cs b/src/JTNE.Protocol/Enums/JTNEMsgId.cs index d56a78f..ce439c5 100644 --- a/src/JTNE.Protocol/Enums/JTNEMsgId.cs +++ b/src/JTNE.Protocol/Enums/JTNEMsgId.cs @@ -1,4 +1,6 @@ -using System; +using JTNE.Protocol.Attributes; +using JTNE.Protocol.MessageBody; +using System; using System.Collections.Generic; using System.Text; @@ -12,6 +14,7 @@ namespace JTNE.Protocol.Enums /// /// 车辆登入 /// + [JTNEBodiesType(typeof(JTNE_0x01))] login = 0x01, /// /// 实时信息上传 @@ -24,22 +27,27 @@ namespace JTNE.Protocol.Enums /// /// 车辆登出 /// + [JTNEBodiesType(typeof(JTNE_0x04))] loginout = 0x04, /// /// 平台登入 /// + [JTNEBodiesType(typeof(JTNE_0x05))] platformlogin = 0x05, /// /// 平台登出 /// + [JTNEBodiesType(typeof(JTNE_0x06))] platformlogout = 0x06, /// /// 心跳 /// + [JTNEBodiesType(typeof(JTNE_0x07))] heartbeat = 0x07, /// /// 终端校时 /// + [JTNEBodiesType(typeof(JTNE_0x08))] checktime = 0x08, /// /// 查询命令 diff --git a/src/JTNE.Protocol/Exceptions/JTNEException.cs b/src/JTNE.Protocol/Exceptions/JTNEException.cs index 48f6126..075bd7d 100644 --- a/src/JTNE.Protocol/Exceptions/JTNEException.cs +++ b/src/JTNE.Protocol/Exceptions/JTNEException.cs @@ -17,6 +17,15 @@ namespace JTNE.Protocol.Exceptions this.ErrorCode = errorCode; } + public JTNEException(JTNEErrorCode errorCode, Exception ex) : base(ex.Message, ex) + { + ErrorCode = errorCode; + } + + public JTNEException(JTNEErrorCode errorCode, string message, Exception ex) : base(ex.Message, ex) + { + ErrorCode = errorCode; + } public JTNEErrorCode ErrorCode { get; } } } diff --git a/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs b/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs index c6cccdb..3a9b1d7 100644 --- a/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs +++ b/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs @@ -21,7 +21,7 @@ namespace JTNE.Protocol.Extensions /// /// D2: 10 X2:16 /// - public static DateTime ReadDateTime6Little(ReadOnlySpan buf, ref int offset,string format= "X2") + public static DateTime ReadDateTime6Little(ReadOnlySpan buf, ref int offset,string format= "D2") { DateTime d = UTCBaseTime; try @@ -49,7 +49,7 @@ namespace JTNE.Protocol.Extensions /// /// D2: 10 X2:16 /// - public static DateTime ReadDateTime4Little(ReadOnlySpan buf, ref int offset, string format = "X2") + public static DateTime ReadDateTime4Little(ReadOnlySpan buf, ref int offset, string format = "D2") { DateTime d = UTCBaseTime; try @@ -86,7 +86,7 @@ namespace JTNE.Protocol.Extensions /// /// /// - public static DateTime ReadDateTime5Little(ReadOnlySpan buf, ref int offset, string format = "X2") + public static DateTime ReadDateTime5Little(ReadOnlySpan buf, ref int offset, string format = "D2") { DateTime dateTime = new DateTime( @@ -121,7 +121,7 @@ namespace JTNE.Protocol.Extensions /// /// BCD:10 HEX:16 /// - public static int WriteDateTime6Little(byte[] bytes, int offset, DateTime date,int fromBase=16) + public static int WriteDateTime6Little(byte[] bytes, int offset, DateTime date,int fromBase=10) { bytes[offset] = Convert.ToByte(date.ToString("yy"), fromBase); bytes[offset + 1] = Convert.ToByte(date.ToString("MM"), fromBase); diff --git a/src/JTNE.Protocol/Extensions/JTNEPackageExtensions.cs b/src/JTNE.Protocol/Extensions/JTNEPackageExtensions.cs new file mode 100644 index 0000000..3a52418 --- /dev/null +++ b/src/JTNE.Protocol/Extensions/JTNEPackageExtensions.cs @@ -0,0 +1,93 @@ +using JTNE.Protocol.Enums; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JTNE.Protocol.Extensions +{ + /// + /// + /// + public static class JTNEPackageExtensions + { + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static JTNEPackage Create(this JTNEMsgId msgId,string vin, JTNEAskId askId, TJTNEBodies bodies) + where TJTNEBodies : JTNEBodies + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = askId.ToByteValue(); + jTNEPackage.MsgId = msgId.ToByteValue(); + jTNEPackage.Bodies = bodies; + jTNEPackage.VIN = vin; + // todo:加密处理 + + return jTNEPackage; + } + + /// + /// + /// + /// + /// + /// + /// + public static JTNEPackage Create(this JTNEMsgId msgId, string vin, JTNEAskId askId) + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = askId.ToByteValue(); + jTNEPackage.MsgId = msgId.ToByteValue(); + jTNEPackage.VIN = vin; + // todo:加密处理 + + return jTNEPackage; + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static JTNEPackage CreateCustomMsgId(this byte msgId, string vin, JTNEAskId askId, TJTNEBodies bodies) + where TJTNEBodies : JTNEBodies + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = askId.ToByteValue(); + jTNEPackage.MsgId = msgId; + jTNEPackage.Bodies = bodies; + jTNEPackage.VIN = vin; + // todo:加密处理 + + return jTNEPackage; + } + + /// + /// + /// + /// + /// + /// + /// + public static JTNEPackage CreateCustomMsgId(this byte msgId, string vin, JTNEAskId askId) + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = askId.ToByteValue(); + jTNEPackage.MsgId = msgId; + jTNEPackage.VIN = vin; + // todo:加密处理 + + return jTNEPackage; + } + } +} diff --git a/src/JTNE.Protocol/Formatters/JTNEHeaderPackageFormatter.cs b/src/JTNE.Protocol/Formatters/JTNEHeaderPackageFormatter.cs new file mode 100644 index 0000000..4632b21 --- /dev/null +++ b/src/JTNE.Protocol/Formatters/JTNEHeaderPackageFormatter.cs @@ -0,0 +1,97 @@ +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 JTNEHeaderPackageFormatter : IJTNEFormatter + { + public JTNEHeaderPackage 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]}"); + // 2.进行BCC校验码 + // 校验位 = 报文长度 - 最后一位(校验位) + if (!JTNEGlobalConfigs.Instance.SkipCRCCode) + { + byte bCCCode = bytes[bytes.Length - 1]; + byte bCCCode2 = bytes.ToXor(2, bytes.Length - 1); + if (bCCCode != bCCCode2) + throw new JTNEException(JTNEErrorCode.BCCCodeError, $"request:{bCCCode}!=calculate:{bCCCode2}"); + } + JTNEHeaderPackage jTNEPackage = new JTNEHeaderPackage(); + offset += 2; + // 3.命令标识 + jTNEPackage.MsgId = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); + // 4.应答标识 + jTNEPackage.AskId = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); + // 5.VIN + jTNEPackage.VIN = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, 17); + // 6.数据加密方式 + jTNEPackage.EncryptMethod = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); + // 7.数据单元长度是数据单元的总字节数 + jTNEPackage.DataUnitLength = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset); + // 8.数据体 + // 8.1.根据数据加密方式进行解码 + // todo: 8.2.解析出对应数据体 + if (jTNEPackage.DataUnitLength > 0) + { + Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId(jTNEPackage.MsgId); + if (jTNEBodiesImplType != null) + { + int bodyReadSize = 0; + try + { + jTNEPackage.Bodies = bytes.Slice(offset, jTNEPackage.DataUnitLength).ToArray(); + } + catch (Exception ex) + { + throw new JTNEException(JTNEErrorCode.BodiesParseError, ex); + } + offset += bodyReadSize; + } + } + // 9.校验码 + jTNEPackage.BCCCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); + readSize = offset; + return jTNEPackage; + } + + public int Serialize(ref byte[] bytes, int offset, JTNEHeaderPackage value) + { + // 1.起始符1 + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.BeginFlag1); + // 2.起始符2 + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.BeginFlag2); + // 3.命令标识 + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.MsgId); + // 4.应答标识 + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.AskId); + // 5.VIN + offset += JTNEBinaryExtensions.WriteStringPadRightLittle(bytes, offset, value.VIN, 17); + // 6.数据加密方式 + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.EncryptMethod); + if (value.Bodies != null) + { + // 7.数据体 + offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, (ushort)value.Bodies.Length); + // 8.处理数据体 + offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset, value.Bodies); + } + else + { + offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, 0); + } + // 9.校验码 + var bccCode = bytes.ToXor(2, offset); + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, bccCode); + return offset; + } + } +} diff --git a/src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs b/src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs index 87cf3bf..a46eb69 100644 --- a/src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs +++ b/src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs @@ -1,6 +1,7 @@ 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; @@ -9,11 +10,13 @@ namespace JTNE.Protocol.Formatters { public class JTNEPackageFormatter : IJTNEFormatter { + private const byte FixedDataBodyLength = 2; + public JTNEPackage Deserialize(ReadOnlySpan bytes, out int readSize) { int offset = 0; // 1.进行固定头校验 - if (bytes[offset] != JTNEPackage.BeginFlag && bytes[offset+1] == JTNEPackage.BeginFlag) + if (bytes[offset] != JTNEPackage.BeginFlag && bytes[offset + 1] == JTNEPackage.BeginFlag) throw new JTNEException(JTNEErrorCode.BeginFlagError, $"{bytes[offset]},{bytes[offset + 1]}"); // 2.进行BCC校验码 // 校验位 = 报文长度 - 最后一位(校验位) @@ -31,15 +34,34 @@ namespace JTNE.Protocol.Formatters // 4.应答标识 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); // 7.数据单元长度是数据单元的总字节数 jTNEPackage.DataUnitLength = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset); // 8.数据体 // 8.1.根据数据加密方式进行解码 - // 8.2.解析出对应数据体 - jTNEPackage.Bodies = JTNEBinaryExtensions.ReadBytesLittle(bytes, ref offset, jTNEPackage.DataUnitLength); + // todo: 8.2.解析出对应数据体 + if (jTNEPackage.DataUnitLength > 0) + { + Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId(jTNEPackage.MsgId); + if (jTNEBodiesImplType != null) + { + int bodyReadSize = 0; + try + { + jTNEPackage.Bodies = JTNEFormatterResolverExtensions.JTNEDynamicDeserialize( + JTNEFormatterExtensions.GetFormatter(jTNEBodiesImplType), + bytes.Slice(offset, jTNEPackage.DataUnitLength), + out bodyReadSize); + } + catch (Exception ex) + { + throw new JTNEException(JTNEErrorCode.BodiesParseError, ex); + } + offset += bodyReadSize; + } + } // 9.校验码 jTNEPackage.BCCCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset); readSize = offset; @@ -57,17 +79,33 @@ namespace JTNE.Protocol.Formatters // 4.应答标识 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.MsgId); - // 7.数据单元长度是数据单元的总字节数 - // 7.1.先解析出数据体 - // 7.2.判断是否有加密 - offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset,(ushort)value.Bodies.Length); + offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.EncryptMethod); + // 7.记录存储数据长度的当前偏移量 + int tmpOffset = offset; + offset += FixedDataBodyLength; // 8.数据体 - offset += JTNEBinaryExtensions.WriteBytesLittle(bytes, offset,value.Bodies); - // 9.校验码 - var bccCode = bytes.ToXor(2, offset - 2); + Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId(value.MsgId); + int messageBodyOffset = 0; + if (jTNEBodiesImplType != null) + { + if (value.Bodies != null) + { + // 8.1 处理数据体 + // todo: 8.2.判断是否有加密 + messageBodyOffset = JTNEFormatterResolverExtensions.JTNEDynamicSerialize( + JTNEFormatterExtensions.GetFormatter(jTNEBodiesImplType), + ref bytes, + offset, + value.Bodies); + // 9.通过tmpOffset反写数据单元长度 + JTNEBinaryExtensions.WriteUInt16Little(bytes, tmpOffset, (ushort)(messageBodyOffset - offset)); + offset = messageBodyOffset; + } + } + // 10.校验码 + var bccCode = bytes.ToXor(2, offset); offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, bccCode); return offset; } diff --git a/src/JTNE.Protocol/Interfaces/IDeviceMsgSNDistributed.cs b/src/JTNE.Protocol/Interfaces/IDeviceMsgSNDistributed.cs new file mode 100644 index 0000000..2922db1 --- /dev/null +++ b/src/JTNE.Protocol/Interfaces/IDeviceMsgSNDistributed.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JTNE.Protocol.Interfaces +{ + /// + /// + /// + public interface IDeviceMsgSNDistributed : IMsgSNDistributed + { + + } +} diff --git a/src/JTNE.Protocol/Interfaces/IMsgSNDistributed.cs b/src/JTNE.Protocol/Interfaces/IMsgSNDistributed.cs new file mode 100644 index 0000000..555fdc3 --- /dev/null +++ b/src/JTNE.Protocol/Interfaces/IMsgSNDistributed.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JTNE.Protocol.Interfaces +{ + /// + /// + /// + public interface IMsgSNDistributed + { + /// + /// + /// + /// + ushort Increment(); + } +} diff --git a/src/JTNE.Protocol/Interfaces/IPlatformMsgSNDistributed.cs b/src/JTNE.Protocol/Interfaces/IPlatformMsgSNDistributed.cs new file mode 100644 index 0000000..5af7c03 --- /dev/null +++ b/src/JTNE.Protocol/Interfaces/IPlatformMsgSNDistributed.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JTNE.Protocol.Interfaces +{ + /// + /// + /// + public interface IPlatformMsgSNDistributed: IMsgSNDistributed + { + + } +} diff --git a/src/JTNE.Protocol/Internal/DefaultDeviceMsgSNDistributedImpl.cs b/src/JTNE.Protocol/Internal/DefaultDeviceMsgSNDistributedImpl.cs new file mode 100644 index 0000000..041b308 --- /dev/null +++ b/src/JTNE.Protocol/Internal/DefaultDeviceMsgSNDistributedImpl.cs @@ -0,0 +1,18 @@ +using JTNE.Protocol.Interfaces; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace JTNE.Protocol.Internal +{ + internal class DefaultDeviceMsgSNDistributedImpl : IDeviceMsgSNDistributed + { + int _counter = 0; + + public ushort Increment() + { + return (ushort)Interlocked.Increment(ref _counter); + } + } +} diff --git a/src/JTNE.Protocol/Internal/DefaultPlatformMsgSNDistributedImpl.cs b/src/JTNE.Protocol/Internal/DefaultPlatformMsgSNDistributedImpl.cs new file mode 100644 index 0000000..23c9d00 --- /dev/null +++ b/src/JTNE.Protocol/Internal/DefaultPlatformMsgSNDistributedImpl.cs @@ -0,0 +1,18 @@ +using JTNE.Protocol.Interfaces; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace JTNE.Protocol.Internal +{ + internal class DefaultPlatformMsgSNDistributedImpl : IPlatformMsgSNDistributed + { + int _counter = 0; + + public ushort Increment() + { + return (ushort)Interlocked.Increment(ref _counter); + } + } +} diff --git a/src/JTNE.Protocol/Internal/JTNEMsgIdFactory.cs b/src/JTNE.Protocol/Internal/JTNEMsgIdFactory.cs new file mode 100644 index 0000000..24892a2 --- /dev/null +++ b/src/JTNE.Protocol/Internal/JTNEMsgIdFactory.cs @@ -0,0 +1,48 @@ +using JTNE.Protocol.Attributes; +using JTNE.Protocol.Enums; +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JTNE.Protocol.Internal +{ + internal static class JTNEMsgIdFactory + { + private static readonly Dictionary map; + + static JTNEMsgIdFactory() + { + map = new Dictionary(); + InitMap(); + } + + internal static Type GetBodiesImplTypeByMsgId(byte msgId) =>map.TryGetValue(msgId, out Type type) ? type : null; + + private static void InitMap() + { + foreach(var item in Enum.GetNames(typeof(JTNEMsgId))) + { + JTNEMsgId msgId = item.ToEnum(); + JTNEBodiesTypeAttribute jT808BodiesTypeAttribute = msgId.GetAttribute(); + map.Add((byte)msgId, jT808BodiesTypeAttribute?.JT808BodiesType); + } + } + + internal static void SetMap(byte msgId) + where TJTNEBodies : JTNEBodies + { + if(!map.ContainsKey(msgId)) + map.Add(msgId, typeof(TJTNEBodies)); + } + + internal static void ReplaceMap(byte msgId) + where TJTNEBodies : JTNEBodies + { + if (!map.ContainsKey(msgId)) + map.Add(msgId, typeof(TJTNEBodies)); + else + map[msgId] = typeof(TJTNEBodies); + } + } +} diff --git a/src/JTNE.Protocol/JTNE.Protocol.csproj b/src/JTNE.Protocol/JTNE.Protocol.csproj index 7fb3179..ba7401f 100644 --- a/src/JTNE.Protocol/JTNE.Protocol.csproj +++ b/src/JTNE.Protocol/JTNE.Protocol.csproj @@ -22,7 +22,7 @@ - D:\My Project\JTNewEnergy\src\JTNE.Protocol\JTNE.Protocol.xml + bin\$(Configuration)\$(TargetFramework)\JTNE.Protocol.xml diff --git a/src/JTNE.Protocol/JTNE.Protocol.xml b/src/JTNE.Protocol/JTNE.Protocol.xml deleted file mode 100644 index dc0285d..0000000 --- a/src/JTNE.Protocol/JTNE.Protocol.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - JTNE.Protocol - - - - - 新能源包 - - - - - 固定为24个字节长度 - - - - - 起始符 - 0x23 - - - - - 命令标识 - - - - - 应答标志 - - - - - 车辆识别码 - - - - - 数据加密方式 - 0x01:数据不加密;0x02:数据经过 RSA 算法加密;0x03:数据经过 AES128 位算法加密;“0xFE”表示异常,“0xFF”表示无效 - - - - - 数据单元长度是数据单元的总字节数,有效值范围:0-65531 - - - - - 采用BCC(异或检验)法,校验范围从命令单元的第一个字节开始,同后一个字节异或,直到校验码前一个字节为止, - 校验码占用一个字节,当数据单元存在加密时,应先加密后检验,先校验后解密 - - - - diff --git a/src/JTNE.Protocol/JTNEGlobalConfigs.cs b/src/JTNE.Protocol/JTNEGlobalConfigs.cs index ecadc9e..f80ec19 100644 --- a/src/JTNE.Protocol/JTNEGlobalConfigs.cs +++ b/src/JTNE.Protocol/JTNEGlobalConfigs.cs @@ -1,4 +1,6 @@ -using System; +using JTNE.Protocol.Interfaces; +using JTNE.Protocol.Internal; +using System; using System.Text; namespace JTNE.Protocol @@ -15,6 +17,8 @@ namespace JTNE.Protocol Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding = Encoding.UTF8; SkipCRCCode = false; + DeviceMsgSNDistributed = new DefaultDeviceMsgSNDistributedImpl(); + PlatformMsgSNDistributed = new DefaultPlatformMsgSNDistributedImpl(); } /// /// 字符串编码 @@ -32,13 +36,44 @@ namespace JTNE.Protocol } } + /// + /// 设备流水号 + /// + public IDeviceMsgSNDistributed DeviceMsgSNDistributed { get; private set; } + /// + /// 平台流水号 + /// + public IPlatformMsgSNDistributed PlatformMsgSNDistributed { get; private set; } /// /// 跳过校验码 /// 测试的时候需要手动修改值,避免验证 /// 默认:false /// public bool SkipCRCCode { get; private set; } - + /// + /// 注册自定义消息 + /// + /// + /// + /// + public JTNEGlobalConfigs Register_CustomMsgId(byte customMsgId) + where TJTNEBodies : JTNEBodies + { + JTNEMsgIdFactory.SetMap(customMsgId); + return instance.Value; + } + /// + /// 重写消息 + /// + /// + /// + /// + public JTNEGlobalConfigs Overwrite_MsgId(byte overwriteMsgId) + where TJTNEBodies : JTNEBodies + { + JTNEMsgIdFactory.ReplaceMap(overwriteMsgId); + return instance.Value; + } /// /// 设置跳过校验码 /// 场景:测试的时候,可能需要手动改数据,所以测试的时候有用 @@ -50,5 +85,25 @@ namespace JTNE.Protocol instance.Value.SkipCRCCode = skipCRCCode; return instance.Value; } + /// + /// 设置设备流水号 + /// + /// + /// + public JTNEGlobalConfigs SetDeviceMsgSNDistributed(IDeviceMsgSNDistributed deviceMsgSNDistributed) + { + instance.Value.DeviceMsgSNDistributed = deviceMsgSNDistributed; + return instance.Value; + } + /// + /// 设置平台流水号 + /// + /// + /// + public JTNEGlobalConfigs SetPlatformMsgSNDistributed(IPlatformMsgSNDistributed platformMsgSNDistributed) + { + instance.Value.PlatformMsgSNDistributed = platformMsgSNDistributed; + return instance.Value; + } } } diff --git a/src/JTNE.Protocol/JTNEHeaderPackage.cs b/src/JTNE.Protocol/JTNEHeaderPackage.cs new file mode 100644 index 0000000..e086a76 --- /dev/null +++ b/src/JTNE.Protocol/JTNEHeaderPackage.cs @@ -0,0 +1,56 @@ +using JTNE.Protocol.Attributes; +using JTNE.Protocol.Formatters; +using System; +using System.IO; + +namespace JTNE.Protocol +{ + /// + /// 新能源包 + /// + [JTNEFormatter(typeof(JTNEHeaderPackageFormatter))] + public class JTNEHeaderPackage + { + /// + /// 起始符1 + /// + public byte BeginFlag1 { get; set; } = JTNEPackage.BeginFlag; + /// + /// 起始符2 + /// + public byte BeginFlag2 { get; set; } = JTNEPackage.BeginFlag; + /// + /// 命令标识 + /// + /// + public byte MsgId { get; set; } + /// + /// 应答标志 + /// + /// + public byte AskId { get; set; } + /// + /// 车辆识别码 + /// + public string VIN { get; set; } + /// + /// 数据加密方式 (默认不加密) + /// 0x01:数据不加密;0x02:数据经过 RSA 算法加密;0x03:数据经过 AES128 位算法加密;“0xFE”表示异常,“0xFF”表示无效 + /// + /// + public byte EncryptMethod { get; set; } = 0x01; + /// + /// 数据单元长度是数据单元的总字节数,有效值范围:0-65531 + /// + public ushort DataUnitLength { get; set; } + /// + /// 数据体 + /// + public byte[] Bodies { get; set; } + /// + /// 采用BCC(异或检验)法,校验范围从命令单元的第一个字节开始,同后一个字节异或,直到校验码前一个字节为止, + /// 校验码占用一个字节,当数据单元存在加密时,应先加密后检验,先校验后解密 + /// + public byte BCCCode { get; set; } + } +} diff --git a/src/JTNE.Protocol/JTNEPackage.cs b/src/JTNE.Protocol/JTNEPackage.cs index 30b475a..ea71b3a 100644 --- a/src/JTNE.Protocol/JTNEPackage.cs +++ b/src/JTNE.Protocol/JTNEPackage.cs @@ -11,20 +11,15 @@ namespace JTNE.Protocol [JTNEFormatter(typeof(JTNEPackageFormatter))] public class JTNEPackage { - /// - /// 固定为24个字节长度 - /// - //public const int HeaderFixedByteLength = 24; - public const byte BeginFlag = 0x23; /// /// 起始符1 /// - public byte BeginFlag1 { get; set; } = 0x23; + public byte BeginFlag1 { get; set; } = BeginFlag; /// /// 起始符2 /// - public byte BeginFlag2 { get; set; } = 0x23; + public byte BeginFlag2 { get; set; } = BeginFlag; /// /// 命令标识 /// @@ -40,11 +35,11 @@ namespace JTNE.Protocol /// public string VIN { get; set; } /// - /// 数据加密方式 + /// 数据加密方式 (默认不加密) /// 0x01:数据不加密;0x02:数据经过 RSA 算法加密;0x03:数据经过 AES128 位算法加密;“0xFE”表示异常,“0xFF”表示无效 /// /// - public byte EncryptMethod { get; set; } + public byte EncryptMethod { get; set; } = 0x01; /// /// 数据单元长度是数据单元的总字节数,有效值范围:0-65531 /// @@ -52,7 +47,7 @@ namespace JTNE.Protocol /// /// 数据体 /// - public byte[] Bodies { get; set; } + public JTNEBodies Bodies { get; set; } /// /// 采用BCC(异或检验)法,校验范围从命令单元的第一个字节开始,同后一个字节异或,直到校验码前一个字节为止, /// 校验码占用一个字节,当数据单元存在加密时,应先加密后检验,先校验后解密 diff --git a/src/JTNE.Protocol/MessageBody/JTNE_0x05.cs b/src/JTNE.Protocol/MessageBody/JTNE_0x05.cs index 496e518..9612f4b 100644 --- a/src/JTNE.Protocol/MessageBody/JTNE_0x05.cs +++ b/src/JTNE.Protocol/MessageBody/JTNE_0x05.cs @@ -30,8 +30,10 @@ namespace JTNE.Protocol.MessageBody /// public string PlatformPassword { get; set; } /// - /// 加密规则 + /// 数据加密方式 (默认不加密) + /// 0x01:数据不加密;0x02:数据经过 RSA 算法加密;0x03:数据经过 AES128 位算法加密;“0xFE”表示异常,“0xFF”表示无效 + /// /// - public byte EncryptMethod{ get; set; } + public byte EncryptMethod { get; set; } = 0x01; } }