Seite 1 von 5

Zusi-TCP-Schnittstelle für .NET

Verfasst: 20.07.2011 11:52:10
von Andreas Karg
Ich habe vor einiger Zeit eine Kapselung für die TCP-Schnittstelle von Zusi 2 in C# geschrieben. Mit dieser kommt man recht einfach an die Daten von Zusi heran, ohne dass man etwas über Netzwerkprogrammierung und das Zusi-Protokoll wissen müsste. Die DLL lässt sich von jeder .NET-Sprache aus einbinden. Beigelegt sind einige Beispiele in Visual Basic. Eine Portierung nach C# ist vorgesehen.

Die Dokumentation der DLL ist über den Objektbrowser von Visual Studio erreichbar. Wenn trotzdem Fragen und Probleme auftauchen, helf' ich natürlich gern weiter. Für die Verwendung der Schnittstelle ist es hilfreich zu wissen, was Delegaten und Ereignisse sind - ganz doof den Code aus dem Beispielprogramm kopieren geht aber auch. So kompliziert isses nicht.

Ich wünsche viel Spaß beim Basteln!

Download:
Vorkompiliert (mit Beispielen in Quellcode)
Github (Quellcode inkl. Beispiele)

Kommentare, Anregungen, Kritik und Fragen sind generell äußerst erwünscht - insbesondere hinsichtlich des Programmierstils. Man will sich ja weiterbilden. :-)

Grüße
Andi

Edit 17.06.13:
Der obligatorische Hotfix um kurz nach Mitternacht auf Version 1.2a.
  • Absturz bei regulärem Disconnect behoben.
  • C#-Beispiel von F. Schn. integriert.
Edit 16.06.13:
Release der neuen Version 1.2.
  • Diverse behobene Abstürze
  • Sinnvollere Fehlermeldungen
  • Unterstützung für die PZ80 mit den Zugartleuchten U und M
  • ZusiTcpConn heißt jetzt ZusiTcpClientConnection. Der alte Name kann vorläufig(!) weiter verwendet werden - eine entsprechende Warnung wird beim kompilieren angezeigt.
  • Diverse kleine Fehlerbehebungen
Besonderer Dank geht an F. Schn. für viele Anmerkungen, die Codebeispiele und Arschtritte, wenn ich mal wieder welche brauchte.

Edit 28.10.12/2:
Release der neuen Version 1.16.
  • Neue Überladung: ZusiTcpConn.Connect(IPEndPoint)
  • Nochmal Korrekturen an der Doku
  • Die eigentlich nicht zum Gebrauch bestimmte TCPCommands-Klasse wird für die IDE ausgeblendet.
  • Diesmal mit richtiger Zahl in der Assembly-Version.
Edit 28.10.12:
Release der neuen Version 1.15.
Der Quellcode der Schnittstelle wurde noch ein bisschen aufgeräumt, die Beispiele sind jetzt ordentlich eingepflegt und die Lizenztexte passen auch zusammen. :-)

Edit 27.10.12:
Release der neuen Version 1.1.
Diverse Änderungen, die so aufgelaufen sind; u.A. neue Ereignisbehandlung mit Unterscheidung aller Datentypen, die Zusi ausgibt.
Es sind ein paar Beispielprogramme in VB.Net beigelegt, die freundlicherweise von F. Schn. hier aus dem Forum beigesteuert wurden. Eine Portierung der Beispiele nach C# steht noch aus.

Die TCP-Schnittstelle steht nunmehr unter der LGPL.

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 05.02.2012 18:54:41
von funkheld
Hmm...., ich möchte das in Purebasic machen.
Wie hast du das Zusi2 direkt angezapft , ohne Netzwerk usw ?
Oder wie kann ich die Daten direkt mit meinem Clienten mit Purebasic abfragen ?

Danke.

Gruss

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 05.02.2012 19:00:57
von Andreas Karg
Hallihallo. Meine Schnittstelle benutzt genauso den TCP-Server wie alle anderen auch. Was ich gemacht habe war lediglich, die ganze Bitschubserei (und davon gibt's einige!) so zu kapseln, dass man sie nicht mehr sieht.
Wer meine Schnittstelle verwendet, muss folglich von dem ganzen Gedöns keine Ahnung mehr haben. Es reicht, dem Programm weiterzugeben, wo es den TCP-Server findet und welche Daten von Zusi gewünscht sind.
Wenn du das selber implementieren willst, empfehle ich die Lektüre der Hilfedatei des TCP-Servers. Da ist das Protokoll drin beschrieben.

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 06.02.2012 16:47:12
von funkheld
Hallo, kannst du davon eine fertige EXE herstellen für mich und wie ich mit dem Programm kommuniziere ?

Danke.

Gruss

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 06.02.2012 20:12:32
von Andreas Karg
Öhmmmmmmmmm... Ich glaube, wir haben da unterschiedliche Vorstellungen davon, wie das funktionieren soll. Wie soll denn eine solche EXE mit deinem Programm kommunizieren? Per TCP? Dann wären wir wieder am Anfang. :-}
Das, was du dir da oben runterladen kannst ist eine fix und fertige DLL, die man superbequem in ein .NET-Projekt einbinden kann. Dazu muss man aber halt eine .NET-Sprache benutzen. Wenn du bei deinem BASIC bleiben willst, wird dir wohl nix anderes übrigbleiben als das Protokoll selber zu implementieren. :-/

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 07.02.2012 01:24:41
von Max Senft
Hi,

eine kurze Recherche ergab, dass "Purebasic" auch externe DLLs aufrufen kann. Schaut auch nicht allzu kompliziert aus... wie "drin" bist du denn in der PureBasic Programmierung?

Grüße
Max

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 07.02.2012 09:03:31
von Andreas Karg
.NET-DLLs von einer Nicht-.NET-Umgebung aus? Geht sowas?

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 07.02.2012 20:50:52
von F. Schn.
Offenbar ja :] (über einen COM-Funktionsaufruf): http://de.wikipedia.org/wiki/.NET#Managed_und_Unmanaged ?(

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 07.02.2012 21:03:40
von Andreas Karg
Spannend. Müsste man sich fast mal genauer angucken... Ansonsten könnt ich die Schnittstelle vermutlich mit vertretbarem Aufwand nach C++ portieren und dann als normale DLL anbieten.

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 08.02.2012 15:00:15
von funkheld
Mir ging es nur darum, den Zusi-TCP-Server mit Purebasic zu nutzen um dann meine eigene Grafikspielerei damit herstellen, die Daten Grafisch darstellen nach meinen vorstellungen.
Die Anbindung mit Purebasic an den Zusi-TCP-Server hat jetzt wunderbar geklappt und funktioniert tadellos:
http://forum.zusi.de/viewtopic.php?f=34&t=10704

Jetzt steht der eigenen Kreativität nichts mehr im Wege, wenn mir einer noch erzählen kann, wie die 4Btye-Werte ausgewertet werden als normale zu verarbeitende Zahl.

Danke.

Gruss

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 08.02.2012 15:16:14
von Stephan/Taschi
Andreas Karg hat geschrieben:Spannend. Müsste man sich fast mal genauer angucken... Ansonsten könnt ich die Schnittstelle vermutlich mit vertretbarem Aufwand nach C++ portieren und dann als normale DLL anbieten.
Wäre zumindest toll - ich hätte ja ein paar Kleinigkeiten, die ich gerne mal umsetzen würde, aber mit .NET werde ich mich nie anfreunden.

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 08.02.2012 16:56:09
von Carsten Hölscher
zur 4byte-Frage s. Doku vom TCP-Server. Wie man das in basic macht, müßte dann mal ein Basicexperte sagen.

Carsten

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 09.02.2012 16:21:25
von Jan
Andreas Karg hat geschrieben:.NET-DLLs von einer Nicht-.NET-Umgebung aus? Geht sowas?
Man kann anscheinend auch ohne COM auskommen, und Funktionen in einer .NET-DLL direkt für Win32 exportieren, das Stichwort lautet Reverse P/Invoke. Ausprobiert habe ich es aber auch nicht...

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 12.02.2012 09:52:39
von funkheld
Es reicht, dem Programm weiterzugeben, wo es den TCP-Server findet und welche Daten von Zusi gewünscht sind.
Sag mal, das wünschen der Daten verstehe ich nicht.

Wenn ich mein Display-programm von Purebasic einbinde im TCP, muss ja Zusi als letzte an den TCP gebunden werden und da erscheint in Zusi dann die Auflistung der Daten, die angefordert werden.

Ich kann dann im danach den Datenstrom im Hinblick auf die gewünschten Daten nicht mehr ändern, das geht nur, wenn ich erst wieder alles vom Netz nehme und alles neu Starte.

Wie machst du das?

Danke.

Gruss

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 12.02.2012 11:37:43
von Andreas Karg
Genau so. Der Schnittstelle muss erst gesagt werden, was gebraucht wird. Dann kann man sie mit dem TCP-Server verbinden und dann Zusi mit selbigem. Braucht man andere Daten, muss man die Verbindungen erst alle wieder trennen und kann sie dann neu aufbauen. Ist halt leider ein Problem im Protokoll...

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 25.02.2012 20:15:47
von F. Schn.
Andreas Karg hat geschrieben:Ich würde mich freuen, wenn der eine oder andere Nutzer seine Meinung und Erfahrungen über mein Werk kundtäte. Das hilft mir, die Schnittstelle weiter zu verbessern.
Mal eine Frage: Waum nutzt du keine Ereignisse (events), sondern "feste" Delegaten?

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 25.02.2012 20:42:27
von Andreas Karg
Weil mir bis vor 10 Sekunden (habs eben nachgelesen) der Unterschied nicht soweit klar war, dass ich mich bewusst für das eine oder andere entschieden habe. :-D Habs mir mal vorgemerkt für die nächste Version.

Im Übrigen hab ich mich entschlossen, den Quellcode zur Schnittstelle zu veröffentlichen. Er findet sich jetzt hier. Vielleicht bringt's ja dem einen oder anderen was. :-)

Man beachte, dass die Historie auf Github unvollständig ist. Ich hab die Schnittstelle erst komplett ohne Versionskontrolle, dann mit Subversion, dann mit Mercurial und jetzt schlussendlich mit Git geschrieben. Da ich zu faul war, mich jeweils in die Tücken der Umwandlung von einem Repostyp zum nächsten einzuwurschteln, hab ich einfach bei Null angefangen. Dürfte jetzt nicht mehr passieren, weil ich mich bei Git bestens eingelebt hab. Kann ich nur jedem empfehlen, das Teil. :-)

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 26.02.2012 01:25:06
von Erik Semt
Alter Schwede....

da haste dir ja die Finger blutig geschrieben wa? :)

Gruß Erik

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 26.02.2012 08:18:31
von Jens Haupert
Erik Semt hat geschrieben:da haste dir ja die Finger blutig geschrieben wa? :)
Hallo Erik,
du bist scheinbar nicht im "Programmiergeschäft" tätig, oder? :D Mein Zählskript sagt 838 Zeilen. Zum Vergleich hat ZusiDisplay (und damit nix Dolles) etwas über 209.000 Zeilen.

@Andreas: prima Sache, damit sollte jeder aufsetzen können. Die Umsetzung mit den Delegaten wie du's gelöst hast, kannte ich selbst gar nicht. :hat2

MfG Jens

Re: Zusi-TCP-Schnittstelle für .NET

Verfasst: 26.02.2012 13:10:55
von Andreas Karg
Um mal die Maßstäbe klarzumachen: Zusi 2.1 hatte anno 2002, als Carsten zum Zweijährigen ein kleines Gewinn-Schätzspiel ausgeschrieben hat, ungefähr 70.000 Codezeilen oder so. Das weiß ich nur, weil ich damals 65536 geschätzt hatte und damit relativ nah dran lag. ^_^
Mit anderen Worten: ZusiDisplay kann heute mehr als Zusi vor 10 Jahren. X-)

Danke übrigens für die lobenden Worte. *verbeug*
Alles nur eine bescheidene Nebenbei-Leistung im Vergleich zum Display und anderen Projekten.