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




(6)

Siehe meine Antwort auf Widcomm bluetooth: Wie öffne ich die virtuelle COM für mein Verständnis der Lizenz: die Verwendung der binären Version ist frei für kommerzielle Nutzung. Und auch, dass ich die Bibliothek pflege.

Also ein kurzer kleiner Exkurs. Ich bin kein großer Fan von virtuellen COM-Ports. Es scheint immer einfacher zu sein, eine direkte "Sockets" -Verbindung zu verwenden, anstatt einen COM-Port einzurichten und zu versuchen, den Namen zu finden, unter dem er erstellt wurde (siehe unten!), Und dann einen SerialPort zu öffnen, um ihn zu benutzen. und dann, wenn die Verbindung verloren ist, weiß man es nicht und muss es einfach weiter versuchen ... Mit der Bibliothek ist es viel einfacher, diese direkte Bluetooth-Verbindung zu erstellen und zu verwenden!

Allerdings möchten Sie im Moment vielleicht eine Lösung für Ihre aktuelle Aufgabe. :-) Verwenden Sie also WMI, um die aktuellen COM-Anschlüsse zu finden und festzustellen, ob sie für Ihr Gerät geeignet sind. Zum Beispiel in 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

In diesem großen langen String sieht man die Adresse des Zielgerätes: 00803A686519. Man kann WMI von .NET verwenden, diese Abfrage ausführen, die mit "BTHENUM" filtern und dann die Adresse analysieren.

Wenn Sie einen neuen virtuellen Bluetooth-COM-Port erstellen müssen, verwenden Sie die BluetoothDeviceInfo.SetServiceState (BluetoothService.SerialPort) -API von 32feet.NET. Siehe den Abschnitt "Bluetooth Serial Ports" im Benutzerhandbuch, z. B. unter http://www.alanjmcf.me.uk/comms/bluetooth/32feet.NET%20--%20User%20Guide.html und die Klassendokumentation in der Freisetzung.

Leider teilt die native Win32-API, die wir aufrufen, nicht den Namen des COM-Ports, den sie erstellt hat! :-( Führen Sie die WMI-Abfrage vor und nach dem Aufruf aus, um zu sehen, welcher neue Name angezeigt wurde (oder verwenden Sie System.IO.Ports.SerialPort.GetPortNames als einfacher).

Das ist alles spezifisch für den Microsoft Bluetooth Stack. Ich habe nicht untersucht, wie sich andere Stapel in dieser Hinsicht verhalten. Nach einer kurzen Überprüfung erscheinen die seriellen Ports von Widcomm in SerialPort.GetPortNames, aber nicht in der WMI-Abfrage ...

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.


Vielleicht ist es nicht das, wonach du suchst, und vielleicht hast du deine Antwort schon gefunden ...

Ich habe gerade eine Frage gefunden, die nicht genau wie Ihre ist, aber für mich funktioniert .. Mit dieser können Sie herausfinden, welche Ihrer COM-Ports von einem Bluetooth-Gerät stammen: - Bestimmen, ob die serielle Schnittstelle normal COM oder SPP ist

Ich hoffe es hilft irgendwie. Wenn Sie herausfinden, wie Sie tun können, was Sie wollten, lassen Sie es mich wissen. Vielen Dank.


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

Um die Informationen zu einem Remote-Gerät einschließlich seines Namens zu erhalten, verwenden Sie 32feet.NET:

BluetoothAddress addr = ... ...
BluetoothDeviceInfo info = new BluetoothDeviceInfo(addr);
string name = info.DeviceName;

Wenn Sie die Bibliothek nicht verwenden, müssen Sie Win32s BluetoothGetDeviceInfo aufrufen / aufrufen.


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

Ich füge diese Lösung für Leute hinzu, die den gleichen Fehler machen wie ich.

In den meisten Fällen: Benennen Sie Ihre Projektdatei 'serial.py' um und löschen Sie serial.pyc falls vorhanden, dann können Sie einfach 'serial importieren' ohne Attributfehler ausführen.

Problem tritt auf, wenn Sie "etwas" importieren, wenn der Name Ihrer Python-Datei "something.py" lautet.







c# serial-port bluetooth