Plane.Sdk3/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection.cs

72 lines
2.6 KiB
C#
Raw Permalink Normal View History

2017-02-27 02:02:19 +08:00
using Plane.Communication;
using System.Text;
using System.Threading.Tasks;
namespace PlaneGcsSdk.Contract.DtuClient
{
/// <summary>
/// 基于PLNet的用户登录体系的Udp连接实体类。
/// <para>具体登陆流程1利用用户名和密码登陆PLNet获取随机码2利用随机码登陆Dtu透传服务器</para>
/// </summary>
public partial class BasedOnEhNetUdpDtuServiceConnection : UdpThroughDtuServiceConnection
{
#region Fields
public int _randCode;
#endregion
#region Properties
#endregion
/// <summary>
/// 基于PLNet的用户登录体系的Udp连接实体类。
/// <para>具体登陆流程1利用用户名和密码登陆PLNet获取随机码2利用随机码登陆Dtu透传服务器</para>
/// </summary>
/// <param name="dtuServiceIp"></param>
/// <param name="dtuServicePort"></param>
/// <param name="randCode">用户随机数</param>
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}");
}
/// <summary>
/// 分析由DTU服务端返回的握手包
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
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<int> 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;
}
}
}