vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
TCP-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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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