Plane.Sdk3/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection.cs
2017-02-27 02:02:19 +08:00

72 lines
2.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}