Plane.Sdk3/PlaneGcsSdk_UWP/Communication/BluetoothConnection.cs

81 lines
2.5 KiB
C#
Raw Normal View History

2017-02-27 02:02:19 +08:00
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Windows.Devices.Bluetooth;
using Windows.Devices.Bluetooth.Rfcomm;
using Windows.Networking;
using Windows.Networking.Sockets;
namespace Plane.Communication
{
/// <summary>
/// 提供蓝牙通信的能力。
/// </summary>
public class BluetoothConnection : StreamSocketConnection
{
private const uint ErrorCodeDeviceTurnedOff = 0x8007048F;
private const uint ErrorCodeNotFoundElement = 0x80070490;
private HostName _remoteHostName;
public BluetoothConnection(string hostName) : this(new HostName(hostName))
{
}
public BluetoothConnection(HostName hostName)
{
_remoteHostName = hostName;
}
public override async Task OpenAsync()
{
Close();
_socket = new StreamSocket();
var chatService = await FilterDevice(hostName: _remoteHostName);
if (chatService != null)
{
var cancellationTokenSource = new CancellationTokenSource(3000);
var cancellationToken = cancellationTokenSource.Token;
try
{
await Task.Run(async () => await _socket.ConnectAsync(chatService.ConnectionHostName, chatService.ConnectionServiceName), cancellationToken);
IsOpen = true;
_inputStream = _socket.InputStream;
_outputStream = _socket.OutputStream.AsStreamForWrite();
}
catch (TaskCanceledException)
{
throw new TimeoutException();
}
}
else
{
throw new PlatformNotSupportedException("找不到匹配的蓝牙服务设备!");
}
}
private async Task<RfcommDeviceService> FilterDevice(HostName hostName)
{
try
{
var blthDevice = await BluetoothDevice.FromHostNameAsync(hostName);//获取蓝牙设备
return blthDevice.RfcommServices.FirstOrDefault();//获取Rfcomm服务对象
}
catch (Exception ex)
{
if ((uint)ex.HResult == ErrorCodeNotFoundElement)
{
return null;
}
else
{
throw new Exception(ex.Message + "hostName:" + hostName);
}
}
}
}
}