C#-Klasse für die Kommunikation mit IPSymcon fertig

Moin moin,

ich habe mal eine Klasse für C# geschrieben, über die mit IPSymcon über die Designer-Schnittstelle kommuniziert werden kann. Zum Ausprobieren und selber Anwendungen entwickeln reicht die kostenlose Visual C# 2005 Express Edition. Die gibt es zum Herunterladen bei Microsoft. Ich hänge die komplette Projektmappe als rar-File an. Muss dann nur in C# geöffnet und kompiliert werden. Zusätzlich zur Kommunikationsklasse ist eine Konsolenanwendung dabei, über die sich das ganze austesten lässt. Einfach die Befehel an IPSymcon in der Konsole eingeben, die Antwort erscheint dann auch dort. Sonst erforderliche Infos stehen in Kopf der Kommunikations-Klasse.

Ich plane eine Heizungssteuerung in C# zu schreiben, die dann auch auf Windows CE laufen soll. Das ganze wird wahrscheinlich eine Client/Server-Lösung. Das heißt auf dem Rechner auf dem auch IPSymcon läuft läuft dann meine Serveranwendung. Zusätzliche Clients (Windows, CE, theoretisch auch Linux) greifen dann über das Netzwerk auf den Server zu.

Ich werde hier dann mal meine Entwicklungen bereitstellen, kann aber noch dauern.

Joachim

C#-IPSymcon.rar (25.1 KB)

Hallo zusammen,

ich habe obigen C+±Code mal nach VB.Net konvertiert und versuche nun, mich mit IPS zu verbinden. Allerdings klappt das nicht, da bei IPS in den Messages nur auftaucht: „Socket is unsynchron! Synchronizing…“
Mein Binaryreader empfängt dann nichts von IPS, das Senden der Daten klappt. Bei „Verboose“ taucht auch die Meldung „Client connected“ auf, also denke ich mal, das Verbinden an sich klappt ja.
Kann mir jemand weiterhelfen? Paresy? :o
Wenn das Verbinden klappt, werde ich den Code auch veröffentlichen, so dass jeder was davon hat.

Jedes Paket fängt mit einem * an. Wenn IPS ein Paket erhält, welches nicht damit anfängt gibt es diesen Error.

Im Paket gibst du auch an wie lang es ist, damit IPS weiß, wo das nächste Paket anfängt.

paresy

Das ist schon mal gut zu wissen, Danke! :smiley:
Ich habe nun mal per Debugger geschaut. Die Meldung seitens IPS kommt zu dem u.g. Zeitpunkt, wenn ich die „1“ an IPS schicke.

SendeArray = Senden.ToCharArray();
w.Write(’*’);
w.Write(’|’);
w.Write(‚M‘);
w.Write(SendeArray.Length);
w.Write(’|’);
w.Write(‚S‘);
w.Write(SessionIDSenden);
w.Write(’|’);
w.Write(‚P‘);
w.Write(1); <–Hier kommt „Socket is unsynchron“
w.Write(’|’);
w.Write(‚N‘);
w.Write(1);
w.Write(’|’);
w.Write(SendeArray);

Über nen Tipp wär ich wieder sehr dankbar! :slight_smile:

PS: Könntest Du mir vielleicht doch noch mehr Infos zukommen lassen zur Designer-Schnittstelle?

Moin,

schau mal mit Wireshark, was für Daten über die IP-Verbindung gehen. Für |P muss es 7c 50 01 00 00 00 sein, dann kommt | N mit 7c 4e 01 00 00 00 und so weiter.

C# macht aus der „1“ automatisch ein 01 00 00 00. Unter umständen schickt VB nur ein 01…

Wenn es gar nicht klappt, schick mir mal eine PN. Dann können wir über messi Kontakt aufnehmen. Habe die Schnittstelle inzwischen erheblich weiterentwickelt…

Joachim

Joachim kann dir dann ja auch gerne das Original in Pascal/Delphi zukommen lassen.

Falls es noch spezielle Fragen gibt, sagt hier oder per PM bescheid.

Zu dem Fehler:
Bevor der Fehler in IPS überhaupt auftaucht, muss IPS überhaupt 26 Zeichen empfangen haben. Das ist die Große des Header. Der muss auch 26 Zeichen lang sein.

C# macht aus der „1“ automatisch ein 01 00 00 00. Unter umständen schickt VB nur ein 01…

Die Zahl 1 wird von Compiler direkt als 1 Byte abgespeichert. Erstell einfach eine Integervariable und schiebe sie dann per Write raus. Dann sind es nämlich 4 Bytes. Typecast müsste auch ein Lösung sein.

paresy

Hallo ihr zwei,

Danke für eure Antworten. Hab eben mal probiert, aber bin noch nicht weitergekommen. Parallel hab ich eben mal mit der COM-Klasse getestet. Mit der klappt alles, was ich brauche (Variablen lesen/schreiben, Scripte starten). Von daher bin ich nun erstmal bedient. :stuck_out_tongue:
Ich werde es aber mal in ner ruhigen Minute trotzdem weiter probieren und mich dann hier nochmal melden.

Danke noch mal für die schnelle Hilfe! :slight_smile:

Da bin ich wieder :stuck_out_tongue:
Ich hab es nun hinbekommen. Problem war, dass der BinaryWriter immer nur 1 Byte in den Stream schiebt, IPS bei Integer aber 4 Byte erwartet. Wenn ich direkt mit „stream.write“ und einem 4-Byte-Array für Integer arbeite, klappt es. Mit dem folgenden Code funktioniert die Anmeldung nun, und IPS antwortet korrekt mit dem PasswortHash.

Hier der Codeschnippsel:


tx = tx.ToUpper
Dim buffer() As Byte
Dim buffernum(3) As Byte
buffernum(0) = 1

            SendeArray = tx.ToCharArray()
            buffer = System.Text.Encoding.ASCII.GetBytes("*")
            stream.Write(buffer, 0, buffer.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("|")
            stream.Write(buffer, 0, buffer.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("M")
            stream.Write(buffer, 0, buffer.Length)
            buffernum(0) = SendeArray.Length
            stream.Write(buffernum, 0, buffernum.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("|")
            stream.Write(buffer, 0, buffer.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("S")
            stream.Write(buffer, 0, buffer.Length)
            buffernum(0) = SessionIDSenden
            stream.Write(buffernum, 0, buffernum.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("|")
            stream.Write(buffer, 0, buffer.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("P")
            stream.Write(buffer, 0, buffer.Length)
            buffernum(0) = 1
            stream.Write(buffernum, 0, buffernum.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("|")
            stream.Write(buffer, 0, buffer.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("N")
            stream.Write(buffer, 0, buffer.Length)
            buffernum(0) = 1
            stream.Write(buffernum, 0, buffernum.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes("|")
            stream.Write(buffer, 0, buffer.Length)
            buffer = System.Text.Encoding.ASCII.GetBytes(SendeArray)
            stream.Write(buffer, 0, buffer.Length)

Wenn ich die Klasse komplett fertig habe, werd ich sie hier im Thread anhängen, falls sie noch jemand anderes braucht.

Schöne Grüße,
dfhome

Nun gibt´s (wen wundert´s… :cool:) das nächste Problem:
bei der Berechnung des XorStrings wird ja der in eine Integer umgewandelte Char-Variable mit dem von IPS gesendeten Key exponiert. Als Ergebnis erhalte ich eine Zahl mit …E127, was den Wertebereich einer Integer übersteigt -> Overflow. :mad:
Mach ich was falsch oder kommen da tatsächlich so große Zahlen raus?
Als Double deklariert funktioniert´s, allerdings geht dann beim anschließenden Typecast nach Char was schief, weshalb der Hash von IPS abgelehnt wird.

Hilfe… :confused:

Hat sich erledigt… „^“ steht in C für XOR, und nicht für Exponieren. :slight_smile:

…und hier steht das Ergebnis: http://www.ipsymcon.de/forum/showthread.php?p=43867#post43867

Hi,

habe gerade versucht deine klasse auszuführen. leider kommt bei mir immer die fehlermeldung socket exception wurde nicht behandelt. Kann mir jemand da weiterhelfen???

Hast Du beachtet, dass der Code noch an meine Anforderungen angepasst war? Wo kommt denn genau die Exception?

habe die IP und den Port angepasst. Mit der Software IP-Symcon auf diesem PC kann ich mich mit der IP-Symcon (Homeserver) verbinden.

nur mit deiner Klasse klappt es nicht.

kommt der fehler:

Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 192.168.0.10:3774

bei ->
TcpClient client = new TcpClient(IPAdresse, Port);

oh, habe den fehler gefunden. Beim Server, war der Server Socket Port nicht geöffnet. Sorry:-)

Kann es sein das es nur für die Version IpSymcon 1 ist???

verbinden kann ich mich schon nur wenn ich info schreiben kommt nichts.

Ja. Die Klasse ist nur für V1. Für V2 musst du die SOAP Schnittstelle nutzen.

paresy