[英]How to Bind manually to a BlueTooth Low Energy Device in a WinForm using C#?
这个问题通常由以下问题回答: Windows UWP发现后连接到BLE设备
我目前正在编写自定义服务和测试,使用Windows 10上的C#.NET WinForm连接到低功耗蓝牙(BLE)设备。 我正在使用Framework 4.6.1。 我们正在使用带有TI CC2650 BLE子卡的TI SmartRF06评估板 。 另一位开发人员正在处理主板的固件。
当前,我使用的方法类似于上面的参考答案,因此我能够连接到已经绑定的BLE设备。 该设备是手动绑定的,Windows确实要求我输入PIN。 由于设备没有PIN,只需输入“ 0”就可以连接设备。 一旦建立连接,我就可以使用所有GATT服务并做我需要做的事情。 因此,我对找到并持有Advertising BLE设备没有任何问题。
问题是如何连接尚未配对的BLE设备? 我遍历网络,发现了许多BLE代码示例,但没有具体说明如何完成代码配对。 不确定我什至不需要配对,但Windows似乎仅在配对设备上显示我的GATT服务。
当我使用未配对的设备执行此操作时:
private void BleWatcherOnReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
var dev = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
// dev.DeviceInformation.Pairing.CanPair is true
// dpr.Status is Failed
DevicePairingResult dpr = await dev.DeviceInformation.Pairing.PairAsync(DevicePairingProtectionLevel.None);
var service = await GattDeviceService.FromIdAsync(dev.DeviceInformation.Id);
}
当未手动配对设备时,dpr的结果总是失败。 这导致GattDeviceServices
为空。 但是我能够获得BLE设备的广告和属性。
还有这种类型的连接方法,但我不知道如何使用它:
var prslt = await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds.ProvidePin, DevicePairingProtectionLevel.None,IDevicePairingSettings);
IdeviceParingSettings
是一个接口。 不确定要使用哪个类。 我在想这是我可能需要设置“ O”的PIN的地方?
在Windows中使用BLE设备没有安全性的情况下,是否有人能够与Windows中的BLE设备配对。 基本上,它应该是开放的。 我觉得我缺少一些简单的东西,或者根本不可能(我看到一些帖子声称是这种情况。其中大多数都已经有很多年了)。
我确实尝试了上述文章中描述的方法,但结果没有任何差异。
任何帮助表示赞赏。 如果您需要更多代码,请查看我在顶部提供的链接,因为这是我开始的地方。 如果有可能我做错了一个序列,我将很乐意提供我所有的实际代码。
我想到了。 我走在正确的轨道上。
使用以下连接后:
var dev = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
您需要执行自定义配对:
var prslt = await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds.ProvidePin, DevicePairingProtectionLevel.None);
但这只会给您一个错误。 您还必须创建device.DeviceInformation.Pairing.Custom.PairingRequested
事件处理程序。
所以我创建了这个处理程序:
private void handlerPairingReq(DeviceInformationCustomPairing CP, DevicePairingRequestedEventArgs DPR)
{
//so we get here for custom pairing request.
//this is the magic place where your pin goes.
//my device actually does not require a pin but
//windows requires at least a "0". So this solved
//it. This does not pull up the Windows UI either.
DPR.Accept("0");
}
在PairAsync调用之前将其连接起来,例如:
device.DeviceInformation.Pairing.Custom.PairingRequested += handlerPairingRequested;
连接我的BlueToothAdvertisementWatcher代码的示例代码:
private BluetoothLEAdvertisementWatcher BTWatch = new BluetoothLEAdvertisementWatcher();
private void Inits()
{
BTWatch.Received += new TypedEventHandler<BluetoothLEAdvertisementWatcher, BluetoothLEAdvertisementReceivedEventArgs>(BtAddRx);
BTWatch.Start();
}
private async void BtAddRx(BluetoothLEAdvertisementWatcher bw, BluetoothLEAdvertisementReceivedEventArgs args)
{
GattCommunicationStatus srslt;
GattReadResult rslt;
bw.Stop();//Stop this while inside.
device = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
if (device.DeviceInformation.Pairing.IsPaired == false)
{
/* Optional Below - Some examples say use FromIdAsync
to get the device. I don't think that it matters. */
var did = device.DeviceInformation.Id; //I reuse did to reload later.
device.Dispose();
device = null;
device = await BluetoothLEDevice.FromIdAsync(did);
/* end optional */
var handlerPairingRequested = new TypedEventHandler<DeviceInformationCustomPairing, DevicePairingRequestedEventArgs>(handlerPairingReq);
device.DeviceInformation.Pairing.Custom.PairingRequested += handlerPairingRequested;
log("Pairing to device now....");
var prslt = await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds.ProvidePin, DevicePairingProtectionLevel.None);
log("Custom PAIR complete status: " + prslt.Status.ToString() + " Connection Status: " + device.ConnectionStatus.ToString());
device.DeviceInformation.Pairing.Custom.PairingRequested -= handlerPairingRequested; //Don't need it anymore once paired.
if (prslt.Status != DevicePairingResultStatus.Paired)
{ //This should not happen. If so we exit to try again.
log("prslt exiting. prslt.status=" + prslt.Status.ToString());// so the status may have updated. lets drop out of here and get the device again. should be paired the 2nd time around?
bw.Start();//restart this watcher.
return;
}
else
{
// The pairing takes some time to complete. If you don't wait you may have issues. 5 seconds seems to do the trick.
System.Threading.Thread.Sleep(5000); //try 5 second lay.
device.Dispose();
//Reload device so that the GATT services are there. This is why we wait.
device = await BluetoothLEDevice.FromIdAsync(did);
}
var services = device.GattServices;
//then more code to finish it up.
}
如果您想断开连接,请使用:
await device.DeviceInformation.Pairing.UnpairAsync();
抱歉,代码混乱。 如果发现有人有用或有疑问,请告诉我。 我在任何地方都找不到此代码的任何WinForm示例。 实际上,在没有UI的情况下,我找不到任何代码来显示如何与PIN配对。 因此,我希望这对任何可能陷入困境的人有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.