TCP - Send

  • Hay zusammen, ich habe ein Programm das ich mit einer Alarmzentrale verbinden über TCP-IP.

    connecten kann ich, wird in der Alarmzentrale auch angezeigt, allerdings kann ich einige Meldungen nicht so absetzen wie ich möchte.

    Zum Beispiel, soll diese Meldung über TCP-IP geschickt werden.

    Was er aber nach Programm Start nicht tut.

    Und es gibt auch keine Fehlerinterpretation.
    Wenn ich nun allerdings den selben String per Button los schicke funktioniert auch nur 1x, kommt dieser in der Alarmzentrale an,

    Allerdings so :

    statt so :

    Ist es möglich das ich mein gesendeten String irgendwie mit einer TCP-Funktion abschließen muss?
    Ohne die Verbindung zum Server zu kappen.
    Habe das Gefühl das er mit jedem String den alten String erweitert, da bin ich mir aber nicht sicher.

    mein bisheriger Code :

    Ich habe die GUI im Code weggelassen, mich interessiert nur ob der Aufbau richtig wäre oder ob ich grundlegend etwas falsches mit TCP mache, da ich davor noch nie mit gearbeitet habe.

    Sobald mein Programm/Script geöffnet wurde zeigt es in der Leitstelle an das mein Programm per IP verbunden ist sobald ich es schließe wird gezeigt das mein Programm ausgefallen ist.
    Also habe ich ja eine Verbindung wärend mein Programm läuft aber warum kann ich dann nicht mehrere Meldungen hinter einander absetzten erst nach Neustart des Scripts/programmes funktioniert es wieder.

    Deswegen glaube ich das TCPSend bei einer bestehenden Verbindung einfach den letzten geschickten String erweitert, ich kann mir auch nicht erklären warum er die Meldung dann so beendet: </LISA><?xml VERSION="1.0" ENCODING="UTF-8"?>
    hoffe ihr seit schlauer als ich und könnt mir dabei helfen.

    Gruß Mojoe

    Einmal editiert, zuletzt von SOLVE-SMART (4. April 2023 um 15:32) aus folgendem Grund: Tidy des bisherigen Codes durchgeführt. XML in Code Blöcke verschoben.

  • Hallo!

    Ich bin mit XMLDOM immer besser gefahren, als mit selber erstellten XML-Strings.

    Und auch mit WinHTTP hatte ich immer weniger Probleme, als TCP-Send

    Probiers mal auf diese Weise:

    Etwas übersichtlicher wirds natürlich, wenn du dir eine Helperfunktion bastelst, welche die XML-Elemente in einer Zeile erstellt...

    EDIT: Zum betrachten $oXML-save und mit einem XML-Editor (Internet Explorer reicht ;)) öffnen (XML-String ist SingleLine)

    lgE

  • eukalyptus

    Danke für deinen Rat, Ich habe es grad über winhttp probiert, damit geht es leider gar nicht.

    Aber der _CreateMSG teil ist toll :) weil genau das habe ich erst heute fast genauso versucht, habe aber Fehler erhalten. Dann habe ich den String erstmal zum testen einfach runtergeschrieben.

    Ich bin ein doofi, ich hab grad gemerkt wo mein Fehler ist, beim Testen ist mir grad aufgefallen das

    @CRLF hat gefehlt deshalb hat er wahrscheinlich auch den teil angehangen.

    Ich habe es in der GUI nun mit dieser 1 Meldung getestet, also :
    Programm gestartet. -> XML Meldung ist angekommen.Testbutten 1x -> XML Meldung ist angekommen.

    2x wiederholt -> alle Meldungen in der Zentrale angekommen.


    Ich denke das war der Fehler, ich werde morgen weiter programmieren und testen und falls sich wieder das selbe Bild zeigt wie heute dann melde ich mich wieder.^^

  • Hi, freut mich, dass du den Fehler gefunden hast.

    Ich hätte sonst noch den Vorschlag gehabt, den XML-Teil als Template zu haben. Ist etwas lesbarer und solange die Menge überschaubar ist ggf. auch sinnvoll.

    Ich hab dabei das ganze Script etwas umgebaut um zu zeigen, wie ich das umgesetzt hätte. Ist meiner Meinung nach etwas übersichtlicher, vereinfacht die Fehlersuche und ist generell mehr auf Wiederverwendbarkeit ausgelegt.

    Dazu hab ich mir zum testen auch einen Server geschrieben. Der könnte für dich auch hilfreich sein um solche Fehler zu finden, wie den von dir genannten:

    MfG, Kanashius :)

  • Velted

    Ehm nein daran lag es nicht, den es wird momentan noch alles unverschlüsselt übertragen.

    Aber das wird als nächstes getestet wenn ich dazu komme und lust habe^^.

    Ich denke wenn ich soweit bin muss ich dieses Zitat beachten^^

    eukalyptus

    Das mit dem XMLDOM funktioniert gut, allerdings habe ich damit noch ein kleines Problem.

    $oXML sollte doch der ganze gebaute String sein oder nicht ?
    Aber irgendwie gibt er mir diesen nicht zurück, bin nun einen Umweg gegangen, ich speichere es erst als Datei und dann lese ich die Datei nochmal aus.


    Kanashius

    danke für deine Mühe, das muss ich mir mal genauer ansehen die Tage. mein Problem dabei ist das ich StringFormat noch nicht wirklich verstanden habe.

  • $oXML sollte doch der ganze gebaute String sein oder nicht ?
    Aber irgendwie gibt er mir diesen nicht zurück, bin nun einen Umweg gegangen, ich speichere es erst als Datei und dann lese ich die Datei nochmal aus.

    Du kannst mit $oXML.xml darauf zugreifen. (Alle verfügbaren Attribute findest du hier: https://learn.microsoft.com/en-us/previous…s763798(v=vs.85) )
    $oXML ist ein Objekt mit verschiedenen Daten (Fields/Properties) und Methoden. Es ist kein String! Deshalb kannst du z.B. mit $oXML.createElement("Ereignis") ein Element hinzufügen. Es wird eine Methode an dem Objekt aufgerufen.

    Bei deinem Beispiel würde ich persönlich eher den String mit StringFormat verwenden, statt das XML-Objekt. Es ist einfach übersichtlicher, da du nur ein kleines Template hast. Wenn du aber XML lesen/ändern willst oder das ganze noch komplizierter/verschachtelter wird würde ich das XML-Objekt nutzen. Musst du wissen, was in diesem Fall mehr Sinn macht/was du mit dem Tool noch vorhast.

    danke für deine Mühe, das muss ich mir mal genauer ansehen die Tage. mein Problem dabei ist das ich StringFormat noch nicht wirklich verstanden habe.

    Bei StringFormat übergibst du einen String (hier das XML). In dem String schreibst du z.B. %s, %u,... (Schau in der Hilfe, was es noch alles gibt). Das sind Platzhalter für Daten, die später mit StringFormat eingefügt werden.

    %s steht dabei für einen String, %u für eine positive, ganze Zahl. Und die werden nacheinander mit den Parametern von StringFormat ersetzt. Das erste %_ mit dem ersten Parameter von StringFormat, usw.

    Statt z.B. also $sText = "Ich bin die " & $sType & " Zahl: " & $iZahl kann man schreiben: $sText = StringFormat("Ich bin die %s Zahl: %u", $sType, $iZahl) Dabei kann man bei Dezimal Zahlen auch angeben, wie viele Nachkommastellen angezeigt werden sollen,... Und in diesem Fall macht es das ganze übersichtlicher, weil du den String nur einmal speichern musst und ihn immer wieder mit anderen Variablen füllen kannst, ohne dass jedesmal die ganze Zuweisung mit dem ganzen Text dort stehen muss.

    Auf diese Weise sind Änderungen/Fehler leichter zu beheben, gerade wenn es öfter verwendet wird als hier im Beispiel und es spart Code-Zeilen (=>übersichtlicher), wenn du so wie bei dir mehrere Zeilen an Text hast, die recht lang werden.

  • Nur zur Ergänzung (ohne eine Bewertung abzugeben): Es gibt noch eine andere Möglichkeit sich seine Strings mit variablen Inhalten zusammenzubauen: Opt("ExpandVarStrings", 1).
    Wenn man diese Option setzt, werden Variablen und Makros innerhalb von Stringdefinitionen ausgewertet.
    Auf die Art kann man evtl. seinen String etwas übersichtlicher zusammenbauen - Beispiel: