Ankündigung

Einklappen
Keine Ankündigung bisher.

tcpread Antwort auf mehrere Variablen splitten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Featurewunsch] tcpread Antwort auf mehrere Variablen splitten

    Hallo,

    wenn man eine Antwort auf ein TCPRead bekommt, wird ja, wenn der Inhalt zu lang ist, der "Puffer" so
    lange gefüllt wie es geht, am Ende fliegen die ersten Daten wieder aus dem Puffer, sollte die Variable
    (akt. 1400 Zeichen, später ca. 65k)... voll sein.

    cool wärs, wenn man mehrere Variablen angeben könnte, oder er das automatisch macht. Wenn die
    Variable "voll" ist.. die nächste Verwenden..

    hab festgestellt das auch 65k manchmal zu wenig ist... (siehe mein Versuch die Fritzbox Telefonverbindungen
    auslesen)

    Gruß Martin
    Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

    #2
    cool wäre es auch, gleich beim erhalt des Packetes..
    also wärend des füllen des "Puffers" die Daten bearbeiten
    zu können...

    also zb. trimmen...

    das man sagt, man will die ersten 500 Zeichen nicht..
    oder die letzten xxx.

    oder man könnte sagen filter mir aus den Daten folgende
    Zeichenfolgen herraus.

    Einfach aber hilfreich wäre es auch, wenn man vor dem
    Empfang angeben könnte, ob er wie er es jetzt macht, die
    ersten Daten überschreiben soll, oder ob er einfach den String
    mit Daten füllt und wenn er voll ist, die restlichen verwirft..

    das müsste doch relativ einfach zu realisieren zu sein ?!?

    Quasi: readtcp(port, adresse, arg 1[, arg2, ... arg n], reverse)

    Gruß Martin
    Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

    Kommentar


      #3
      Zitat von Brick Beitrag anzeigen
      cool wäre es auch, gleich beim erhalt des Packetes..
      also wärend des füllen des "Puffers" die Daten bearbeiten
      zu können...
      Ich bin mir nicht sicher, aber ich denke, dass die Pakete schon gepufftert werden . D.h. Wenn noch Daten nach einem Lesen im Eingangspuffer da sind, dann werden die halt erst beim nächsten Readtcp auf den String geschrieben. Ich frag da nochmal nach, morgen
      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #4
        ok, danke !!

        aber wie gesagt.. so eine Option die es einem erlaubt nur auf die ersten Daten
        bis zum erreichen der Stringgröße zuzugreifen wär schon schön und sicher
        auch für div. andere Ideen hilfreich !!

        Gruß Martin
        Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

        Kommentar


          #5
          Zitat von enertegus Beitrag anzeigen
          Ich frag da nochmal nach, morgen
          gibts da schon was zu erzählen ??

          ist mein "Wunsch" eigentlich grundsätzlich machbar ??
          wie stehen die Chancen ?
          Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

          Kommentar


            #6
            Zitat von Brick Beitrag anzeigen
            gibts da schon was zu erzählen ??
            ist so, wie ich schon geschrieben habe. Die FW puffert bis zu 10 Nachrichten mit bis zu 65k. Die Verarbeitung holt sich diese Nachrichten ab, sodass es nicht so zeitkritisch ist, auch wenn z.B. 20ms zwischen zwei Verarbeitungszyklen liegen, die Pakete aber im 1ms Raster eintreffen.
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Zitat von enertegus Beitrag anzeigen
              i Die FW puffert bis zu 10 Nachrichten mit bis zu 65k.
              die neue Firmware, oder auch schon die alte ??

              was bedeutet das jetzt für meinen "Featurewunsch"..
              können Daten jetzt irgendwie vor dem füllen des Strings
              bearbeitet werden.

              Oder ist es irgendwie möglich nur die ersten eingetroffenen Daten
              auf den String zu schreiben ?

              Gruß Martin
              Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

              Kommentar


                #8
                Zitat von Brick Beitrag anzeigen
                die neue Firmware, oder auch schon die alte ??
                quasi jede FW ab 2.000.
                was bedeutet das jetzt für meinen "Featurewunsch"..
                können Daten jetzt irgendwie vor dem füllen des Strings
                bearbeitet werden.
                Der ist hinfällig, weil ja jeder String aufgefüllt wird und dann Du einfach mit split und Konsorten arbeiten kannst (siehe den Wetterabfragemakros).
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Zitat von enertegus Beitrag anzeigen
                  Der ist hinfällig, weil ja jeder String aufgefüllt wird und dann Du einfach mit split und Konsorten arbeiten kannst (siehe den Wetterabfragemakros).
                  das ist ja gerade das was ich wissen wollte... der String wird ja zuerst gefüllt und dann kann ich erst mit Split usw. arbeiten, oder ?

                  wenn ich jetzt aber zb. die Daten aus dem Puffer bevor sie in den String geschrieben werden schon filtern (mit split) will.. (Platzgründe) geht das dann auch ??

                  hab zb. in einem TCPRead 50 x eine spezielle ID Nummer drin (ca. 40 stellig)..
                  die würd ich gern rausfiltern, weil ich die Info im String nicht benötige sie mir aber 50x40 Zeichen verbrät !

                  alternativ:

                  in der Antwort gibt es immer ein <entry>bla bla bla </entry>
                  jetzt wärs praktisch wenn ich jeden einzelnen <entry> in einen eigenen String schreiben könnte !!
                  Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                  Kommentar


                    #10
                    Zitat von Brick Beitrag anzeigen
                    das ist ja gerade das was ich wissen wollte... der String wird ja zuerst gefüllt und dann kann ich erst mit Split usw. arbeiten, oder ?
                    JA.
                    [/QUOTE]
                    hab zb. in einem TCPRead 50 x eine spezielle ID Nummer drin (ca. 40 stellig)..
                    die würd ich gern rausfiltern, weil ich die Info im String nicht benötige sie mir aber 50x40 Zeichen verbrät !
                    [/QUOTE]
                    Ja, so habe ich das ja im Googlewettermakro gemacht.
                    in der Antwort gibt es immer ein <entry>bla bla bla </entry>
                    jetzt wärs praktisch wenn ich jeden einzelnen <entry> in einen eigenen String schreiben könnte !!
                    Du möchtest den Stream konfigurieren?? Nein, das geht nicht. Aber es geht wie gesagt mit dem find, split den String zu bearbeiten. Ich seh auch keinen Vorteil, es anders zu machen.
                    Vielleicht versteh ich auch Dein Ansinnen nicht bzw. kannst Du vielleicht mal sagen, was genau Du machen willst.
                    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                    Enertex Produkte kaufen

                    Kommentar


                      #11
                      ich glaub er möchte die Verarbeitung logisch gesehen einen Schritt nach vorne verlagern!

                      Also nicht die Rohdaten über TCP in einen String lesen, und dann dort weiterverarbeiten, sondern schon vorher sagen, welchen Teil man überhaupt braucht.
                      Also z. B. so was wie ein readtcp(BeginnAbStelleX, YStellen lang, etc.)
                      ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                      Kommentar


                        #12
                        OK.. wieder das konkrete Beispiel:

                        Ich will den GoogleKalender auslesen. Das funktioniert im Prinzip auch
                        schon sehr gut...

                        Hier erstmal der Code.. das erklärts dann sicher:
                        [highlight=epc]
                        // TCP Message für Abfrage

                        if GoogleInit == EIN then \\
                        stringset(CRLF, 0x0A0Du16, 0u16); \\
                        GoogleIP = resolve($google.com$); \\
                        GET_1 = $GET /calendar/feeds/martin.zxxxx@gmail.yy/private-89yyy7f8xxxebdd7c4b7aaa76a9bfb/basic HTTP/1.0$ + CRLF; \\
                        GET_2 = $User-Agent: Wget/ 1.0.10$ + CRLF; \\
                        GET_3 = $Accept: */*$ + CRLF; \\
                        GET_4 = $Host: 173.194.113.176$ + CRLF; \\
                        GET_5 = $Connection: Keep-Alive$ + CRLF + CRLF; \\
                        GoogleString = GET_1 + GET_2 + GET_3 + GET_4 + GET_5 \\
                        endif

                        // TCP Verbindung zum Host aufbauen

                        if after(GoogleInit, 1000u64) then \\
                        TCP_ConnectionState = connecttcp(GooglePort,GoogleIP) \\
                        endif

                        // TCP Nachricht senden

                        if change(TCP_ConnectionState) \\
                        and TCP_ConnectionState == 0u08 then \\
                        sendtcparray(GooglePort, GoogleIP, GoogleString, size(GoogleString)) \\
                        endif

                        // jetzt hier noch ggfs. TCP Nachricht empfangen und dann TCP Verbindung schließen
                        if event(readtcp(GoogleResPort,GoogleResIP,GoogleResD ata)) and GoogleResIP == GoogleIP and GoogleResPort == GooglePort then {
                        GoogleResult=GoogleResData;
                        } endif

                        // TCP Verbindung wieder schließen
                        if after(GoogleInit, 20000u64)then {
                        closetcp(GooglePort,GoogleIP);
                        GoogleInit = AUS
                        }endif



                        //Infos Pharesen

                        if change(GoogleResult) then {
                        // Termin Name
                        Google_PosStart=find(GoogleResult,$<title type='html'>$,0u16)+size($<title type='html'>$);
                        Google_PosEnd=find(split(GoogleResult,Google_PosSt art,END),$</$,0u16)+Google_PosStart-1u16;
                        Google_Termin_Name=convert(split(GoogleResult,Goog le_PosStart,Google_PosEnd),$$);
                        //Termin Zeit
                        Google_PosStart=find(GoogleResult,$Wann: $,0u16)+size($Wann: $);
                        Google_PosEnd=find(split(GoogleResult,Google_PosSt art,END),$&lt;br$,0u16)+Google_PosStart-1u16;
                        Google_Termin_Zeit=convert(split(GoogleResult,Goog le_PosStart,Google_PosEnd),$$);
                        //Termin Ort
                        Google_PosStart=find(GoogleResult,$Wo: $,0u16)+size($Wo: $);
                        Google_PosEnd=find(split(GoogleResult,Google_PosSt art,END),$&lt;br$,0u16)+Google_PosStart-1u16;
                        Google_Termin_Ort=convert(split(GoogleResult,Googl e_PosStart,Google_PosEnd),$$);
                        //Termin Beschr
                        Google_PosStart=find(GoogleResult,$Terminbeschreib ung: $,0u16)+size($Terminbeschreibung: $);
                        Google_PosEnd=find(split(GoogleResult,Google_PosSt art,END),$</content>$,0u16)+Google_PosStart-1u16;
                        Google_Termin_Beschr=convert(split(GoogleResult,Go ogle_PosStart,Google_PosEnd),$$);
                        GooglexmlCount=0
                        } endif
                        [/highlight]

                        Wie gesagt.. das funktioniert eigentlich gut.. ich bekomme die richtigen Infos in die Variablen :
                        Google_Termin_Name
                        Google_Termin_Zeit
                        Google_Termin_Ort
                        Google_Termin_Beschr

                        LEIDER.. nur vom letzten Termin.. und das liegt ganz einfach da dran, das
                        jeder Eintrag im Googlekalender ca. 1100 Zeichen (siehe Code ) in der Antwort des TCPRead beansprucht..
                        heißt wenn ich 5 Einträge drin hab, werden die ersten 4 Einträge vom letzten überschrieben...

                        Auch die neue Version (Echtzeitvisu) wird da nicht viel dran ändern, weil dann das ganze Problem nach
                        ca. 60 Einträgen im Kalender wieder beginnt.

                        um auf den Featurewunsch zurück zu kommen.. cool wärs jetzt eben wenn
                        die Stringvariable (1400 Zeichen, oder 65k Zeichen) nicht von vorn nach hinten gefüllt würde und die ersten
                        Zeichen bei überschreitung gelöscht würden, sondern wenn der String mit den ersten 1400 (oder 65k) gefüllt
                        werden würde und der Rest verworfen würde. Somit könnte ich damit z.b täglich den Kalender abfragen und
                        immer den neuesten Wert in Variablen übertragen.

                        Code:
                        oogle.com/calendar/feeds/martin.zxxxxx%40gmail.com/private-89022dagssdsdfsdf1b/basic/6u4aasdfasdf37ckbnr504'/><author>
                        <name>Martin xxxxx</name>
                        <email>martinxxxxxxx@gmail.com</email></author></entry>
                        <entry><id>http://www.google.com/calendar/feeds/martinxxxxx%40gmail.com/private-890asdfasdfasdffas976a9271b/basic/5k2bafdsafsdfao1in1fc</id>
                        <published>2013-05-22T07:17:17.000Z</published>
                        <updated>2013-07-09T10:28:18.000Z</updated>
                        <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'/>
                        <title type='html'>Gelber Sack</title>
                        <summary type='html'>Wann: Mi 17. Jul. 2013&lt;br&gt;  &lt;br&gt;Wo: Daheim &lt;br&gt;Status des Termins: best  tigt</summary>
                        <content type='html'>Wann: Mi 17. Jul. 2013&lt;br /&gt;  &lt;br /&gt;Wo: Daheim &lt;br /&gt;Status des Termins: best  tigt &lt;br /&gt;Terminbeschreibung: Test Beschreibung</content>
                        <link rel='alternate' type='text/html' href='http://www.google.com/calendar/event?eid=NWsyYm9xcjQyafasfsdafaW4xZmMgbWFydGluLnppZWdasdfNzdAbQ' title='alternate'/>
                        <link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/martin.xxxxx%40gmail.com/private-89022d7fsdfasdfasda9271b/basic/5k2boqasdfasdfasdfo1in1fc'/>
                        <author><name>Martin xxxxx</name><email>martin.xxxxxx@gmail.com</email>
                        </author></entry></feed>
                        die zweite Idee mit dem "split" hat bei mir jetzt so noch nicht funktioniert..
                        sicher mach ich da wieder was falsch und hoffe jemand von euch kann mir
                        da jetzt sagen, was das problem ist..
                        theoretisch müsste das nämlich auch gut funktionieren, da in der Antwort
                        jeder Kalendereintrag in einem <event> ...</event> eingeschlossen ist..
                        die Idee den String nach jedem <event> zu splitten hat leider bei mir noch nicht funktioniert.

                        ich hab jetzt den Code um folgendes erweitert... um das ganze zu splitten..
                        wie gesagt.. bis jetzt hat das noch nicht funktioniert.. vielleicht kann mir da ja jemand noch einen Tipp geben.

                        [highlight=epc]
                        // jetzt hier noch ggfs. TCP Nachricht empfangen und dann TCP Verbindung schließen
                        if event(readtcp(GoogleResPort,GoogleResIP,GoogleResD ata)) and GoogleResIP == GoogleIP and GoogleResPort == GooglePort then {
                        if (find(GoogleResData,$<entry>$,0u16) < END)then {
                        GoogleResult=GoogleResData;
                        } endif;
                        if (find(GoogleResData,$<entry>$,1u16) < END) then {
                        GoogleResult1=GoogleResData;
                        } endif;
                        } endif
                        [/highlight]

                        ich hoffe jetzt ist einigermaßen klar, was ich vor habe/hatte...

                        (irgendwie wollen meine Ideen mit Abfragen nie so richtig funktionieren..
                        siehe Beispiel Fritzbox Telefonbuch )

                        Gruß Martin
                        Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                        Kommentar


                          #13
                          Zitat von Brick Beitrag anzeigen
                          // jetzt hier noch ggfs. TCP Nachricht empfangen und dann TCP Verbindung schließen
                          LEIDER.. nur vom letzten Termin.. und das liegt ganz einfach da dran, das
                          jeder Eintrag im Googlekalender ca. 1100 Zeichen (siehe Code ) in der Antwort des TCPRead beansprucht..
                          heißt wenn ich 5 Einträge drin hab, werden die ersten 4 Einträge vom letzten überschrieben...
                          M.E. liegt das Problem am Folgenden:
                          Der EibPC empfängt die Nachrichten, dann wird
                          if change(GoogleResult)
                          aktiv. Dabei ist es so, dass die readtcp-Funktion das erste Paket in die Variable lädt. Nun wird geparst, zuerst "Termin Name". Im nächsten Verarbeitungszyklus wird nun wieder GoogleResult neu "befüllt", "Termin Zeit" wird gefunden usw.
                          Wenn der erste Termin geparst wird, so wird
                          [highlight=epc]
                          Google_Termin_Beschr=convert(split(GoogleResult,Go ogle_PosStart,Google_PosEnd),$$);
                          [/highlight]
                          aktiv. Wenn mehrere Termine reinkommen wird im nächsten Zyklus wieder GoogleResult neu "befüllt", so das diese Anweisung nun den alten Termin wieder löscht. Da das so schnell geht (EibPC ca. 20 ms), siehst Du im Debugger nur noch den letzten Termin.
                          Das müsste erkennbar werden, wenn Du die Anweisung änderst:
                          [highlight=epc]
                          Google_Termin_Beschr= Google_Termin_Beschr+convert(split(GoogleResult,Go ogle_PosStart,Google_PosEnd),$$)+$@$
                          [/highlight]
                          Nun sollten die Termine drinnestehen, wobei das @-Zeichen den Trenner darstellt. Ok?
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar


                            #14
                            Zitat von enertegus Beitrag anzeigen
                            Nun sollten die Termine drinnestehen, wobei das @-Zeichen den Trenner darstellt. Ok?
                            Hi Enertegus..

                            verstanden.. aber ob's funktioniert ... ich werd das heut mal probieren
                            und dann geb ich bescheid... wär ja fast zu einfach, wenn das die Lösung
                            wäre !


                            Gruß Martin
                            Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                            Kommentar


                              #15
                              So .. hat funktioniert..

                              das ERGEBNIS hier ..

                              Gruß und dank ..

                              Martin
                              Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                              Kommentar

                              Lädt...
                              X