using Plane.Communication; using System.Text; using System.Threading.Tasks; namespace PlaneGcsSdk.Contract.DtuClient { /// /// 基于PLNet的用户登录体系的Udp连接实体类。 /// 具体登陆流程:1,利用用户名和密码登陆PLNet,获取随机码;2,利用随机码登陆Dtu透传服务器; /// public partial class BasedOnEhNetUdpDtuServiceConnection : UdpThroughDtuServiceConnection { #region Fields public int _randCode; #endregion #region Properties #endregion /// /// 基于PLNet的用户登录体系的Udp连接实体类。 /// 具体登陆流程:1,利用用户名和密码登陆PLNet,获取随机码;2,利用随机码登陆Dtu透传服务器; /// /// /// /// 用户随机数 public BasedOnEhNetUdpDtuServiceConnection(string dtuServiceIp, int dtuServicePort, int randCode) : base(dtuServiceIp, dtuServicePort) { FLAG_DTU_HANDSHAKE_HEAD = "ehnetrnd"; _randCode = randCode; } protected override byte[] ConstructHandShakeDatagramToDTUService() { return Encoding.ASCII.GetBytes($"{FLAG_DTU_HANDSHAKE_HEAD}{_randCode}"); } /// /// 分析由DTU服务端返回的握手包 /// /// /// protected override DTUHandShakeResult AnalyzeHandShakeDatagramFromDTUService(byte[] buffer) { var strResult = Encoding.ASCII.GetString(buffer);//返回的格式为“ehnetrndxxxx” if (strResult.StartsWith(FLAG_DTU_HANDSHAKE_HEAD)) { return DTUHandShakeResult.Successful; } return DTUHandShakeResult.Unknown; } public override async Task ReadAsync(byte[] buffer, int offset, int count) { var iRet = await base.ReadAsync(buffer, offset, count); //解密数据 buffer.DecryptByKey((byte)(_randCode % byte.MaxValue), offset, count); return iRet; } public override Task WriteAsync(byte[] buffer, int offset, int count) { //加密数据 buffer.EncryptByKey((byte)(_randCode % byte.MaxValue), offset, count); var iRet = base.WriteAsync(buffer, offset, count); return iRet; } } }