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

.NET MAUI Windows中如何确定蓝牙设备对应的连接适配器

确定BluetoothDevice对应的BluetoothAdapter方法

首先修正你原代码的问题:原代码在循环中每次覆盖单个变量,无法保存所有适配器和设备,建议用列表存储:

// 获取所有蓝牙适配器
var adapterInfos = await DeviceInformation.FindAllAsync(BluetoothAdapter.GetDeviceSelector());
var adapters = new List<BluetoothAdapter>();
foreach (var info in adapterInfos)
{
    var adapter = await BluetoothAdapter.FromIdAsync(info.Id);
    if (adapter != null)
        adapters.Add(adapter);
}

// 获取所有蓝牙设备
var deviceInfos = await DeviceInformation.FindAllAsync(BluetoothDevice.GetDeviceSelector());
var devices = new List<BluetoothDevice>();
foreach (var info in deviceInfos)
{
    var device = await BluetoothDevice.FromIdAsync(info.Id);
    if (device != null)
        devices.Add(device);
}

下面是几种关联设备与适配器的实用方法:

1. 通过设备的父设备ID匹配

每个BluetoothDevice的DeviceInformation包含System.Devices.Parent属性,该属性值就是对应蓝牙适配器的ID,通过这个ID可以直接匹配到对应的适配器:

foreach (var device in devices)
{
    if (device.DeviceInformation.Properties.TryGetValue("System.Devices.Parent", out var parentIdObj) && parentIdObj is string adapterId)
    {
        var targetAdapter = adapters.FirstOrDefault(a => a.DeviceInformation.Id == adapterId);
        if (targetAdapter != null)
        {
            // 设备与适配器匹配成功
            Console.WriteLine($"设备「{device.Name}」对应的适配器是「{targetAdapter.Name}」");
        }
    }
}

2. 定向扫描关联仅能被单个适配器发现的设备

对于仅能被特定适配器发现的设备,你可以为每个适配器单独启动扫描,这样扫描到的设备天然属于该适配器:

// 示例针对BLE设备扫描,传统蓝牙可使用BluetoothDeviceWatcher
foreach (var adapter in adapters)
{
    var bleWatcher = new BluetoothLEAdvertisementWatcher
    {
        ScanningMode = BluetoothLEScanningMode.Active,
        // 可按需设置过滤条件,比如特定设备名称、UUID等
    };

    bleWatcher.Received += (_, args) =>
    {
        // 此处扫描到的设备由当前adapter发现,直接关联
        Console.WriteLine($"适配器「{adapter.Name}」发现设备: {args.BluetoothAddress:X}");
    };

    bleWatcher.Start();
    // 按需设置扫描时长,此处示例扫描5秒
    await Task.Delay(5000);
    bleWatcher.Stop();
}

3. 从适配器获取已连接设备

如果设备已经处于连接状态,直接通过BluetoothAdapter.ConnectedDevices属性就能获取该适配器下的所有已连接设备,无需额外匹配:

foreach (var adapter in adapters)
{
    var connectedDevices = adapter.ConnectedDevices;
    foreach (var device in connectedDevices)
    {
        Console.WriteLine($"适配器「{adapter.Name}」已连接设备: {device.Name}");
    }
}

内容的提问来源于stack exchange,提问作者user7421317

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:40:05