[c#] Wie kann ich eine COM-Port-Nummer eines Bluetooth-Geräts in c # herausfinden?


2 Answers

Erstellen Sie zunächst einen Management-Objekt-Searcher, um die WMI-Datenbank zu durchsuchen:

ManagementObjectSearcher serialSearcher =
                new ManagementObjectSearcher("root\\CIMV2",
                "SELECT * FROM Win32_SerialPort");

Als nächstes verwenden Sie LINQ, um alle seriellen Ports in eine Abfrage zu bekommen:

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

Sie können jetzt alle COM-Ports und ihre Anzeigenamen drucken und Sie können sogar über ihre PNPDeviceIDs die Bluetooth-Geräteadresse suchen. Hier ist ein Beispiel:

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);
        }
    }
}
Question

Meine Firma hat ein Gerät entwickelt, das via Bluetooth über einen virtuellen COM-Port mit einem PC kommuniziert.

Jetzt brauchen wir einen Benutzer, der zuerst ein Gerät mit einem PC (MS Windows OS) koppelt und dann seine Com-Port-Nummer manuell in unsere Anwendung eingibt (ich wette, 95% der Benutzer werden bei dieser Aufgabe scheitern).

Daher möchte ich, dass meine Anwendung einem Benutzer eine Liste gekoppelter Bluetooth-Geräte (eine Liste ihrer "freundlichen Namen") präsentiert, und danach möchte ich die COM-Port-Nummer des ausgewählten Geräts automatisch herausfinden.

Wie kann ich es in c # tun? (eine Lösung unabhängig von installierten Bluetooth-Stack wird geschätzt).

Danke im Voraus.




    private static string FindSerialPortForRFIDReaderCore()
    {
        string serialPort = "";

        List<string> ports = new List<string>();

        System.Management.ManagementObjectSearcher Searcher = new System.Management.ManagementObjectSearcher("Select * from WIN32_SerialPort");

        foreach (System.Management.ManagementObject Port in Searcher.Get())
        {
            if (Port["PNPDeviceID"].ToString().ToUpper().Contains("MacAddress")) 
                ports.Add(Port["DeviceID"].ToString());
        }

        if (ports.Count > 1) // There are more than one Serial Ports created for the bluetooth device.
            serialPort = ports.OrderByDescending(p => p).FirstOrDefault();
        else if(ports.Count == 1)
            serialPort = ports[0];


        return serialPort;
    }



Ich schaffe es, den Bluetooth-Namen und den COM-Port zu bekommen, indem ich den Registrierungsschlüssel manipuliere

Der Pseudocode zum Erhalten der Bluetooth-Information ist unten:

  • Auflisten aller COM-Anschlüsse, die im PNP verfügbar sind
  • Erhalte das Gerät classGuid
  • Suche die Bluetooth-Adresse von der ClassGuid
  • Wenn die Bluetooth-Adresse bekannt ist, kann der Bluetooth-Name von dieser Registrierung SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Devices

Der Code ist unten, rufen Sie einfach den GetBluetoothPort () auf, es wird eine Liste von Bluetooth-Geräten zurückgeben und Sie können sie verbinden, indem Sie die COM-Port-Nummer an die SerialPort-Klasse übergeben

public static string[] GetBluetoothPort()
{
    Regex regexPortName = new Regex(@"(COM\d+)");

    List<string> portList = new List<string>();

    ManagementObjectSearcher searchSerial = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");

    foreach (ManagementObject obj in searchSerial.Get()) {
        string name = obj["Name"] as string;
        string classGuid = obj["ClassGuid"] as string;
        string deviceID = obj["DeviceID"] as string;

        if (classGuid != null && deviceID != null) {
            if (String.Equals(classGuid, "{4d36e978-e325-11ce-bfc1-08002be10318}", StringComparison.InvariantCulture)) {
                string[] tokens = deviceID.Split('&');

                if (tokens.Length >= 4) {
                    string[] addressToken = tokens[4].Split('_');
                    string bluetoothAddress = addressToken[0];

                    Match m = regexPortName.Match(name);
                    string comPortNumber = "";
                    if (m.Success) {
                        comPortNumber = m.Groups[1].ToString();
                    }

                    if (Convert.ToUInt64(bluetoothAddress, 16) > 0) {
                        string bluetoothName = GetBluetoothRegistryName(bluetoothAddress);
                        portList.Add(String.Format("{0} {1} ({2})", bluetoothName, bluetoothAddress, comPortNumber));
                    }
                }
            }                    
        }
    }

    return portList.ToArray();
}

private static string GetBluetoothRegistryName(string address)
{
    string deviceName = "";

    string registryPath = @"SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Devices";
    string devicePath = String.Format(@"{0}\{1}", registryPath, address);

    using (RegistryKey key = Registry.LocalMachine.OpenSubKey(devicePath)) {
        if (key != null) {
            Object o = key.GetValue("Name");

            byte[] raw = o as byte[];

            if (raw != null) {
                deviceName = Encoding.ASCII.GetString(raw);
            }
        }
    }

    return deviceName;
}



Related