Seite 1 von 1

TCP Bibliothek für C++

Verfasst: 05.03.2016 12:29:58
von jonathanp
Ich habe schnell eine TCP Bibliothek für C++ geschrieben: https://github.com/jonathanp0/zusi3tcp" target="_blank. Es ist nur einfach, aber vielleicht ist es nützlich für jemanden.

Ich werde Johannes kopieren, weil der Status ähnlich oder schlechter als seine Rust-Bibliothek ist :). Diese Bibliothek war auch nützlich für mich, das Protokoll zu verstehen.
Sie enthaelt momentan wenig Protokollspezifisches, neben dem generischen Senden und Empfangen von Knoten und Attributen ist nur HELLO und NEEDED_DATA implementiert.
06.03 ClientConnection.sendInput() für INPUT-Befehle hinzugefügt
15.03 Visual Studio Projekt hinzugefügt
26.03 Zusi 3 Server Emulator hinzugefügt

Re: TCP Bibliothek für C++

Verfasst: 05.03.2016 17:43:00
von Roland Ziegler
Mit C++11-Elementen, nett. :)
zusi::Socket - Abstract interface for a network communications class
C++ kennt ja keine echten Interfaces wie Java oder C#. In C++ ist es immer eine Basisklasse, und ein Basisobjekt wird mit instantiiert. Daher sollte auch eine "Interface"-Klasse immer einen virtuellen Destruktor haben, sonst gibt es ggf. Memory-Leaks.

Re: TCP Bibliothek für C++

Verfasst: 06.03.2016 15:08:02
von jonathanp
Vielen Dank für den Code-Review ;) In den letzten Monaten habe ich nur Java geschrieben, also nun vergesse ich Dinge.

Ich habe heute Unterstützung für INPUT-Befehle hinzugefügt, und Ersuchen für DATA OPERATION und DATA_PROG Nachrichten.

Re: TCP Bibliothek für C++

Verfasst: 21.03.2016 15:37:31
von Johannes B
Danke erstmal für die Bibliothek! Soweit läufts ja recht gut. Nun würde ich gern versuchen die empfangenen Daten in einer Variable zu speichern. Wie könnte man das anstelle dieser Ausgabe tun?

Code: Alles auswählen

msg.write(debug_socket); //Print data to the console
P.S. bin C++ Laie, würde mich aber gerne einarbeiten. Danke!

Re: TCP Bibliothek für C++

Verfasst: 21.03.2016 17:17:21
von F. Schn.
Was möchtest du denn machen? Ich denke, wenn man gerade erst anfängt, ist C++ vielleicht nicht die idealste Sprache. (Gab vor Jahren mal eine Diskussion dazu in diesem Fourm...) Außerdem ist laut obiger Aussage die Bibliothek ja noch unvollständig, so dass ich dir vermutlich eher zu .Net raten würde: http://forum.zusi.de/viewtopic.php?f=73&t=12762" target="_blank

Re: TCP Bibliothek für C++

Verfasst: 21.03.2016 17:32:34
von Johannes B
Ich würde gern die TCP Daten an einen Seriellen Port schicken. Da gab's mal was für Zusi 2, das ich bei meinem Fahrpult zum Laufen gebracht habe. Ich schau mir mal die .NET Projekte an. Dankeschön!

Re: TCP Bibliothek für C++

Verfasst: 21.03.2016 18:40:21
von jonathanp
Hey,

Das "dump_ftd" Sample zeigt, wie man Daten extrahieren kann: https://github.com/jonathanp0/zusi3tcp/ ... mp_ftd.cpp" target="_blank

Mit kleinen Änderungen:

Code: Alles auswählen

bool SendToSerial(uint16_t id, float value);

void sendVariables(const zusi::Node& msg)
{
	if (msg.getId() == zusi::MsgType_Fahrpult)
	{
		for (const zusi::Node* node : msg.nodes)
		{
			if (node->getId() == zusi::Cmd_DATA_FTD)
			{
				for (const zusi::Attribute* att : node->attributes)
				{
					float value = *(reinterpret_cast<float*>(att->data));
					SendToSerial(att->getId(), value);
				}
			}
		}
	}
}
Für seriellen Port könntest Du möglicherweise diese Bibliothek verwenden: https://github.com/wjwwood/serial" target="_blank
Serial Port Kommunikation mit dem win32api ist keine gute Aufgabe für einen Anfänger :dead

Gruß,
Jonathan

Re: TCP Bibliothek für C++

Verfasst: 21.03.2016 23:09:24
von Andreas Karg
Oder auch:

Code: Alles auswählen

bool SendToSerial(uint16_t id, float value);

void sendVariables(const zusi::Node& msg)
{
   if (msg.getId() != zusi::MsgType_Fahrpult)
      return;
 
   for (const zusi::Node* node : msg.nodes)
   {
      if (node->getId() != zusi::Cmd_DATA_FTD)
         continue;
    
      for (const zusi::Attribute* att : node->attributes)
      {
         float value = *(reinterpret_cast<float*>(att->data));
         SendToSerial(att->getId(), value);
      }    
   } 
}
Um mal ein bisschen unnötige Verschachtelungstiefe wegzubekommen. ;-)

Re: TCP Bibliothek für C++

Verfasst: 22.03.2016 10:48:39
von Roland Ziegler
jonathanp hat geschrieben:Serial Port Kommunikation mit dem win32api ist keine gute Aufgabe für einen Anfänger
In der Tat. C#/.Net ist da deutlich zugänglicher.
https://msdn.microsoft.com/en-us/librar ... 10%29.aspx" target="_blank

Re: TCP Bibliothek für C++

Verfasst: 24.03.2016 10:43:19
von Johannes B
Vielen Dank für die Code Beispiele! Vielleicht bekomme ich es mal zum Laufen.
Roland hat Recht, C# ist schon zugänglicher für Anfänger. Mit dem Zusi 3 / 2 Converter läuft die Ausgabe bei mir vorerst ganz gut.
http://forum.zusi.de/viewtopic.php?f=73&t=12751

Re: TCP Bibliothek für C++

Verfasst: 24.03.2016 10:57:57
von jonathanp
Das stimmt, dass C++ nicht einfach ist.
Ich sehe die Verwendungen für C ++ mit Zusi als:
  1. Integration mit bereits geschriebenen C ++ Code
  2. Für Software, die (nur)C Bibliotheken verwenden muss.
  3. Portabilität auf andere(nicht Windows) Betriebssystemen
Personlich brauche ich 1 und 2, und vielleicht in die Zukunft 3.

Es ist ein wenig kommisch, dass der beliebteste Client für Zusi 3 der Zusi 2-Proxy ist. ;) Jetzt wollt ihr auch zusätzliche Variablen für Zusi 3 Funktionen :whatever

Re: TCP Bibliothek für C++

Verfasst: 24.03.2016 12:22:51
von Arne aus dem Norden
jonathanp hat geschrieben:Es ist ein wenig kommisch, dass der beliebteste Client für Zusi 3 der Zusi 2-Proxy ist. ;) Jetzt wollt ihr auch zusätzliche Variablen für Zusi 3 Funktionen :whatever
"ihr" bin ja offensichtlich ich... :D
Ich wills mal so formulieren: nicht jeder, der gerne Pult bastelt ist auch Experte in irgendeinem C.
Ich als PHP Laie habs mit dem Zusi 2 Protokoll ja fast noch alleine hinbekommen, aber beim Zusi 3 Protokoll hab ich inwischen fachkundige Unterstützung von mehreren Leuten die weit besser sind als ich und trotzdem klappts bislang nicht mit dem Protokoll der "3" und dem Arduino...

Re: TCP Bibliothek für C++

Verfasst: 24.03.2016 12:52:26
von jonathanp
:O Ich meinte, "sie" zu schreiben.

Rekursion ist für geschachtelte Datenstrukturen (wie Zusi 3 TCP) erforderlich und es ist bekannt, daß Rekursion einen schwieriges Begriff ist. In einem Vorstellungsgespräch für Softwareentwickler muss man normalerweise ihn demonstrieren.