c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...

我想到了。 我走在正确的轨道上。

使用以下连接后:

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(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(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配对。 因此,我希望这对任何可能陷入困境的人有所帮助。


版权声明:本文为weixin_39547596原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。