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




c# bluetooth example (4)

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.

https://code.i-harness.com


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.


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

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

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 ...





bluetooth