72 lines
2.6 KiB
C#
72 lines
2.6 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|