Forum: PC-Programmierung Visual-Basic virtual COM-PORT erkennen, Bluetoothmodulnamen auslesen?!


von MOBA 2. (Gast)


Lesenswert?

Hallo Leute,

ich habe eine kurze Frage zu Visual-Baisc. Ich habe mir ein kleines 
Terminal geschrieben, mitdem ich meine Geräte ansprechen und 
Firmwareupdates durchführen kann. Da diese Geräte überwiegend alle 
Bluetoothmodule besitzen, verbinde ich mich über COM-Ports.

Jetzt zu meinem Problem: Das Bluetoothmodul erstellt immer 2 COM-Ports 
(einen "echten" und einen "virtual", schätze ich mal). Es geht nur einer 
davon; in der Verbindungsliste werden aber alle angezeigt - so muss man 
erst immer durch testen welcher das ist (das Terminal erkennt nach 
verbinden, ob er "echt" ist, und ob das passende Gerät dran hängt, sonst 
wird er automatisch geschlossen und eine Fehlermeldung ausgegeben).
- Ist es möglich, direkt nur in der Liste die richtigen Com-Ports 
anzuzeigen?

Zweite Frage:
- Bei vielen Geräten hat man zwangsläufig viele COM-Ports in der Liste; 
ich dachte mir, da Windows ja auch den Namen des Gerätes weiß (also den 
Namen des Bluetoothmoduls) und daraus irgendwie eine Zuweisung tätigt 
zum COM-PORT sollte es doch möglich sein, in der Verbindungsliste nicht 
nur COM1 bis COMn anzuzeigen, sondern den Bluetoothmodulnamen (bspw: 
COM1 (meinGeraet))?

Weiß jmd. wie und ob das möglich ist?

von MOBA 2. (Gast)


Lesenswert?

Weiß das echt keiner?

von bluppdidupp (Gast)


Lesenswert?


von Einhart P. (einhart)


Lesenswert?

Meine USB Geräte und virtuelle COM Ports erkenne ich mittels dem WMI 
Service.

Der Code fängt so an:

    Try
      oWMISrv = GetObject("winmgmts:\\.\root\cimv2")

      collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity")

      For Each iDvc In collDvcs
.
.
.

Mit dem Service bekommt man alle möglichen Systeminformationen.

von MOBA 2. (Gast)


Lesenswert?

Hallo Einhart,

das hört sich schonmal ganz Interessant an, brauche ich dafür eine .dll 
oder kann ich das über eine .lib einbinden?

Weißt du ob ich dort auch den Bluetoothnamen direkt einem COM-PORT 
zuordnen kann? Unter Systemsteuerung ist dieses nämlich nicht zu sehen.

Ich kenne dieses WMI noch gar nicht, wie kann ich denn die 2 COM-PORTs 
vom Bluetoothmodul differenzieren?

von Einhart P. (einhart)


Lesenswert?

Moin Marius,

Eine DLL benötigst du nicht. System.Management muss impotiert werden

Imports System.Management

Im Bezug auf Bluetooth habe ich keine Erfahrung. Ich nehme an dass die 
dafür nötigen Informationen auch dabei sind. Einfach 'mal die Devices im 
Debug durchgehen und anschauen welche Infos enthalten sind.

Oder die Stichwörter googlen: vb.net WMI bluetooth

Bei den USB VCOM Ports sehe ich neben PID und VID die Seriennummern der 
Geräte. Damit kann ich auch gleiche Geräte identifizieren.

: Bearbeitet durch User
von MOBA 2. (Gast)


Lesenswert?

Hallo Enhart,

ich bin nicht so der PC-Programmierer, ich habe ehrlich gesagt keine 
Ahnung wonach ich suchen muss.

Du hattest mir so einen kleinen Code Schnipsel gegeben - könnte ich 
davon einen ganzen Auszug bekommen um mal zu testen was ich dort 
zurückgeliefert bekomme?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du kannst ja zunächst mal die "for each"-Schleife vervollständigen und 
Dir dann im Debugger ansehen, was iDvc jeweils an Informationen enthält.

Ja, auch VB hat so etwas.

von Einhart P. (einhart)


Lesenswert?

Versuch's hiermit (ein Formular mit einer Multiline-Textbox:

Imports System.Management

Public Class Form1

  Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles 
Me.Shown
    Dim oWMISrv, collDvcs

    Try
      oWMISrv = GetObject("winmgmts:\\.\root\cimv2")
      collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity")

      For Each iDvc In collDvcs
        TextBox1.Text = TextBox1.Text & iDvc.Caption & vbCrLf
        TextBox1.Text = TextBox1.Text & " - " & iDvc.DeviceID & vbCrLf & 
vbCrLf
      Next
    Catch
      MsgBox("DeviceInfo", vbCritical, Err.Description)
    End Try

  End Sub
End Class

Das sollte dir einiges an Systeminformationen zeigen. Das ist nur ein 
kleiner Teil der mit WMI Abfragemöglichkeiten.

: Bearbeitet durch User
von bluppdidupp (Gast)


Lesenswert?


von MOBA 2. (Gast)


Lesenswert?

Hallo bluppdidupp & Einhart,

den Link den du mir geschickt hast ist super; das Programm ist Klasse, 
nun kann ich wenigstens mal gucken wonach ich suche - dein Quellcode ist 
tlws. dadrin auch enthalten, Einhart.

Problem: DeviceID liefert mir die COM1-COMn (das geht auch mit 
.getPortNames())

Ich habe mir alle Funktionen was unter SerialPort gelistet war 
angeguckt. Ich bekomme dort aber leider nur die Namen wie im Geräte 
Manager zu sehen (Standartmäßige Serial-über-Bluetooth-Verbindung). So 
heißen die halt alle :(

Was ich gerne sehen wollte, war der Name des Gerätes, wenn man auf das 
Bluetoothsymbol 2x klickt und dann unter PC & Geräte -> Bluetooth 
[Windows 8.1]. Dort stehen dann die gekoppelten Geräte mit Ihrem Namen. 
Wie kann ich den denn bekommen (zugewiesen auf einen Port)?

Der Code von Einhart liefert diese Namen, allerdings nicht in Bezug zu 
dem COM-PORT :|. Auf jedenfall schonmal einen Schritt weiter, danke dir.

Jetzt wäre noch super, wenn ich dazu irgendwie den Com-Port herausfinden 
könnte.

Ich bekomme durch Einharts Quellcode den Namen und die Seriennummer - 
vll. kann ich jetzt die Seriennummer vom Com-Port auslesen und das 
vergleichen - ich werde es mal testen und mich wieder melden!

von fbi (Gast)


Lesenswert?

Bluetooth-Geräte kann man auch über die Socket-Schnittstelle ansprechen.
In C/C++ z.B. mit:
1
socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
Dann weiter als Server (bind/WSASetService/listen/accept...) oder als 
Client (connect...).
Wenn man den Gerätenamen kennt gehen auch z.B.: 
WSALookupServiceBegin/WSALookupServiceNext/WSALookupServiceEnd um die 
BT-Adresse dazu rauszubekommen.
Ansonsten, mit BluetoothFindFirstRadio/... findet man die lokalen 
BT-Adapter, mit BluetoothFindFirstDevice/... die Geräte usw.
Prinzipiell sollten die APIs auch in VB ansprechbar sein.
Siehe auch 
http://msdn.microsoft.com/en-us/library/windows/desktop/aa362932%28v=vs.85%29.aspx

Ansonsten mal nach c4fdevkit suchen, da scheint auch was in der Richtung 
drin zu sein.

Und noch ein paar Links:
http://32feet.codeplex.com
http://blogs.microsoft.co.il/shair/2009/06/21/working-with-bluetooth-devices-using-c-part-1

von MOBA 2. (Gast)


Lesenswert?

Hi Einhart

ich habe jetzt mal einiges versucht. Ich bekomme von deinem Quellcode 
die ID und den echten Bluetoothnamen - dann bekomme ich noch als 
komplett anderen Eintrag einen COM-PORT und eine andere ID.

Ich dachte die beiden IDs seien gleich -> dann hätte ich PORT einfach 
dem Namen zuweisen können. Nun merke ich gerade das das unterschiedlich 
ist.

Bspw. diese beiden Teile gehören zusammen - jetzt müsste ich noch in 
Software herausfinden, dass diese zusammengehören und könnte das dann 
zuweisen und in der Gerätebox listen (z. Zt. stehen dort halt nur die 
COM1-COMn, man weiß halt nicht welcher jetzt für bspw. HouseControl 
ist).
1
HouseControl-BTHENUM\DEV_001401171479\8&3265BCB9&0&BLUETOOTHDEVICE_001401171479
2
3
gehört zu
4
5
(COM9)-BTHENUM\{00001101-0000-1000-8000-00805F9B34FB}_LOCALMFG&000A\8&1FD1D244&0&001401171479_C00000000

Wie man schön sehen kann, bekomme ich jetzt den COM-PORT (COM9) und den 
Namen (HouseControl).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal genau Deine beiden Strings an.

> DEV_  001401171479

> \8&1FD1D244&0 & 001401171479 _C00000000

Vielleicht hilft das ja etwas weiter

von MOBA 2. (Gast)


Lesenswert?

Ja danke Rufus :)

Ich habe es nach 'ner viertel h auf die Ausgaben starren auch gemerkt :D

Super! Jetzt wird langsam 'nen Schuh draus.

von MOBA 2. (Gast)


Lesenswert?

So,

ich danke euch für eure Hilfe!!

Ich poste hier mal meinen (fast) fertigen Quellcode der Funktion, welche 
ausließt und die zusammengefügten Namen und Com-Port in einer Funktion 
als Array zurückgibt. Momentan ausschließlich Bluetooth - USB habe ich 
noch keine Geräte, würde dann aber aktualisiert werden. Man kann die 
Funktion aufrufen, und dann bspw. für eine Combo-Box nutzen. Vll. hat ja 
jmd. ein ähnliches Problem und kann es gebrauchen.


1
Public Function GetPortAndIDNames() As String()
2
        Dim oWMISrv, collDvcs
3
        Const SizeOF = 9999 'max devices
4
        Dim DeviceIDNAME As String
5
        Dim DeviceCOM_ID(SizeOF) As String
6
        Dim DeviceID_NAME(SizeOF) As String
7
        Dim SerialPortDevices(SizeOF) As String
8
        Dim runs(5) As Integer
9
        Dim BufferID As String()
10
        Dim bufStrNM As String()
11
        Dim bufStrPT As String()
12
13
        'Get and combine Objekts
14
        Try
15
            oWMISrv = GetObject("winmgmts:\\.\root\cimv2")
16
            collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity")
17
18
            For Each iDvc In collDvcs
19
                DeviceIDNAME = iDvc.Caption & "{" & iDvc.DeviceID
20
21
                'get only Bluetooth Devices, NO USB
22
                If (InStr(1, DeviceIDNAME, "Seriell") > 0 Or InStr(1, DeviceIDNAME, "Serial") > 0 Or InStr(1, DeviceIDNAME, "BTHENUM\DEV") > 0) And InStr(1, DeviceIDNAME, "BTHENUM") > 0 Then
23
                    If InStr(1, DeviceIDNAME, "COM") > 0 Then
24
                        DeviceCOM_ID(runs(0)) = DeviceIDNAME
25
                        'MsgBox(DeviceCOM_ID(runs(0)))
26
                        runs(0) = runs(0) + 1
27
                    Else
28
                        DeviceID_NAME(runs(1)) = DeviceIDNAME
29
                        'MsgBox(DeviceID_NAME(runs(1)))
30
                        runs(1) = runs(1) + 1
31
                    End If
32
                End If
33
            Next
34
        Catch
35
        End Try
36
37
        For lauf As Integer = 0 To (runs(1) - 1) Step 1
38
39
            BufferID = DeviceID_NAME(lauf).Split("{")   'split out of name
40
            BufferID = BufferID(1).Split("_")           'split for ID
41
42
            For lauf2 As Integer = 0 To (runs(0) - 1) Step 1
43
44
                'Test Namespace
45
                If InStr(1, DeviceCOM_ID(lauf2), BufferID(2)) > 0 Then          'ID in Namespace?
46
47
                    'get local port and name
48
                    bufStrPT = DeviceCOM_ID(lauf2).Split(" ")
49
                    bufStrPT = bufStrPT(2).Split("{")
50
                    bufStrNM = DeviceID_NAME(lauf).Split("{")
51
52
                    SerialPortDevices(runs(3)) = (bufStrNM(0) & " " & bufStrPT(0))
53
54
                    runs(3) = runs(3) + 1
55
                End If
56
            Next
57
        Next
58
59
        Return (SerialPortDevices)
60
    End Function

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.