TCP-Verbindung habe ich noch nicht verstanden

Erste Ansprechstelle für technische Fragen der Add-On Bastler, Fragen/Umgang mit den Zusi 2-Editoren
Nachricht
Autor
funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

TCP-Verbindung habe ich noch nicht verstanden

#1 Beitrag von funkheld »

TCP-Verbindung zum Port 1435 , wie funktioniert das ?
Ich möchte die Daten von Zusi mit meinem Purebasicprogramm auf den gleichen Rechner abfangen/abfragen und weiterverarbeiten mit dem Purebasciprogramm. Es können ja Instrumentendaten abgefragt werden gemäss Doku.
Welchen Daten kann ich wie vom Intrumentenboard im ZUsi abfragen ?

Ich weiss, ich bin als Neuling wieder zu Neugierig, aber dieses Thema interessiert mich neben dem Simulieren.
Wer kann hier weiterhelfen, vielleicht gibt es noch einige Interessenten die diese Hürde auch mal begreifen möchten.

Der 2.Schritte für mich wäre dann die Kommunikation nach aussen. Aber erstmal möchte ich den Grundsatz/Kommunikaion auf den gleichen Rechner durchführen.

Danke.

Gruss
peter
Zuletzt geändert von funkheld am 05.02.2012 18:46:16, insgesamt 3-mal geändert.

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33449
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

Re: TCP-Verbindung habe ich noch nicht verstanden

#2 Beitrag von Carsten Hölscher »

Die Dokumentation zum TCP-Server (wenn nicht mit auf der CD bitte mal Forumssuche nutzen) erklärt das Protokoll im Detail.

Carsten

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#3 Beitrag von funkheld »

Meine Frage:
Kann ich die Daten , so wie ich es oben beschrieben haben auch auf einen Rechner gemäss TCP-Verbindung abfragen ?


Danke.

Andreas Karg
Beiträge: 4718
Registriert: 28.04.2002 12:56:00
Kontaktdaten:

Re: TCP-Verbindung habe ich noch nicht verstanden

#4 Beitrag von Andreas Karg »

Der TCP-Verbindung ist es erst mal wurscht, auf welchem Rechner was läuft. Du kannst Zusi, den TCP-Server und dein eigenes Programm alles auf demselben Rechner laufen lassen oder sie auf drei verteilen und alle Kombinationen dazwischen gehen auch.

Was du alles von Zusi bekommen kannst, steht in der commandset.ini im Verzeichnis des TCP-Servers. Alternativ kannst du auch in der Zusi-Doku in der Beschreibung des FÜhrerstands-Dateiformates nachgucken. Die Liste dort entspricht weitgehend dem, was der Simulator auch nach draußen weitergibt.

Ansonsten, falls für dich die Verwendung einer .NET-Sprache (z.B. Visual Basic .NET) eine Option ist, gäb's von mir noch eine fix und fertige Schnittstelle hier. Dann brauchst du dich um die Feinheiten des Protokolls nicht mehr zu kümmern und kannst die Daten direkt benutzen. :-)
Zuletzt geändert von Andreas Karg am 05.02.2012 13:14:43, insgesamt 2-mal geändert.

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#5 Beitrag von funkheld »

Jup, danke erstmal.
Das Zusi2-Display funktioniert jetzt schon einmal mit der TCP-Exe Version 1.4

Gruss

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#6 Beitrag von funkheld »

Hmm..,wenn ich jetzt die erste Verbindung mit dem Zusi2 aufnehme mit meinem Purebasic-Serverprogramm, kommen folgende Zahlen/Daten raus :

31 0 0 0 0 1 1 1 26 90
1 Leerzeichen
Text : Zusi Zugsimulator
2 Leerzeichen
Text : 2.4.7.3

Was bedeuten die ersten 10 Zahlen ???

Danke.

Gruss
Zuletzt geändert von funkheld am 05.02.2012 21:54:00, insgesamt 7-mal geändert.

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33449
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

Re: TCP-Verbindung habe ich noch nicht verstanden

#7 Beitrag von Carsten Hölscher »

Die bytes sind doch in der Doku zum TCP-Server erklärt.
Man sollte aber einen Client programmieren, der sich am Server anmeldet.

Carsten
Zuletzt geändert von Carsten Hölscher am 05.02.2012 22:22:48, insgesamt 2-mal geändert.

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#8 Beitrag von funkheld »

Die ersten 10 Byte stimmen mit der Erklärung nicht überein, wenn sich Zusi beim Client /Server anmeldet.

Gruss
Zuletzt geändert von funkheld am 05.02.2012 22:30:49, insgesamt 1-mal geändert.

Bernhard
Beiträge: 22
Registriert: 11.09.2009 15:44:19

Re: TCP-Verbindung habe ich noch nicht verstanden

#9 Beitrag von Bernhard »

funkheld hat geschrieben:31 0 0 0 0 1 1 1 26 90
1 Leerzeichen
Text : Zusi Zugsimulator
2 Leerzeichen
Text : 2.4.7.3

Was bedeuten die ersten 10 Zahlen ???
Es handelt sich um die HELLO-Nachricht, mit der sich Zusi an einem Server anmeldet.
31 0 0 0: Länge der folgenden Nachricht (little endian)
0 1: Opcode "HELLO"
1: Version
1: Client-Typ (1 = Zusi)
26: Länge des folgenden Strings
90, " ": [bist Du sicher?]
"Zusi Zugsimulator 2.4.7.3": Identifikation

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#10 Beitrag von funkheld »

90, " ": [bist Du sicher?]
Ja, ich habe durchgehend als Ascii von Byte 0 - 40 ausgegeben und nochmal als Byte-wert.

Gruss

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33449
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

Re: TCP-Verbindung habe ich noch nicht verstanden

#11 Beitrag von Carsten Hölscher »

Korrekte byte-Order beachtet?

Carsten

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#12 Beitrag von funkheld »

Muss ich noch mal prüfen .

Danke.

Gruss

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#13 Beitrag von funkheld »

Hmm..., 2 Ausgabe-For-Schleifen haben sich überschnitten, daher kam die "90".
Jetzt kommt die Reihenfolge wie sie sein soll.

Wenn ich dieses jetzt an Zusi2 melde , welchen Zeitabstand muss ich hier nehmen ?
Es kommt ja keine Rückmeldung zwischen diesen beiden übertragungen.
SRV > ZUSI 00 02 00
SRV > ZUSI 00 03 00 0A 01 02 03


Danke.

Gruss

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#14 Beitrag von funkheld »

Wenn ich das eingebe:
FP > SRV 00 01 01 02 08 46 61 68 72 70 75 6C 74
HELLO-Befehl
Protokoll-Version "1"
Client-Typ "Fahrpult"
String "Fahrpult" mit führender Längenangabe (8 Bytes)
dann kommt im Server-Fenster : <nicht angemeldet> <unbekannt> <unbekannt>
Warum ?

Danke.
Gruss

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

#ACK_HELLO = $00010102
#SV_ACK_HELLO = $000200

Procedure.i SendNetworkDataEx(ConnectionID.i, *Buffer, length.i)
  Protected offset.i = 0, sentBytes.i
   While length = offset
      sentBytes = SendNetworkData(ConnectionID, *Buffer, length)
      If sentBytes = -1
         Delay(10)
      Else
         offset + sentBytes
      EndIf
   Wend
   ProcedureReturn length
EndProcedure


Procedure.i SendStringPaket(ConnectionID.i, Typ.l, string.s)
   Protected *Buffer, stringLength.i = Len(string), realStringLength.i = StringByteLength(string)
   If stringLength >= 0 And stringLength < 256 
      SendNetworkDataEx(ConnectionID, @Typ, SizeOf(Typ))
      SendNetworkDataEx(ConnectionID, realLength, SizeOf(Byte))
      SendNetworkDataEx(ConnectionID, @string, realStringLength)
      ProcedureReturn #True
   EndIf
   
   ProcedureReturn #False
 EndProcedure
 
 *Empfang = AllocateMemory(100) 
 
Port = 1435 
Adresse.s = "192.168.2.102" 

ConnectionID = OpenNetworkConnection(Adresse, Port)

If ConnectionID
 
  Debug "Ich bin mit dem Server verbunden."
 
  ; Hier das Hallo senden : FP > SRV 00 01 01 02 08 46 61 68 72 70 75 6C 74 HELLO-Befehl
 
  SendStringPaket(ConnectionID, #ACK_HELLO, "Fahrpult")
 
  ; Jetzt auf Antwort warten
 
  RBytes = ReceiveNetworkData(ConnectionID, *Empfang, MemorySize(*Empfang))
 
  If PeekL(*Empfang) = #SV_ACK_HELLO
    Debug "Server hat Ok gemeldet"
  EndIf
 
  CloseNetworkConnection(ConnectionID)
Else
  Debug "Kann den Server nicht finden"
EndIf
 
End
Zuletzt geändert von funkheld am 07.02.2012 14:13:01, insgesamt 1-mal geändert.

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Purebasicprogramm holt jetzt Zusi-Serverdaten...

#15 Beitrag von funkheld »

Hallo, ich bekomme jetzt die Daten die ich brauche von Zusi2 mit dem Purebasicprogramm dank eurer Hilfe.
Verbindung mit Zusi herstellen : Im Datenfenster von Zusi steht anschliessend "Geschwindigkeit","Motordrehzahl,"Fahrstufe"

sdata = Datenmenge gesendet zum Zusi-Server
rdata = Datenmenge zurück ans Purebasicprogramm vom Zusi-Server

Ablauf der Datensendungen:
1. HELLO-Befehl
2. NEEDED_DATA-Befehl , Befehlsvorrat 00 0A Geschwindigkeit/Motordrehzahl/Fahrstufe
3. NEEDED_DATA-Befehl , Befehlsvorrat 00 00
4. Danach wird alle 5 Millisec eine Schleife durchlaufen zum abfragen oder das andere Programm mit Event :
5. Unten sind die Empfangsdaten zu erkennen
6. Wenn der Zug losfährt, fangen die Daten an : Geschwindigkeit(01)/Motordrehzahl(09)/Fahrstufe(10):
11:00:00:00:00:0A:01:E7:75:03:40:09:00:40:93:44:10:00:00:A0:40
.........
.........

Frage 1: wie wie werden die Daten ausgewertet :
11:00:00:00:00:0A:01:E7:75:03:40:09:00:40:93:44:10:00:00:A0:40

Frage 2 : reicht die Pause von 5 Millisec in der Schleife zum Abfragen ? ?
weiter:
daten_empf()
Delay(5)
Goto weiter

Frage 3 : ist es normal, wenn die Schleife länger dauert, das dann die Datenmenge grösser wird ?
Wenn ja, wieviel Daten werden können vom Zusi-Server zwischengespeichert werden, bevor welche verloren gehen ?


Danke.

Gruss

Das Purebasicprogramm ohne Event :
Ohne Event habe ich jetzt rausgenommen, weil es zuviel Zeit Blockiert die andere Programme brauchen.
Da war statt ein Event "Delay(5)" drin, also 5 Millisec warten.

Das Purebasic mit Event und Button :

Code: Alles auswählen

Global Quit.l, Port.l, conID.l, status.l, cEvent.l, Result.l, *DataBuffer.l
Global sData.l,rData.l,conID.l,offs.l,CEvent.l,t1.l,t2.l,zeile.s
Global *sbuffer.l, *rbuffer.l

Declare daten_send_empf()
Declare daten_empf()
Declare zusi_hello()

*sbuffer = AllocateMemory(1024)
*rbuffer = AllocateMemory(1024)

If OpenWindow(0, 10, 10, 500, 320, "Client (kann auch mehrfach gestarted werden)", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
   ButtonGadget(1,5, 10,100, 20, "Ende")
   ButtonGadget(2,120, 10, 100, 20, "Connect")
   ButtonGadget(3,235, 10, 140, 20, "Disconnect")
   EditorGadget(4, 10, 40, 480, 270)

   Quit = 0
   Port = 1435
   status = 0
   
   If InitNetwork() = 0
      MessageRequester("Info", "Kein Netzwerk !", #PB_MessageRequester_Ok)
      End
   EndIf
   
   Repeat
      EventID.l = WaitWindowEvent(10)
     
      Select EventID
         Case #PB_Event_CloseWindow
            Quit = 1
         Case #PB_Event_Gadget
            Select EventGadget()   
               Case 1           
                  Quit = 1
               Case 2           
                  If Not status
                     conID = OpenNetworkConnection("127.0.0.1", Port)
                     If conID
                       status = 1
                       zusi_hello()
                       SetGadgetText(4, GetGadgetText(4) + #CR$ + "- Connected -" + #CR$)
                     EndIf
                  EndIf
               Case 3
                  If status <> 0
                     CloseNetworkConnection(conID)
                     status = 0
                     SetGadgetText(4, GetGadgetText(4) + #CR$ + "- Connection closed -" + #CR$)
                  EndIf
            EndSelect
      EndSelect
     
      If status       
         cEvent = NetworkClientEvent(conID)
         
         Select cEvent         
            Case #PB_NetworkEvent_Data            
                  daten_empf()       
         EndSelect       
      EndIf
     
   Until Quit = 1 Or EventID = #PB_Event_CloseWindow
EndIf
FreeMemory(*sbuffer)
FreeMemory(*rbuffer)
End

Procedure daten_send_empf()
  Debug ""
  sData = SendNetworkData(conID, *sbuffer, offs)
  Debug "sData: " + Str(sData)
  If CEvent <> 0
    rData = ReceiveNetworkData(conID, *rbuffer, 1024)

    Debug "rData: " + Str(rData)

    zeile$ = ""
    For n = 0 To rData - 1
      zeile$ = zeile$ + RSet(Hex(PeekA(*rbuffer + n)), 2, "0")
      If n < rData - 1
        zeile$ = zeile$ + ":"
      EndIf
    Next n
    Debug zeile$
  EndIf
EndProcedure

Procedure daten_empf() 
  Debug ""
  If CEvent <> 0
    rData = ReceiveNetworkData(conID, *rbuffer, 1024)
    Debug "rData: " + Str(rData)

    zeile$ = ""
    For n = 0 To rData - 1
      zeile$ = zeile$ + RSet(Hex(PeekA(*rbuffer + n)), 2, "0")
      If n < rData - 1
        zeile$ = zeile$ + ":"
      EndIf
    Next n
    Debug zeile$ 
  EndIf
EndProcedure

Procedure zusi_hello()
  offs = 0 ; HELLO-Befehl
  PokeL(*sbuffer + 0, $0D) : offs + 4
  PokeA(*sbuffer + 4, $00) : offs + 1
  PokeA(*sbuffer + 5, $01) : offs + 1
  PokeA(*sbuffer + 6, $01) : offs + 1
  PokeA(*sbuffer + 7, $02) : offs + 1
  client$ = "Fahrpult"   
  PokeA(*sbuffer + 8, Len(client$)) : offs + 1
  PokeS(*sbuffer + 9, client$,-1, #PB_Ascii) : offs + Len(client$)
  daten_send_empf()
  
  offs=0 ; NEEDED_DATA-Befehl , Befehlsvorrat 00 0A Geschwindigkeit/Motordrehzahl/Fahrstufe
  PokeL(*sbuffer + 0, $07) : offs + 4
  PokeA(*sbuffer + 4, $00) : offs + 1
  PokeA(*sbuffer + 5, $03) : offs + 1
  PokeA(*sbuffer + 6, $00) : offs + 1
  PokeA(*sbuffer + 7, $0A) : offs + 1
  PokeA(*sbuffer + 8, $01) : offs + 1
  PokeA(*sbuffer + 9, $09) : offs + 1
  PokeA(*sbuffer + 10, $10) : offs + 1
  daten_send_empf()
  
  offs=0 ; NEEDED_DATA-Befehl , Befehlsvorrat 00 00
  PokeL(*sbuffer + 0, $04) : offs + 4
  PokeA(*sbuffer + 4, $00) : offs + 1
  PokeA(*sbuffer + 5, $03) : offs + 1
  PokeA(*sbuffer + 6, $00) : offs + 1
  PokeA(*sbuffer + 7, $00) : offs + 1
  daten_send_empf()
EndProcedure  
Die Sende/Empfangsdaten:
verb: 5443120

sData: 17
rData: 7
03:00:00:00:00:02:00

sData: 11
rData: 7
03:00:00:00:00:04:00

sData: 8
rData: 7
03:00:00:00:00:04:00


rData: 9
05:00:00:00:00:0A:01:09:10

rData: 21
11:00:00:00:00:0A:01:00:00:00:00:09:00:00:20:44:10:00:00:00:00

rData: 6
02:00:00:00:00:0A
...
rData: 11
07:00:00:00:00:0A:01:E5:47:1C:41

rData: 11
07:00:00:00:00:0A:01:48:1F:1F:41

rData: 11
07:00:00:00:00:0A:01:B3:F3:21:41

rData: 16
0C:00:00:00:00:0A:01:C0:39:24:41:09:00:00:9E:44

[.....................]

rData: 11
07:00:00:00:00:0A:01:9D:4B:BE:41

rData: 11
07:00:00:00:00:0A:01:47:EB:BF:41

rData: 11
07:00:00:00:00:0A:01:54:36:C1:41

rData: 11
07:00:00:00:00:0A:01:7C:D2:C2:41
Zuletzt geändert von funkheld am 09.02.2012 11:09:42, insgesamt 18-mal geändert.

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33449
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

Re: TCP-Verbindung habe ich noch nicht verstanden

#16 Beitrag von Carsten Hölscher »

Was sollen und denn kilometerlange Datenausgaben hier bringen? Ich habe den Beitrag mal deutlich gekürzt, dafür ist ein Forumsbeitrag nicht das richtige Medium.

Frage 1: Was konkret an der Doku unklar?
Frage 2: Das ist so ein falscher Ansatz. TCP kann man nicht per Timer abfragen. Man braucht dort für eine vernünftige Anwendung einen eigenen Thread, der ständig auf Daten wartet. Das ist nicht völlig trivial. Vielleicht bietet das Basic dafür fertige Komponenten. Auf jeden Fall braucht man etwas Grundlagenwissen, sollte google liefern. Das delay(5) sollte man streichen können, die TCP-Abfrage wartet bis Daten da sind.
Ohne eigenen Thread ist das Programm dann aber wohl solange eingefroren.
Frage 3 weiß ich aus dem Kopf nicht.

Carsten

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#17 Beitrag von funkheld »

Dafür habe ich auch das 2. Programm mit den Event, welches nicht bremst, sondern Daten abholt wenn sie anliegen am Zusi-TCP ohne eine quietschende Bremsung... Zusi2 wird im ablauf nicht beeinflusst.

Wie errechne ich :
01:E7:75:03:40 hier die Geschwindigkeik ?
09:00:40:93:44 hier die Motordrehzahl ?
10:00:00:A0:40 hier die Fahrstufe ?

Ich finde kein Umrechnungsverfahren , oder kann es nicht finden in der Doku.

Danke.

Gruss

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33449
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

Re: TCP-Verbindung habe ich noch nicht verstanden

#18 Beitrag von Carsten Hölscher »

So groß ist die Doku ja nicht - es ist ein eigenes Kapitel zur Umrechung von single in bytefolge oder wie man das nennen soll.
Carsten

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#19 Beitrag von funkheld »

Jup, dat schnall ick nich.

Wie herum aus dem Single ein Bytefolge wird...hmm.
Das erklär mir mal näher, da steh ich jetzt auf dem Schlauch.

Danke.
Gruss

funkheld
Beiträge: 305
Registriert: 15.09.2010 11:52:44

Re: TCP-Verbindung habe ich noch nicht verstanden

#20 Beitrag von funkheld »

Jup, dat schnall ick nich.

Wo ist diese ausführlichen Doku, wo erklärt wird wie jetzt aus der Single eine Bytefolge wird ?
Protokoll.chm vom TCP , da habe ich nichts gefunden.
Im ZUsi-Display-Ordner finde ich auch nichts.


Danke.
Gruss
Zuletzt geändert von funkheld am 08.02.2012 19:03:11, insgesamt 2-mal geändert.

Antworten