Protokoll selber aufbauen


D12

Mitglied
Guten Morgen Tutorials,

ich bin gezwungen mir ein Protokoll für eine Kommunikation über eine Netzwerkkarte selbst zusammen zu stellen.

Kann mir hier einer einen Beispielquellcode zeigen, wie ich Byte für Byte einen solchen Protokollheader aufbaue und sende?

Grüße
D12
 

Norbert Eder

Erfahrenes Mitglied
Was sind denn die Anforderungen? Höchste Performance? Oder ist Performance nicht so ein Thema? Und und und ....
 

D12

Mitglied
Hi,

Performance ist nich das wichtigste, aber im Moment habe ich einen instabilen Code, der mit einer S5 kommuniziert. Ich habe einen Schleifentest, der nach 5 bis 12 Versuchen stehenbleibt und auf die S5 wartet, die dann nicht mehr antwortet, weil dot.net noch andere Pakete sendet, bzw. nicht die richtigen Parameter. Denn nach jeder erfolgreichen Kommunikation, muss ein zusätzliches Protokoll gesendet werden. Am besten wäre ich könnte direkt das H1 Protokoll und COTP nachbilden, dann kann ich mir den Protokollwandler sparen.

Das Ganze muss schnell gehen, bin grad aus der Umschulung, habe letzte Woche Prüfung bestanden und gleich beim neuen Arbeitgeber ein solches Problem,... :eek:( Das kann mich den neuen Job kosten...

Hier der Beispielcode:
Code:
using System;
using System.Net;
using System.Net.Sockets;


namespace SimpleFetchRead
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			
			int ende = 15;
			for (int i = 1; i<=ende; i++)
			{
				Console.WriteLine("Schleifen-Durchlauf " + i + " von " + ende + "!");
				FetchRead();
				Console.WriteLine("--------- --------- --------- --------- --------- --------- --------- --------- ");
				Console.WriteLine();
			}
		}
		
		public static void FetchRead()
		{
			//*** S5 Header wird initialisiert
			Console.WriteLine("S5 Header wird initialisiert");
			char syskennA	= 'S';  	//*** Systemkennung
			char syskennB	= '5';		//*** Systemkennung
			int sysheader 	= 16;		//*** Headerlänge für Telegramm
			int opcodekenn	= 1;		//*** Kennung für OpCode
			int opcodelen	= 3;		//*** Länge des Opcode
			int opcode		= 5;		//*** eigentlicher OpCode, 3 = Anforderungs-Telegramm, 4 = Antwort-Telegramm
			int orgblck		= 3;		//*** Kennung des OrgBlock
			int orgblcklen	= 8;		//*** Länge des OrgBlock
			int orgblckkenn	= 1;		//*** Kennung des OrgBlock, nur DB
			int dbnr		= 110;		//*** Nummer Datenbaustein
			int dwadrhigh	= 0;		//*** Adresse erstes Datenwort (high)
			int dwadrlow	= 5;		//*** Adresse erstes Datenwort (low)
			int dwlenhigh	= 0;		//*** Datenwortlänge (high)
			int dwlenlow	= 1;		//*** Datenwortlänge (low)
			int lblockkenn	= 255;		//*** Leerblock Kennung
			int lblocklen	= 2;		//*** Leerblock Länge					
				
			//*** Sendestring wird zusammengestellt
			Console.WriteLine("Byte-Array für Anforderung wird zusammengestellt");
			Byte[] ba = new byte[16];
			ba[0] 	= 	Convert.ToByte(syskennA);
			ba[1] 	= 	Convert.ToByte(syskennB);
			ba[2] 	= 	Convert.ToByte(sysheader);
			ba[3] 	= 	Convert.ToByte(opcodekenn);
			ba[4] 	= 	Convert.ToByte(opcodelen);
			ba[5] 	= 	Convert.ToByte(opcode);
			ba[6] 	= 	Convert.ToByte(orgblck);
			ba[7] 	= 	Convert.ToByte(orgblcklen);
			ba[8] 	= 	Convert.ToByte(orgblckkenn);
			ba[9] 	= 	Convert.ToByte(dbnr);
			ba[10] 	= 	Convert.ToByte(dwadrhigh);
			ba[11] 	= 	Convert.ToByte(dwadrlow);
			ba[12] 	= 	Convert.ToByte(dwlenhigh);
			ba[13] 	= 	Convert.ToByte(dwlenlow);
			ba[14] 	= 	Convert.ToByte(lblockkenn);
			ba[15] 	= 	Convert.ToByte(lblocklen);
			
			
			//*** Anforderungstelegramm wird gesendet
			Console.WriteLine("Anforderungstelegramm wird gesendet");
			TcpClient client = new TcpClient();
			client.Connect("159.151.99.28", 5015);
			Console.WriteLine(client.LingerState.LingerTime.ToString());			
			
			NetworkStream stream = client.GetStream();			
			//Byte[] data = System.Text.Encoding.ASCII.GetBytes(sstr);
			Byte[] data = ba;
			stream.Write(data, 0, data.Length);
			Console.WriteLine("Anforderungstelegramm wurde gesendet");
			
			//*** Antwort-Telegramm wird ausgelesen
			Console.WriteLine("Anwendung wartet auf Antwort-Telegramm");
			int ByteLen = (dwlenhigh	* 255) + dwlenlow + 16;
			data = new Byte[ByteLen];
			String responseData = String.Empty;
			Int32 bytes = stream.Read(data, 0, ByteLen);			
			responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
			Console.WriteLine("Antwort-Telegramm wurde empfangen");
			Console.WriteLine("Antwort der S5: " + responseData.Substring(16));
			
			Console.WriteLine("Verbindung wird abgebaut!");
			stream.Flush();
			stream.Close();
			client.Close();
		}
	}
}

Vielleicht siehst Du einen Fehler, den ich nicht sehe. Manchmal sieht man den Wald vor lauter Bäumen nicht oder sitzt einfach nur auf den eigenen Gehirnwindungen.

Grüße
D12
 

D12

Mitglied
Weitere Infos:

Ich muss entweder die Eigenschaften des TCP besser kontrollieren können, oder direkt die H1/COTP Protokolle an die S5 senden.

Én Detail:
1. COTP Protokoll an die S5
Code:
0000  08 00 06 01 00 03 aa 00  04 00 3e 04 00 18 fe fe   ........ ..>.....
0010  03 00 13 60 09 1a 00 00  00 ca 00 01 8c 08 00 00   ...`.... ........
0020  00 ca 00 00 00 01 00 00  00 00 00 00 00 00 00 00   ........ ........
0030  00 00 00 00 00 00 00 00  00 00 00 00               ........ ....

2. H1 Protokoll an die S5
Code:
0000  08 00 06 01 00 03 aa 00  04 00 3e 04 00 1c fe fe   ........ ..>.....
0010  03 00 07 f0 09 1a 80 00  00 ca 53 35 10 01 03 05   ........ ..S5....
0020  03 08 01 6e 00 05 00 01  ff 02 00 00 00 00 00 00   ...n.... ........
0030  00 00 00 00 00 00 00 00  00 00 00 00               ........ ....

3. nun reagiert die S5 mit einem COTP
Code:
0000  aa 00 04 00 3e 04 08 00  06 01 00 03 00 0e fe fe   ....>... ........
0010  03 00 09 60 d1 04 00 00  00 cb 00 00 10 01 03 06   ...`.... ........
0020  0f 03 00 ff 07 05 00 01  ff 02 2f f2 53 20 01 0a   ........ ../.S ..
0030  c6 01 03 c4 01 01 c3 02  c2 a7 00 00               ........ ....

4. und dann direkt mit dem H1 was meine Daten enthält
Code:
0000  aa 00 04 00 3e 04 08 00  06 01 00 03 00 1e fe fe   ....>... ........
0010  03 00 07 f0 d1 04 80 00  00 ca 53 35 10 01 03 06   ........ ..S5....
0020  0f 03 00 ff 07 05 00 01  ff 02 30 67 53 20 01 0a   ........ ..0gS ..
0030  c6 01 03 c4 01 01 c3 02  c2 a7 00 00               ........ ....

5. nun noch ein COTP an die S5 für den Verbindungsabbau
Code:
0000  08 00 06 01 00 03 aa 00  04 00 3e 04 00 0e fe fe   ........ ..>.....
0010  03 00 09 60 09 1a 00 00  00 cb 00 00 00 00 00 00   ...`.... ........
0020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ........ ........
0030  00 00 00 00 00 00 00 00  00 00 00 00               ........ ....

Wenn ich die nachbilden kann dann wäre ich glücklich und mein Job erst mal gesichert. Bin Berufsanfänger und noch in der Probezeit, direkt der erste Auftrag entwickelt sich zu einem Fiasko.

Wenn ich weiterhin mit dem Protokollwandler arbeite, dann kommt vor dem ersten Protokoll ein TCP an den Protokollwandler:
Code:
0000  aa 00 04 00 3e 04 00 0d  56 d9 cb 64 08 00 45 00   ....>... V..d..E.
0010  00 38 2c f1 40 00 80 06  00 00 9f 97 63 1e 9f 97   .8,.@... ....c...
0020  63 1c 0f 2e 13 97 5d 42  1d 39 00 00 0e 44 50 18   c.....]B .9...DP.
0030  fa 74 05 94 00 00 53 35  10 01 03 05 03 08 01 6e   .t....S5 .......n
0040  00 05 00 01 ff 02                                  ......

und nach dem fünften ein weiteres vom Protokollwandler an den .NET Rechner
Code:
0000  00 0d 56 d9 cb 64 aa 00  04 00 3e 04 08 00 45 00   ..V..d.. ..>...E.
0010  00 3a a1 14 00 00 fe 06  16 40 9f 97 63 1c 9f 97   .:...... .@..c...
0020  63 1e 13 97 0f 2e 00 00  0e 44 5d 42 1d 49 50 18   c....... .D]B.IP.
0030  06 1c 4b f2 00 00 53 35  10 01 03 06 0f 03 00 ff   ..K...S5 ........
0040  07 05 00 01 ff 02 30 67                            ......0g

Die Protokolle 1 bis fünf werden vom Protokollwandler erzeugt.

Wenn möglich, möchte ich die Protokolle (H1 & COTP) direkt erzeugen.

Oder das TCP besser kontrollieren können; denn da stimmen die Segment Nr, ACK, Nr's etc nicht. Mit scheint es nach einem längeren Vergleich mit dem Sniffer, bei einer Kommunikation eines OPC Server und meiner Anwendung, das die S5 keinen Verbindungsabbau bekommt und weiter sendet.

So kommt die S5 durcheinander und reagiert nach ein paar Minuten mit einem ziemlich arroganten Ignonieren meiner Anfragen, bis der Start/Stop Schalter umgelegt wird, worauf sie dann gleich wieder munter drauflos labert, bis ich nach ein paar Durchläufen wieder ignoriert werde. *frust*

Mir fehlt eigentlich nur ein beispiel-Code, wie ich ein Protokoll als ByteArray über die Netzwerkkarte rausgebe, bzw. die Karte abhöre wenn antworten kommen!

So, mal schauen ob hier einer was für mich hat.

LG D12
 

Norbert Eder

Erfahrenes Mitglied
Naja, du verwechselst da glaub ich etwas. COTP baut nicht auf TCP auf, sondern ist quasi ein Konkurrent. Wenn du jetzt mit TcpClient und TcpListener arbeitest, setzt du am falschen Protocol auf.

Die Sockets dürften da die wesentlich bessere Wahl geben. Laut ProtocolFamily-Enumeration, wird das ISO-Protokol unterstützt .. COTP gehört ja zur netten ISO-Familie. Das heißt du müsstest das Protokol wirklich selbst implementieren und ins Framework klatschen.

Andere Frage: Unterstützt deine Zielapplikation das TPKT-Protokol? Dieses wäre etwas einfacher, da es auf TCP aufsetzt und du dir so sehr viel Arbeit ersparen könntest.
 

D12

Mitglied
Nein, mein Zielhost unterstützt nur COTP und H1.

Komme nicht so recht mit dem Socket klar,... TCPclient war ja noch einfach, kommuniziert auch aber instabil.

Nun brauch ich eine BEispiel-Source, die mir weiterhilft, eines der gezeigten Protokolle nach zu bilden, bzw. die Antworten ein zu lesen, den Rest dürfte ich dann schon hinbekommen.

Wenn ich hier schnell zu einem Ziel komme, dann darfst mir Deine Kontonummer nennen... Ich weis zwar noch nicht was es mir wert ist, aber wenn das hier klappt, dann werd ich was für berappen, ...

LG D12
 

Norbert Eder

Erfahrenes Mitglied
Der TcpClient ist schon stabil, wenn man sauber damit umgeht, aber wie gesagt, den kannst du dir aus dem Kopf schlagen, weil dir das nicht weiterhilft. COTP hat mit TCP nichts zu tun (siehe http://wiki.ethereal.com/COTP).

COTP basiert zudem auf CLNP und nicht wie TCP auf IP. Ergo musst du schon weiter unten ansetzen. Soweit ich jedoch gesehen habe, scheint es einige Libraries zu geben, die CLNP unterstützen (Xceed Winsock Library). Du solltest dir diese vielleicht einmal ansehen, sonst wirst die nächsten zwei Monate nichts anderes tun, als eigene Protokolle zu implementieren.

Noch ein heisser Tipp: Guck dir mal die OSI-Schichten an. Da scheinst du noch Schwächen zu haben. Ach ja, und die ISO-Schichten wären auch net so blöd.
 

D12

Mitglied
:O( dann denke ich das ich zum WE wieder arbeitslos bin, im ganzen Internet ist das so dokumentiert, scheinbar ist keiner in der Lage das mal zusammenhängend an einem einfachen Beispiel zu dokumentieren.

Ich kämpfe mich grad durch die MSDN durch...

Und hab grad den Socket.Connect(EPendpoint), was ist ein Ependpoint und dann noch die Socket-Flags, etc... da ist alles aufgelistet, aber eine Erklärung hat man sich bei MIcrosoft gespart. Da kann man nur die Krise bekommen, wenn man seit Tagen mit dem Mist beschäftigt ist und nicht mal eine einfache Komkmunikation zustande bekommt.

Nun wäre ein Quellcode, der einen Socket erstellt, der mit Ipirgendwas auf Port xy mit zusätzlichem ByteArray was sendet, ganz nützlich, aber zu dem Thema findet man nur Seitenlange codes, die nicht komentiert sind und wo man die einzelnen Eigenschaften nirgendwo erklärt findet. *grummel*
 

D12

Mitglied
By The Way, was nützt es mir die OSI/ISO Schichten noch mal zu lesen, wenn ich nicht mal ein beispiel finde wie ich da wo reinfunken kann.... Und gelesen habe ich in den letzten Tagen eine Menge. Auch zu OSI/ISO.... Aber nix was wirklich weiterhilft...
 

Norbert Eder

Erfahrenes Mitglied
Du hast es nicht verstanden. Zurück zum Start und kassiere 100.

Die Protokolle die du benötigst kann .NET nicht (zumindest hätte ihc keinen Hinweis darauf gefunden).

Dann solltest du dir ISO/OSI doch nochmal angucken, weil dir die Grundlagen der Netzwerk-Kommunikation fehlen. Ohne diese Grundlagen wirst du es nicht schaffen, hier etwas sinnvolles zu erreichen.

Du willst eine Kommunikation, die nicht auf IP basiert. Daher solltest du dich (bevor du Informationen über Endpoints etc. suchst) mal erkundigen, wie du eine Kommunikation via .NET über das Protokoll zusammenbringst, die du brauchst.

Eventuell hilft es auch, wenn du bei deinem Hersteller nachfragst, wie sie mit ihren Dingern kommunizieren bzw. ob sie dir da weiterhelfen können.

Des weiteren: was is eine S5 ?

Du gräbst da eindeutig an den falschen Stellen. Anstatt jetzt auf uns/mich sauer zu sein, solltest du dir das genau durchlesen was ich dir schreibe und auch beherzigen/verfolgen. Vielleicht solltest du auch mit dienen Problemen zu deinem Chef gehen. Wenn er dich für ein nicht triviales Problem feuert, dann kannst eh froh sein. Immerhin scheint das nichts zu sein, was in ein paar Tagen fertig sein kann.

Und hast du dir die Library von XCEED angeguckt? Ich getrau mich wetten, dass du es dir nichmal angesehen hast.
 

Norbert Eder

Erfahrenes Mitglied
D12 hat gesagt.:
Und hab grad den Socket.Connect(EPendpoint), was ist ein Ependpoint und dann noch die Socket-Flags, etc... da ist alles aufgelistet, aber eine Erklärung hat man sich bei MIcrosoft gespart. Da kann man nur die Krise bekommen, wenn man seit Tagen mit dem Mist beschäftigt ist und nicht mal eine einfache Komkmunikation zustande bekommt.

Nun wäre ein Quellcode, der einen Socket erstellt, der mit Ipirgendwas auf Port xy mit zusätzlichem ByteArray was sendet, ganz nützlich, aber zu dem Thema findet man nur Seitenlange codes, die nicht komentiert sind und wo man die einzelnen Eigenschaften nirgendwo erklärt findet. *grummel*

Ad Microsoft hat mit Infos gespart: Bitte, es steht doch eh alles dabei. Musst halt auf die Links auch klicken, die sich auf der entsprechenden Seite ergeben und auch die restliche Info lesen.

Und du kannst auch nicht erwarten, dass es für alles Sourcecode gibt. Wenn dem so wäre, dann wären ohnehin 90% der Programmierer umsonst.
 

D12

Mitglied
Ich muss nicht unbedingt ohne IP, im gegenteil, das habe ich mit TCPclient versucht, über einen Protokollwandler. Aber nach ein paar erfolgreichen Kommunikatoinsversuchen, bricht die Kommunikation ab. Die S5 antwortet nicht und meine Methode warte bis zum TimeOut, wenn ich denn einen definiert habe, ansonsten bis zum Sankt Nimmerleinstag.

Wenn ich mir das mit dem Sniffer anschaue und mit dem Verkehr vergleiche, den ein professioneller OPCserver veranstaltet, dann seh ich das meine Anwendung scheinbar die Verbindung nciht sauber abbaut. Ich finde aber auch keine Option, welche die S5 zu einem Abbau der verbindung zwingt.

Hersteller geben keine Auskunft, die wollen schließlich eigene Programme oder Hardware verkaufen.

Des weiteren: was is eine S5 ?
S5 - SPS - Anlagensteuerung, komuniziert auf H1-Basis, ein Protokollwanlder wandelt von TCP auf H1 um, ....

Bin nicht sauer, eher ein wenig verzweifelt, weil ich seit Tagen nicht weiterkomme und ich als Berufsanfänger auch keine Unterstützung von den Kollegen bekomme (alles freiberuflich)!

Du hast es nicht verstanden. Zurück zum Start und kassiere 100.

Die Protokolle die du benötigst kann .NET nicht (zumindest hätte ihc keinen Hinweis darauf gefunden).

Dann solltest du dir ISO/OSI doch nochmal angucken, weil dir die Grundlagen der Netzwerk-Kommunikation fehlen. Ohne diese Grundlagen wirst du es nicht schaffen, hier etwas sinnvolles zu erreichen.

Du willst eine Kommunikation, die nicht auf IP basiert. Daher solltest du dich (bevor du Informationen über Endpoints etc. suchst) mal erkundigen, wie du eine Kommunikation via .NET über das Protokoll zusammenbringst, die du brauchst.

Eventuell hilft es auch, wenn du bei deinem Hersteller nachfragst, wie sie mit ihren Dingern kommunizieren bzw. ob sie dir da weiterhelfen können.

Des weiteren: was is eine S5 ?

Du gräbst da eindeutig an den falschen Stellen. Anstatt jetzt auf uns/mich sauer zu sein, solltest du dir das genau durchlesen was ich dir schreibe und auch beherzigen/verfolgen. Vielleicht solltest du auch mit dienen Problemen zu deinem Chef gehen. Wenn er dich für ein nicht triviales Problem feuert, dann kannst eh froh sein. Immerhin scheint das nichts zu sein, was in ein paar Tagen fertig sein kann.

XCEED:
Was soll ich mit einer Library für die ich bezahlen muss, wenn ich das Geld hätte, wäre es kein Problem, aber da ich erst mal arbeiten muss um wieder was in die Kasse zu bekommen, die leer ist, nachdem ich meine Umschulung erst vor einer Woche beendet habe, kann ich mir keine teuren Libraries leisten.

Ich brauch nur ein Signal an die S5 was deutlich die Kommunikation beendet, aber ich finde weder zur S5 noch zu TCP irgendwas in der Richtung.

Grüße
D12(ist auf niemand sauer, nur etwas im Zeitdruck)
 

Norbert Eder

Erfahrenes Mitglied
D12 hat gesagt.:
Ich muss nicht unbedingt ohne IP, im gegenteil, das habe ich mit TCPclient versucht, über einen Protokollwandler. Aber nach ein paar erfolgreichen Kommunikatoinsversuchen, bricht die Kommunikation ab. Die S5 antwortet nicht und meine Methode warte bis zum TimeOut, wenn ich denn einen definiert habe, ansonsten bis zum Sankt Nimmerleinstag.
Also COTP arbeitet nicht über IP. Das ist die Definition von COTP. Du kannst aber gerne beim Hersteller anfragen ob es eine Möglichkeit der Kommunikation via IP gibt (hab ich dir eh schon wieter oben beschrieben).
D12 hat gesagt.:
Wenn ich mir das mit dem Sniffer anschaue und mit dem Verkehr vergleiche, den ein professioneller OPCserver veranstaltet, dann seh ich das meine Anwendung scheinbar die Verbindung nciht sauber abbaut. Ich finde aber auch keine Option, welche die S5 zu einem Abbau der verbindung zwingt.
Dann musst du beim Hersteller nachfragen oder einen Blick in die Spezifikationen werden. Diese wirst wohl auf dem Tisch liegen haben.
D12 hat gesagt.:
Hersteller geben keine Auskunft, die wollen schließlich eigene Programme oder Hardware verkaufen.
Aso? Wär mir jetzt neu und würde meinen Erfahrungen widersprechen.
D12 hat gesagt.:
Bin nicht sauer, eher ein wenig verzweifelt, weil ich seit Tagen nicht weiterkomme und ich als Berufsanfänger auch keine Unterstützung von den Kollegen bekomme (alles freiberuflich)!
Kann schon sein, dass du verzweifelt bist, aber informiere dich trotzdem erstens mal bei deinen Kollegen, denn nur weil due Berufsanfänger bist, heißt das noch lange nicht, dass sie dir nicht helfen. Wenn sie dir nicht helfen, such dir einen neuen Job.
D12 hat gesagt.:
Was soll ich mit einer Library für die ich bezahlen muss, wenn ich das Geld hätte, wäre es kein Problem, aber da ich erst mal arbeiten muss um wieder was in die Kasse zu bekommen, die leer ist, nachdem ich meine Umschulung erst vor einer Woche beendet habe, kann ich mir keine teuren Libraries leisten.
Diese Library wird wohl dein Arbeitgeber bezahlen. Und wenn du freiberuflich für sie arbeitest, dann setz das mit auf deine Rechnung die du stellen musst.
D12 hat gesagt.:
Ich brauch nur ein Signal an die S5 was deutlich die Kommunikation beendet, aber ich finde weder zur S5 noch zu TCP irgendwas in der Richtung.
Du hast es immer noch nicht kapiert. Das Protokoll welches du verwendest basiert nichtmal auf IP, was brauchst du dann TCP? Wende dich an den Hersteller für nähere Informationen, hab ich dir jetzt schon 5mal gesagt. Wenn es einen Weg über TCP gibt, dann werden sie dich aufklären. Oder red mit deinen Arbeitskollegen und mach dir nicht in die Hose.
 

D12

Mitglied
Hmmm... ich habs grad hingeschmissen... entweder nennen die mir einen Ansprechpartner der sich mit der S5 Kommunikatoin auskennt oder ich habe ab morgen viel Zeit mich mit Sockets auseinander zu setzen..
 

Neue Beiträge