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

如何在C#中编程获取蓝牙设备的Outgoing ComPort(输出串口)

获取蓝牙配对后的传出COM口(C#实现)

嘿,这个需求我之前处理过好几次,在C#里自动获取蓝牙配对后的传出COM口,有两种比较靠谱的方案,我给你详细讲讲:

方法一:通过WMI查询

Windows Management Instrumentation(WMI)里存储了系统硬件的详细信息,包括串口设备。我们可以通过筛选蓝牙相关的串口,并识别标记为“Outgoing”的端口。

步骤:

  1. 首先在项目中添加System.Management引用(右键项目→添加→引用→找到System.Management)
  2. 使用以下代码查询:
using System.Management;

public static string GetBluetoothOutgoingComPort(string targetDeviceName)
{
    // 遍历所有串口设备
    var serialPortSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort");
    foreach (ManagementObject port in serialPortSearcher.Get())
    {
        string portDescription = port["Description"]?.ToString();
        string portName = port["Name"]?.ToString(); // 格式为COMx

        // 过滤条件:描述包含蓝牙、Outgoing,且匹配目标设备名称(可根据需求调整)
        if (!string.IsNullOrEmpty(portDescription) 
            && portDescription.Contains("Bluetooth") 
            && portDescription.Contains("Outgoing")
            && portDescription.Contains(targetDeviceName))
        {
            return portName;
        }
    }

    // 如果没找到返回null
    return null;
}

注意点:

  • 不同设备的描述文本可能略有差异,比如有些是Bluetooth Serial Port (Outgoing),你可以根据实际情况调整判断逻辑
  • 不需要管理员权限就能执行WMI查询

方法二:读取Windows注册表

蓝牙设备的串口映射信息会存储在注册表的特定路径下,直接读取这里的数据会更准确,尤其是当WMI描述不标准的时候。

步骤:

  1. 确定目标蓝牙设备的MAC地址(可以通过蓝牙设置获取,格式如00:1A:7D:DA:71:13)
  2. 使用以下代码读取注册表:
using Microsoft.Win32;

public static string GetBluetoothOutgoingComPortFromRegistry(string deviceMacAddress)
{
    // 将MAC地址转换为注册表要求的格式:去掉冒号并大写,比如001A7DDA7113
    string formattedMac = deviceMacAddress.Replace(":", "").ToUpperInvariant();
    string registryPath = $"SYSTEM\\CurrentControlSet\\Services\\BTHPORT\\Parameters\\Devices\\{formattedMac}";

    // 打开注册表项(需要管理员权限)
    using (RegistryKey deviceKey = Registry.LocalMachine.OpenSubKey(registryPath))
    {
        if (deviceKey != null)
        {
            // 读取传出串口的数值(存储的是整数,比如3对应COM3)
            object outgoingPortValue = deviceKey.GetValue("SerialPortOut");
            if (outgoingPortValue != null && int.TryParse(outgoingPortValue.ToString(), out int portNumber))
            {
                return $"COM{portNumber}";
            }
        }
    }

    return null;
}

注意点:

  • 读取HKEY_LOCAL_MACHINE下的注册表项需要管理员权限,所以你的程序可能需要以管理员身份运行
  • 该路径在Windows 10/11上是稳定的,旧版本系统可能略有不同

额外提示

如果你不知道目标设备的名称或MAC,可以先通过WMI枚举所有蓝牙设备,获取它们的标识信息后再进行筛选:

// 枚举所有蓝牙设备
var bluetoothSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%Bluetooth%'");
foreach (ManagementObject device in bluetoothSearcher.Get())
{
    string deviceName = device["Name"]?.ToString();
    string deviceId = device["DeviceID"]?.ToString();
    // 这里可以提取MAC地址或其他标识
    Console.WriteLine($"设备名称: {deviceName}, 设备ID: {deviceId}");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:06