| |
VB.NET - Ein- und UmsteigerTCP-Verbindung aufbauen | | | Autor: Volker Bunge | Datum: 26.02.17 10:38 |
| Hallo zusammen,
ich möchte ein kleines VB 2010 Express Programm schreiben, welches für meine Eisenbahnanlage eine Lok steuert. Meine Zentrale ist die Rautenhaus RMX950USB Zentrale mit der RMX PC-Zentrale 2.0. In dieser PC-Zentrale gibt es eine RMX-Net Schnittstelle mit der man über eine TcpClient-Klasse die Daten austauschen kann.
Folgende drei Links habe ich erhalten
https://msdn.microsoft.com/de-de/library/system.net.sockets.tcpclient(v=vs.110).aspx
Beispiele zur Verwendung der Klasse finden Sie z.B. hier:
https://code.msdn.microsoft.com/windowsdesktop/TCP-Communication-in-VBNET-f6c48ca0/view/Discussions#content
https://www.vb-paradise.de/index.php/Thread/16242-Ausf%C3%BChrliches-TCP-und-UDP-Tutorial/
Jetzt habe ich mit folgendem Code (Siehe leider weiter unten, Eintrag hier sonst zu lang) kann ich in der Login-Sub auch die erste Anweisung 0x7c senden. Sobald ich aber die zweite Anweisung 0x04 senden möchte, bekomme ich die Fehlermeldungs-Nr 57 "IOException" wurde aufgefangen. In die Übertragungsverbindung können keine Daten geschrieben werden: Eine bestehende Verbindung wurde softwaregesteuert durch den Hostcomputer abgebrochen.
Ich habe auch noch eine Doko über das RMX-Net Protokoll vorliegen. Da ich jetzt nicht sicher bin, ob ich diese hier anhängen darf, nur einmal ein kurzer Auszug aus der Anleitung
Aufbau der Datenpakete für Befehle und Antworten
Ein Datenpaket beginnt immer mit drei Headerbytes. Das erste hat den festen Wert 0x7c (Dezimal
124, Binär 01111100), das zweite gibt die Gesamtzahl der im Befehl enthaltenen Bytes (inkl. der
Headerbytes) an. Das dritte Byte steht für die Art des Befehls (OPCODE) bzw. der Antwort.
Danach folgen die befehlsspezifischen Nutzdaten.
<0x7c><COUNT><OPCODE><n * DATA>
Anforderung einer Positivquittung <0x7c><0x04><0x00><0x00>
Serverantwort: Positivquittung <0x7c><0x04><0x00><0x00>
Befehl mit unbekanntem OPCODE <0x7c><0x04<0x0f><0x00>
Serverantwort: Negativquittung <0x7c><0x04><0x01><0x01>
Info der Negativquittung 0x01: unbekannter OPCODE
Info der Negativquittung 0x03: Loknummer nicht in Datenbank
Info der Negativquittung 0x04: Eingabefehler
Info der Negativquittung 0x05: Mode ungleich 0x01
Info der Negativquittung 0x07: Eingabe Lokomotiven Datenbank voll
Info der Negativquittung 0x08: Steuerkanäle belegt
Wo ich jetzt schon meine ersten Schwierigkeiten habe, ist die Art der Befehlsabfolge. Die Klammern stellen ja die einzelnen Byte da und somit die einzelen "Befehle". Meine erste Frage lautet daher: Muss ich diese einzeln senden (also wie oben über eine Schleife) oder kann ich die auch in einem String senden? (welches Trennzeichen ist evtl. dann nötig?). Mit welchem Datentyp kann/muss ich hier am besten arbeiten?
Wenn ich das jetzt richtig verstanden habe, dann muss mein Programm ja als erstes einen "Befehl" senden (also die Klammerabfolge) und dann auf die Rückantwort der Zentrale warten.
Ich werde dann wohl einen Client und einen MultiThread Server brauchen, der dann solange wartet, bis Antworten von der Zentrale kommen. Der Server läuft also permanent und überwacht den Eingang. Der Client reagiert nur auf meine Befehle. Der Server, sobald er eine Rückmeldung erhält, wertet die Daten aus und steuert mein Programm bzw. mein Lok.
Wäre schön, wenn mir einer von Euch bei meinem Problem helfen könnte.
Vielen Dank
Volker | |
Re: TCP-Verbindung aufbauen | | | Autor: Volker Bunge | Datum: 26.02.17 10:39 |
| hier nun der für oben benötigte Code
Imports System.Net.Sockets
Imports System.IO
Public Class Form1
'Variablen:
Dim stream As NetworkStream
Dim streamw As StreamWriter
Dim streamr As StreamReader
Dim Client As New System.Net.Sockets.TcpClient
Dim IP As String = "MeinRechner-PC"
Dim Port As Integer = 950
'Dim loginname As String = "abc" ' Diese Variable ist nicht Pflicht! Aber _
nützlich für ein Chatprogram...
'_________________
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Dim i As Integer = Convert.ToSByte("0x7c", 16)
MsgBox(i)
' Exit Sub
Try
Client.Connect(IP, Port) 'Client verbindet sich mit IP:
' 192.168.111.17 und Port 4000
If Client.Connected Then
Deklare_Streams()
login() ' Sub Login
End If
Catch ex As Exception
MsgBox("Verbidnung konnte nicht mit " & IP & " und Port " & Port & _
" aufgebaut werden!")
End Try
' Eine evtl. alte Verbindung beenden
MsgBox(Client.Connected)
Client.Close() ' Nichts einfacher als das
End Sub
Sub Deklare_Streams()
stream = Client.GetStream ' Stream wird auf Client
' verwiesen
streamw = New StreamWriter(stream) ' Stream zum Senden wird
' deklariert
streamr = New StreamReader(stream) ' Stream zum Empfangen wird
' deklariert
End Sub
Sub client_send(ByVal text As String)
streamw.WriteLine(text)
'streamw.Flush()
End Sub
Function client_recieve() As String
client_recieve = streamr.ReadLine
End Function
' Nach der erfolgreichen verbindung mit der IP und dem Port wird dieser Sub
' aufgerufen:
Sub login()
Try
'Hier kann man jetzt empfangen wie man will.
'Auch die reinfolge ist egal.
'Ich benutzte hier 1 mal senden, einmal empfangen und dann wieder
' von vorne...
'Man kann aber auch 2 mal Empfangen und 2 mal Senden nehmen
' oder...... wies einem so bekommt^^
'client_send("onl ") '& loginname)
' client_send(TBox_Senden.Text)
Dim Zum_Senden(4) As String
Zum_Senden = {"0x7c", "0x04", "0x00", "0x00"}
For i As Integer = 0 To 3
client_send(Zum_Senden(i))
streamw.Flush()
Next
MsgBox("client_recieve() = " & client_recieve()) 'Und hier wird
' der empfangene Stream, der vom Server als Antwort gesendet wurde,
' in einer MSGBOX ausgegeben.
'If client_recieve() = "ok" Then 'Oder sonst irgend was. Ist nur _
ein Beispiel für einen Login
' Send_irgendwas() ' Hier kann gehts zum nächsten sub um irgend _
welche Daten zu versenden...
'Else
' 'Hier den Code wenn das Anmelden Fehlgeschlagen hat. Goto oder _
einen Sub aufrufen oder....
' Exit Sub ' Versteht sich von Selbst...
'End If
' Verbindung beenden
Client.Close() ' Nichts einfacher als das
Catch
' Hier kann man eine Error Message ausgeben oder eine Automatische
' Fehlerbehebung machen,....
' Verbindung beenden
Client.Close() ' Nichts einfacher als das
MsgBox("Fehlernr.: " & Err.Number & " " & Err.Description)
End Try
End Sub
Sub Send_irgendwas()
client_send("Irgendwas")
If client_recieve() = "Auch wieder irgendwas..." Then
'.....
Else
'....
End If
' Und soo weiter...
' Und wenn man die verbidnugn schliesen will, dann einfach:
Client.Close()
' Nichts einfacher als das!^^
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) _
Handles Button2.Click
' Befehl über den TCP-Clint senden
client_send(TBox_Senden.Text)
MsgBox(client_recieve()) 'Und hier wird der empfangene Stream, der
' vom Server als Antwort gesendet wurde, in einer MSGBOX ausgegeben.
' Verbindung beenden
Client.Close() ' Nichts einfacher als das
End Sub
End Class | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|