You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.Encryption
  • DevicePairingProtectionLevel.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:15:30