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?
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.
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?
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
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?
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.
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
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!
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
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).
Sieh Dir mal genau Deine beiden Strings an. > DEV_ 001401171479 > \8&1FD1D244&0 & 001401171479 _C00000000 Vielleicht hilft das ja etwas weiter
Ja danke Rufus :) Ich habe es nach 'ner viertel h auf die Ausgaben starren auch gemerkt :D Super! Jetzt wird langsam 'nen Schuh draus.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.