Plane.Sdk3/PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.NET.cs
2017-02-27 02:02:19 +08:00

76 lines
2.3 KiB
C#
Raw 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.

#if !NETFX_CORE
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace Plane.Communication
{
public partial class UdpThroughDtuServiceConnection
{
private UdpClient _client;
/// <summary>
/// 初始化 <see cref="UdpServerConnection"/> 的实例,并指定远程终结点和发送数据所使用的方法。
/// </summary>
public UdpThroughDtuServiceConnection(string ip, int port)
{
DtuServiceIP = ip;
DtuServicePort = port;
_client = new UdpClient();
}
/// <summary>
/// 登陆到Dtu服务端。
/// 登陆方式极其简单只需发送一个数据包内含希望连接到的飞机ID
/// </summary>
/// <returns></returns>
public virtual async Task OpenAsync()
{
if (!string.IsNullOrEmpty(CopterIDToBind))
{
_client.Connect(IPAddress.Parse(DtuServiceIP), DtuServicePort);
var bytes = ConstructHandShakeDatagramToDTUService();
await _client.SendAsync(bytes, bytes.Length);
//等待服务端的应答,获取是否连接成功飞机的结果
var result = await _client.ReceiveAsync();
var ret = AnalyzeHandShakeDatagramFromDTUService(result.Buffer);
if (ret == DTUHandShakeResult.Successful)
{
IsOpen = true;
}
else if (ret == DTUHandShakeResult.Occupied)
{
throw new Exception("飞机已被占用!");
}
else if (ret == DTUHandShakeResult.NotExisted)
{
throw new Exception("飞机不存在!");
}
}
}
public virtual void Close()
{
IsOpen = false;
_client.Close();
}
private async Task SendAsync(byte[] datagram, int bytes)
{
try
{
await _client.SendAsync(datagram, bytes).ConfigureAwait(false);
}
catch (Exception ex)
{
Close();
RaiseExceptionThrown(ex);
}
}
}
}
#endif