如何在c#中找到蓝牙设备的COM端口号?

Łuk*_*nik 16 c# serial-port bluetooth

我公司开发了一种使用虚拟COM端口通过蓝牙与PC通信的设备.

现在我们需要用户首先将设备与PC(MS Windows操作系统)配对,然后手动输入它的com端口号到我们的应用程序中(我敢打赌,95%的用户将在此设备上失败).

所以我希望我的应用程序向用户提供配对蓝牙设备列表(他们的"友好名称"列表),之后我想自动找出被选中设备的COM端口号.

我怎么能在c#中做到这一点?(独立于已安装的蓝牙堆栈的解决方案表示赞赏).

提前致谢.

ala*_*mcf 9

请参阅我在Widcomm蓝牙的回答:如何打开虚拟COM以了解我对许可的理解:使用二进制版本是免费的商业用途.而且,我也是图书馆的维护者.

所以简短的小题外话.我不是虚拟COM端口的忠实粉丝.使用直接'套接字'连接似乎要容易得多,而不是尝试设置COM端口,并尝试找到它的名称(见下文!),然后必须打开一个SerialPort才能使用它,然后,如果连接丢失,则不知道并且只是继续重试...使用库更容易创建和使用直接蓝牙连接!

但是,您现在可能需要解决当前任务的问题.:-)因此,使用WMI找到当前的COM端口,看看它们是否适用于您的设备.例如在PowerShell中:

C:\> Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort"
...
...
DeviceID         : COM66
PNPDeviceID      : BTHENUM\{00001101-0000-1000-8000-00805F9B34FB}\7&1D80ECD3&0&00803A686519_C00000003
Run Code Online (Sandbox Code Playgroud)

在那个大的长字符串中,可以看到目标设备的地址:00803A686519.可以使用.NET中的WMI,运行该查询,过滤带有"BTHENUM"的查询,然后解析出地址.

如果您确实需要创建新的蓝牙虚拟COM端口,请使用32feet.NET的BluetoothDeviceInfo.SetServiceState(BluetoothService.SerialPort)API.请参阅用户指南中的"蓝牙串行端口"部分,例如http://www.alanjmcf.me.uk/comms/bluetooth/32feet.NET%20--%20User%20Guide.html,以及发布.

不幸的是,我们调用的本机Win32 API并没有告诉它创建的COM端口的名称!:-(因此,在调用之前和之后运行WMI查询以查看出现的新名称(或使用System.IO.Ports.SerialPort.GetPortNames作为其更简单).

这些都是微软蓝牙堆栈的特定内容.我还没有研究过其他堆栈在这方面的表现.经过简单检查后,Widcomm的串口出现在SerialPort.GetPortNames中,但不出现在WMI查询中......


Mat*_*ams 5

首先,创建一个管理对象搜索器来搜索 WMI 数据库:

ManagementObjectSearcher serialSearcher =
                new ManagementObjectSearcher("root\\CIMV2",
                "SELECT * FROM Win32_SerialPort");
Run Code Online (Sandbox Code Playgroud)

接下来,使用 LINQ 将所有串行端口获取到查询中:

var query = from ManagementObject s in serialSearcher.Get()
            select new { Name = s["Name"], DeviceID = s["DeviceID"], PNPDeviceID = s["PNPDeviceID"] }; // DeviceID -- > PNPDeviceID
Run Code Online (Sandbox Code Playgroud)

您现在可以打印所有 COM 端口、它们的友好名称,您甚至可以过滤它们的 PNPDeviceID 以查找蓝牙设备地址。下面是一个例子:

foreach (var port in query)
{
    Console.WriteLine("{0} - {1}", port.DeviceID, port.Name);
    var pnpDeviceId = port.PNPDeviceID.ToString();

    if(pnpDeviceId.Contains("BTHENUM"))
    {
        var bluetoothDeviceAddress = pnpDeviceId.Split('&')[4].Split('_')[0];
        if (bluetoothDeviceAddress.Length == 12 && bluetoothDeviceAddress != "000000000000")
        {
            Console.WriteLine(" - Address: {0}", bluetoothDeviceAddress);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)