C#蓝牙自定义配对事件未触发,配对请求返回AccessDenied/Failed
蓝牙LE设备PIN配对失败,CustomOnPairingRequested事件未触发问题
问题描述
拥有一台需PIN码配对的蓝牙LE设备,可正常发现设备、获取服务并读取无PIN保护的特征,但配对请求持续返回AccessDenied或Failed状态。尝试使用Windows.Devices.Enumeration.DeviceInformationCustomPairing及CustomOnPairingRequested事件传入PIN码,但调用PairAsync方法时该事件从未触发,相关代码如下:
string hardAddress = "70:ac:08:0b:a7:90"; // Device Address DeviceInformation etuInfo; public BluetoothLEDevice leDevice; public async Task StartUp() { string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" }; DeviceWatcher watcher = DeviceInformation.CreateWatcher( BluetoothLEDevice.GetDeviceSelectorFromPairingState(false), requestedProperties, DeviceInformationKind.Device); //DeviceWatcher watcher = DeviceInformation.CreateWatcher(); watcher.Added += Watcher_Added; watcher.Updated += Watcher_Updated; watcher.Removed += Watcher_Removed; watcher.EnumerationCompleted += Watcher_EnumerationCompleted; watcher.Stopped += Watcher_Stopped; watcher.Start(); await Task.Delay(Timeout.Infinite); } private async void Watcher_Added(DeviceWatcher sender, DeviceInformation args) { //Debug.WriteLine($"Watcher Added: {args.Id}"); if (args.Id.EndsWith(hardAddress)) { etuInfo = args; await AttemptConnect(); } } private async Task AttemptConnect() { if (etuInfo == null) return; leDevice = await BluetoothLEDevice.FromIdAsync(etuInfo.Id); await AttemptPair(); //etuInfo.Pairing.Custom.PairingRequested += CustomOnPairingRequested; } public async Task AttemptPair() { Debug.WriteLine($"Is Paired: {leDevice.DeviceInformation.Pairing.IsPaired}"); Debug.WriteLine($"Pair Type: {leDevice.DeviceInformation.Pairing.ProtectionLevel}"); DeviceInformationCustomPairing cusPairing = leDevice.DeviceInformation.Pairing.Custom; cusPairing.PairingRequested += CustomOnPairingRequested; var result = await cusPairing.PairAsync( Windows.Devices.Enumeration.DevicePairingKinds.DisplayPin, // Tried every combination DevicePairingProtectionLevel.None // Tried every combination ); cusPairing.PairingRequested -= CustomOnPairingRequested; Debug.WriteLine($"Pairing Success: {result.Status}"); // result.Status == "AccessDenied" } public void CustomOnPairingRequested(DeviceInformationCustomPairing sender, DevicePairingRequestedEventArgs args) { // Never Gets Called Debug.WriteLine($"Pairing Args: {args.PairingKind} ::: {args.Pin}"); args.Accept("123456"); }
解决方案
1. 匹配设备实际配对种类
当前使用的DevicePairingKinds.DisplayPin可能不符合设备触发逻辑,需根据设备要求调整:
- 若设备主动发送PIN码让你输入,用
DevicePairingKinds.ProvidePin - 若需向设备显示PIN码让设备输入,用
DevicePairingKinds.DisplayPin - 尝试传入多种配对类型组合:
DevicePairingKinds.ProvidePin | DevicePairingKinds.DisplayPin
2. 调整配对保护级别
DevicePairingProtectionLevel.None可能无法触发PIN配对流程,建议使用:
DevicePairingProtectionLevel.EncryptionDevicePairingProtectionLevel.EncryptionAndAuthentication
这两种级别更符合需PIN配对的BLE设备安全要求。
3. 避免提前移除事件订阅
在PairAsync完成前移除事件订阅,会导致事件触发时处理方法已解绑。修改代码,在配对完成后再移除订阅:
public async Task AttemptPair() { // ... 原有代码 ... cusPairing.PairingRequested += CustomOnPairingRequested; var result = await cusPairing.PairAsync( DevicePairingKinds.ProvidePin | DevicePairingKinds.DisplayPin, DevicePairingProtectionLevel.Encryption ); // 配对完成后再移除订阅 cusPairing.PairingRequested -= CustomOnPairingRequested; // ... 原有代码 ... }
4. 使用DeviceInformation直接配对
尝试直接用etuInfo.Pairing.Custom而非leDevice.DeviceInformation.Pairing.Custom,避免BluetoothLEDevice.FromIdAsync建立的基础连接干扰配对流程:
private async Task AttemptPair() { Debug.WriteLine($"Is Paired: {etuInfo.Pairing.IsPaired}"); Debug.WriteLine($"Pair Type: {etuInfo.Pairing.ProtectionLevel}"); DeviceInformationCustomPairing cusPairing = etuInfo.Pairing.Custom; cusPairing.PairingRequested += CustomOnPairingRequested; var result = await cusPairing.PairAsync( DevicePairingKinds.ProvidePin, DevicePairingProtectionLevel.Encryption ); cusPairing.PairingRequested -= CustomOnPairingRequested; Debug.WriteLine($"Pairing Success: {result.Status}"); }
5. 确认应用权限
确保应用拥有蓝牙相关权限,在Package.appxmanifest中添加:
<Capabilities> <DeviceCapability Name="bluetooth" /> <DeviceCapability Name="bluetooth.le" /> </Capabilities>
6. 清理旧配对记录
若设备之前有配对失败记录,在Windows设置中移除该设备的配对信息,再重新尝试配对。
内容的提问来源于stack exchange,提问作者Dave1551
相关产品推荐
相关产品推荐

