diff --git a/src/GBNewEnergy.Protocol.Test/NEPackageTest.cs b/src/GBNewEnergy.Protocol.Test/NEPackageTest.cs index a75962e..6e7997b 100644 --- a/src/GBNewEnergy.Protocol.Test/NEPackageTest.cs +++ b/src/GBNewEnergy.Protocol.Test/NEPackageTest.cs @@ -16,6 +16,7 @@ namespace GBNewEnergy.Protocol.Test { }; + #region 车辆登入 [Fact] public void NELoginUpStreamConstructor4_1() @@ -70,7 +71,7 @@ namespace GBNewEnergy.Protocol.Test } #endregion - #region 车辆登出(依赖车辆登录的流水号所有必须先进行登录产生流水号) + #region 车辆登出(依赖车辆登入的流水号所有必须先进行登入产生流水号) [Fact] public void NELogoutUpStream1_1() @@ -155,5 +156,74 @@ namespace GBNewEnergy.Protocol.Test #endregion + #region 平台登入 + + [Fact] + public void NEPlatformLogin1_1() + { + NEPlatformLoginProperty nEPlatformLoginProperty = new NEPlatformLoginProperty + { + EncryptMethod = NEEncryptMethod.None, + Password = "123456", + UserName = "smallchi", + }; + NEPlatformLoginUpStream nEPlatformLoginUpStream = new NEPlatformLoginUpStream(nEPlatformLoginProperty, NEGlobalConfigs); + + INEProperties nEPackageProperty = new NEPackageProperty + { + Bodies = nEPlatformLoginUpStream, + MsgId = Enums.NEMsgId.platformlogin, + AskId = Enums.NEAskId.cmd, + VIN = "LGHC4V1D3HE202652" + }; + NEPackage nEPackage = new NEPackage(nEPackageProperty, NEGlobalConfigs); + string headerHex = nEPackage.Header.ToHexString(); + string bodiesHex = nEPackage.Bodies.Buffer.ToHexString(); + string packageHex = nEPackage.Buffer.ToHexString(); + } + + #endregion + + #region 平台登出(依赖平台登出的流水号所有必须先进行登入产生流水号) + + [Fact] + public void NEPlatformLogin2_1() + { + NEPlatformLoginProperty nEPlatformLoginProperty = new NEPlatformLoginProperty + { + EncryptMethod = NEEncryptMethod.None, + Password = "123456", + UserName = "smallchi", + }; + NEPlatformLoginUpStream nEPlatformLoginUpStream = new NEPlatformLoginUpStream(nEPlatformLoginProperty, NEGlobalConfigs); + INEProperties nEPackageProperty = new NEPackageProperty + { + Bodies = nEPlatformLoginUpStream, + MsgId = Enums.NEMsgId.platformlogin, + AskId = Enums.NEAskId.cmd, + VIN = "LGHC4V1D3HE202652" + }; + NEPackage nEPackage = new NEPackage(nEPackageProperty, NEGlobalConfigs); + + NEPlatformLogoutProperty nEPlatformLogoutProperty = new NEPlatformLogoutProperty + { + UserName = "smallchi", + }; + NEPlatformLoginUpStream nEPlatformLogoutUpStream = new NEPlatformLoginUpStream(nEPlatformLoginProperty, NEGlobalConfigs); + INEProperties logoutNEPackageProperty = new NEPackageProperty + { + Bodies = nEPlatformLogoutUpStream, + MsgId = Enums.NEMsgId.platformlogout, + AskId = Enums.NEAskId.cmd, + VIN = "LGHC4V1D3HE202652" + }; + NEPackage loginNEPackage = new NEPackage(logoutNEPackageProperty, NEGlobalConfigs); + string headerHex = loginNEPackage.Header.ToHexString(); + string bodiesHex = loginNEPackage.Bodies.Buffer.ToHexString(); + string packageHex = loginNEPackage.Buffer.ToHexString(); + } + + + #endregion } } diff --git a/src/GBNewEnergy.Protocol/Enums/NEMsgId.cs b/src/GBNewEnergy.Protocol/Enums/NEMsgId.cs index 60eb234..b4aaa1b 100644 --- a/src/GBNewEnergy.Protocol/Enums/NEMsgId.cs +++ b/src/GBNewEnergy.Protocol/Enums/NEMsgId.cs @@ -18,17 +18,25 @@ namespace GBNewEnergy.Protocol.Enums /// uploadim = 0x02, /// - /// 心跳 - /// - heartbeat = 0x03, - /// /// 补传信息上传 /// - uploadsup = 0x04, + uploadsup = 0x03, /// /// 车辆登出 /// - loginout = 0x05, + loginout = 0x04, + /// + /// 平台登入 + /// + platformlogin = 0x05, + /// + /// 平台登出 + /// + platformlogout = 0x06, + /// + /// 心跳 + /// + heartbeat = 0x07, /// /// 终端校时 /// diff --git a/src/GBNewEnergy.Protocol/Extensions/NEExtensions.cs b/src/GBNewEnergy.Protocol/Extensions/NEExtensions.cs index aba558e..2dc7bd3 100644 --- a/src/GBNewEnergy.Protocol/Extensions/NEExtensions.cs +++ b/src/GBNewEnergy.Protocol/Extensions/NEExtensions.cs @@ -82,6 +82,11 @@ namespace GBNewEnergy.Protocol.Extensions Array.Copy(bytes, 0, write, offset, len); } + public static void WriteLittle(this byte[] write, byte bit, int offset) + { + write[offset] = bit; + } + public static void WriteLittle(this byte[] write, DateTime date, int offset,int len) { write[offset++] = (byte)(date.Year - DateLimitYear); diff --git a/src/GBNewEnergy.Protocol/NEBodies.cs b/src/GBNewEnergy.Protocol/NEBodies.cs index 7c48638..b2a3ff2 100644 --- a/src/GBNewEnergy.Protocol/NEBodies.cs +++ b/src/GBNewEnergy.Protocol/NEBodies.cs @@ -8,14 +8,21 @@ namespace GBNewEnergy.Protocol public abstract class NEBodies : NEBufferedEntityBase { /// - /// VIN - 登录流水号,过期时间(每天置1) + /// VIN - 登入流水号,过期时间(每天置1) /// 车载终端登入一次,登入流水号自动加1,从1开始循环累加,最大值为65531,循环周期为天 /// protected static readonly ConcurrentDictionary LoginNumDict; + /// + /// 平台登入 登录流水号,过期时间(每天置1) + /// 下级平台登入一次,登入流水号自动加1,从1开始循环累加,最大值为65531,循环周期为天 + /// + protected static readonly ConcurrentDictionary PlatformLoginNumDict; + static NEBodies() { LoginNumDict = new ConcurrentDictionary(); + PlatformLoginNumDict = new ConcurrentDictionary(); } /// @@ -39,5 +46,11 @@ namespace GBNewEnergy.Protocol public ushort LoginNum { get; set; } public DateTime ExpirationTime { get; set; } } + + protected class PlatformLoginInfo + { + public ushort LoginNum { get; set; } + public DateTime ExpirationTime { get; set; } + } } } diff --git a/src/GBNewEnergy.Protocol/NEProperties/NEPlatformLoginProperty.cs b/src/GBNewEnergy.Protocol/NEProperties/NEPlatformLoginProperty.cs new file mode 100644 index 0000000..7ba7265 --- /dev/null +++ b/src/GBNewEnergy.Protocol/NEProperties/NEPlatformLoginProperty.cs @@ -0,0 +1,27 @@ +using GBNewEnergy.Protocol.Enums; +using System; +using System.Collections.Generic; +using System.Text; + +namespace GBNewEnergy.Protocol.NEProperties +{ + public class NEPlatformLoginProperty : INEProperties + { + [Obsolete("平台登入无用字段")] + public string VIN { get ; set; } + /// + /// 平台用户名 + /// + public string UserName { get; set; } + + /// + /// 加密规则 + /// + public NEEncryptMethod EncryptMethod { get; set; } + + /// + /// 平台密码 + /// + public string Password { get; set; } + } +} diff --git a/src/GBNewEnergy.Protocol/NEProperties/NEPlatformLogoutProperty.cs b/src/GBNewEnergy.Protocol/NEProperties/NEPlatformLogoutProperty.cs new file mode 100644 index 0000000..b319ab7 --- /dev/null +++ b/src/GBNewEnergy.Protocol/NEProperties/NEPlatformLogoutProperty.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace GBNewEnergy.Protocol.NEProperties +{ + public class NEPlatformLogoutProperty : INEProperties + { + [Obsolete("平台登入无用字段")] + public string VIN { get; set; } + /// + /// 平台用户名 + /// + public string UserName { get; set; } + } +} diff --git a/src/GBNewEnergy.Protocol/UpStream/NEPlatformLoginUpStream.cs b/src/GBNewEnergy.Protocol/UpStream/NEPlatformLoginUpStream.cs new file mode 100644 index 0000000..355ae3d --- /dev/null +++ b/src/GBNewEnergy.Protocol/UpStream/NEPlatformLoginUpStream.cs @@ -0,0 +1,88 @@ +using GBNewEnergy.Protocol.Enums; +using GBNewEnergy.Protocol.Extensions; +using GBNewEnergy.Protocol.NEProperties; +using System; +using System.Collections.Generic; +using System.Text; + +namespace GBNewEnergy.Protocol.UpStream +{ + /// + /// 平台登入 + /// + public class NEPlatformLoginUpStream : NEBodies + { + public NEPlatformLoginUpStream(byte[] buffer, NEGlobalConfigs nEConfigs) : base(buffer, nEConfigs) + { + } + + public NEPlatformLoginUpStream(INEProperties nEProperties, NEGlobalConfigs nEConfigs) : base(nEProperties, nEConfigs) + { + } + + /// + /// 平台用户名 + /// + public string UserName { get; set; } + + /// + /// 加密规则 + /// + public NEEncryptMethod EncryptMethod { get; set; } + + /// + /// 平台密码 + /// + public string Password { get; set; } + + protected override void InitializeProperties(INEProperties nEProperties) + { + NEPlatformLoginProperty nEPlatformLoginProperty = (NEPlatformLoginProperty)nEProperties; + if (PlatformLoginNumDict.ContainsKey(nEPlatformLoginProperty.UserName)) + { + PlatformLoginInfo temp; + if (PlatformLoginNumDict.TryGetValue(nEPlatformLoginProperty.UserName, out temp)) + { + // 不等于当天 + if (temp.ExpirationTime != DateTime.Now.Date) + { + LoginNum = 1; + PlatformLoginNumDict.TryUpdate(nEPlatformLoginProperty.UserName, new PlatformLoginInfo { LoginNum = LoginNum, ExpirationTime = DateTime.Now.Date }, temp); + } + else + {// 自增1 更新字典 + LoginNum = temp.LoginNum++; + PlatformLoginNumDict.TryUpdate(nEPlatformLoginProperty.UserName, new PlatformLoginInfo { LoginNum = LoginNum, ExpirationTime = DateTime.Now.Date }, temp); + } + } + } + else + { + LoginNum = 1; + PlatformLoginNumDict.TryAdd(nEPlatformLoginProperty.UserName, new PlatformLoginInfo { LoginNum = LoginNum, ExpirationTime = DateTime.Now.Date }); + } + UserName = nEPlatformLoginProperty.UserName; + EncryptMethod = nEPlatformLoginProperty.EncryptMethod; + Password = nEPlatformLoginProperty.Password; + } + + protected override void InitializePropertiesFromBuffer() + { + CurrentDateTime = Buffer.ReadDateTimeLittle(0, 6); + LoginNum = Buffer.ReadUShortH2LLittle(6, 2); + UserName = Buffer.ReadStringLittle(6, 12); + Password = Buffer.ReadStringLittle(12, 20); + EncryptMethod= (NEEncryptMethod)Buffer[21]; + } + + protected override void ToBuffer() + { + Buffer = new byte[6+2+12+20+1]; + Buffer.WriteLittle(CurrentDateTime, 0, 6); + Buffer.WriteLittle(LoginNum, 6, 2); + Buffer.WriteLittle(UserName, 12); + Buffer.WriteLittle(Password, 20); + Buffer.WriteLittle((byte)EncryptMethod, 21); + } + } +} diff --git a/src/GBNewEnergy.Protocol/UpStream/NEPlatformLogoutUpStream.cs b/src/GBNewEnergy.Protocol/UpStream/NEPlatformLogoutUpStream.cs new file mode 100644 index 0000000..4323a91 --- /dev/null +++ b/src/GBNewEnergy.Protocol/UpStream/NEPlatformLogoutUpStream.cs @@ -0,0 +1,47 @@ +using GBNewEnergy.Protocol.Exceptions; +using GBNewEnergy.Protocol.Extensions; +using GBNewEnergy.Protocol.NEProperties; + +namespace GBNewEnergy.Protocol.UpStream +{ + /// + /// 平台登出 + /// + public class NEPlatformLogoutUpStream : NEBodies + { + public NEPlatformLogoutUpStream(INEProperties nEProperties, NEGlobalConfigs nEConfigs) : base(nEProperties, nEConfigs) + { + } + + public NEPlatformLogoutUpStream(byte[] buffer, NEGlobalConfigs nEConfigs) : base(buffer, nEConfigs) + { + } + + protected override void InitializeProperties(INEProperties nEProperties) + { + NEPlatformLogoutProperty nEPlatformLogoutProperty = (NEPlatformLogoutProperty)nEProperties; + PlatformLoginInfo temp; + if (PlatformLoginNumDict.TryGetValue(nEPlatformLogoutProperty.UserName, out temp)) + { + LoginNum = temp.LoginNum; + } + else + { + throw new NEException(Enums.NEErrorCode.LoginSerialNoError, "Must Dependency NEPlatformLoginUpStream Class."); + } + } + + protected override void InitializePropertiesFromBuffer() + { + CurrentDateTime = Buffer.ReadDateTimeLittle(0, 6); + LoginNum = Buffer.ReadUShortH2LLittle(6, 2); + } + + protected override void ToBuffer() + { + Buffer = new byte[8]; + Buffer.WriteLittle(CurrentDateTime, 0, 6); + Buffer.WriteLittle(LoginNum, 6, 2); + } + } +}