Ankündigung

Einklappen
Keine Ankündigung bisher.

sendtcp funktioniert nicht wie gewollt

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

    [Codebeispiel] sendtcp funktioniert nicht wie gewollt

    Hallo zusammen,

    ich bin gerade dabei mir ein Makro zu schreiben, welches mir die Ansteuerung eines MPD-Servers ermöglicht.
    Wenn es sauber geschrieben ist, werde ich es definitiv auch hier zum Download anbieten.

    Leider hänge ich aber schon an der ersten Stelle sehr massiv...

    Über die Konsole in Ubuntu ist nach Verbindungsaufbau per telnet ein einfaches "play" oder "pause" ausreichend um entsprechende Aktion im MPD auszulösen. Von daher weiß ich bereits, dass die Ansteuerung per TCP ganz locker funktioniert.

    Nun habe ich erst einmal geschaut, ob ich mich mit connecttcp mit dem MPD verbinden kann. Ergebnis ist, dass die Verbindung sauber aufgebaut wird und ich bekomme auch als Rückgabewert für connecttcp eine "1"

    Wenn ich anschließend ein sendtcp auslöse in folgendem Format
    sendtcp(Port,IP,$play$)
    dann passiert nichts. Leider weiß ich aber auch nicht, wie ich kontrollieren kann, ob entsprechende Anforderung gesendet wird.

    Vielleicht hat ja jemand einen Tipp. Das Makro anschließend zu schreiben ist dann das kleinste Problem...
    Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

    #2
    Ich habe mir nochmal das Handbuch durchgelesen und vermute eine Lösung...

    Kann es sein, dass ich mit "sendtcparray" hier zu einem Ergebnis kommen werde?

    Codebeispiel wäre somit
    sendtcparray(Port,IP,play,4u16)
    Wäre das richtiger?
    Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

    Kommentar


      #3
      Ich empfehle das Handbuch, S.74 und die Hinweise genau zu lesen. Zudem gibt es die EnertexTCP.llib in der Makrosammlung. Dazu folgendes Beispiel:

      Code:
      [MacroLibs]
      //Makro-Bibliotheken
      Demos/TCP/EnertexTCP.lib
      
      [EibPC]
      // YAMAHA YCNA Example  //
      //--- Konstanten: Hier können nun beliebige Kommandos implementiert werden
      MainPower=$@MAIN:PWR=$
      Volume =$@MAIN:VOL=$  // gefolgt von -xx.0  oder UP x dB oder Down x dB  (s.u.)
      MainSrc=$@MAIN:SRC=$ // gefolgt von 1,2...
      
      MyPort=50000u16
      MyReciever=192.168.22.123
      // Gruppenadressen hier:
      StartGA='1/2/3'b01
      VolUpGA='1/2/4'b01
      VolDownGA='1/2/5'b01
      
      // Power On/Off
      IPSendClient(MyReciever,MyPort, MainPower+$On$,StartGA)
      IPSendClient(MyReciever,MyPort, MainPower+$Off$,!StartGA)
      // Volume
      IPSendClient(MyReciever,MyPort, Volume+$-30$,after(StartGA,1000u64))
      // Unklar ob dB dabei sein muss.
      IPSendClient(MyReciever,MyPort, Volume+$Up 2dB$,VolUpGA)
      IPSendClient(MyReciever,MyPort, Volume+$Down 4dB$,VolDownGA)
      // Abfrage
      MyState=$$
      // Wenn der Reciever Ein ist dann ist die Antwort $@MAIN:PWR=ON$
      IPReadClient(MyReciever,MyPort, MainPower+$?$,MyState, StartGA)
      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #4
        Danke für deine Antwort.

        Leider kann ich mit deinem Hinweis auf Seite 74 nichts anfangen, denn das ist hier bereits die Basis für meinen Anwendungsfall und ich meinte hier jegliche Hinweise genau gelesen, als auch beachtet zu haben.

        Was mir aber für den Moment hilft, ist die Nennung des Makros. Das habe ich bei mir bisher nicht in der Sammlung, da ich noch die 2er Firmware nutze. Ich glaube aber, dass ich mit dem Inhalt einen Lösungsansatz habe, den ich nachher einmal testen werde.

        Vielleicht melde ich mich nachher nochmal zurück mit dem Code, falls es nicht funzt :-)


        Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

        Kommentar


          #5
          Noch ein Hinweis: Bei der V2 gab es beim connecttcp teilweise weniger Rückmeldungen und man musste am besten immer mit Zeitkonstanten arbeiten, um die Kommunikation zu erstellen. Dazu ist auf S. 74 erwähnte der Artikel www.enertex.de/downloads/d-eibpc/DokuCF-1.pdf wohl hilfreich.
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            In der Hoffnung, dass mir vielleicht doch noch geholfen werden kann..

            Was ich klar rausstellen konnte:
            • connecttcp arbeitet korrekt und verbindet sich sauber mit dem Server
            • sendtcp schickt ein Argument, ohne dass ein Ereignis im EibPC gespeichert wird
            Um Ausschließen zu können, dass ich eventuell im Argument einen Fehler mache, habe ich mit Wireshark den Datenverkehr mitgeloggt. Die beiden Ausschnitte habe ich unten dargestellt. Das erste Bild mit den IP-Adressen 10.0.10.152 und 10.0.10.151 ist von einer Konsole heraus gesendet, die Musik startet auch entsprechend sauber.

            Bildschirmfoto vom 2017-02-23 21:46:25.png

            Das nun folgende Bild zeigt die Kommunikation seitens EibPC mit dem MPD-Server.
            Bildschirmfoto vom 2017-02-23 21:48:30.png

            Im Vergleich zeigt sich lediglich, dass beim Senden von Konsole das Argument "play\r\n" heißt und nicht play

            Gibt es irgendeine Idee, wie ich hier noch anderweitig vorgehen könnte? Bin echt am Verzweifeln, da ich mich wie kurz vorm Ziel sehe und einfach keine Idee bekomme...
            Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

            Kommentar


              #7
              Hi Jann,

              vielleicht habe ich Dich jetzt mißverstanden aber könnte es sein, das dem play zum funktionieren lediglich ein \r\n fehlt? Ich habe bei mir einige Konstanten definiert wie folgt:
              Code:
              CRLF = $  $
              if systemstart() then {
                  stringset(CRLF, 0x0d, 0u16);
                  stringset(CRLF, 0x0a, 1u16);
              } endif
              
              CR = $ $
              if systemstart() then {
                  stringset(CR, 0x0d, 0u16);
              } endif
              
              LF = $ $
              if systemstart() then {
                  stringset(LF, 0x0a, 0u16);
              } endif
              Einer der Unterschiede zwischen sendtcp und sendtcparray ist, das bei sendtcp bei Strings ein terminierendes Nullzeichen mitgeschickt wird, bei sendtcparray dagegen nicht. Vielleicht hakt es daran...

              Gruß,
              Bernd

              Kommentar


                #8
                Hi Bernd,

                vielen Dank für deine Antwort! Ich kann vieles nachvollziehen, aber irgendwo scheint bei mir noch der Knoten drin zu sein, daher noch einige Rückfragen...

                Dein Vorschlag mit dem \r\n habe ich gestern auch noch getestet mit sendtcp, aber hier auch kein korrektes Ergebnis erhalten. Irritierend für mich hier ist trotzdem, wieso ich das \r\n bei der Steuerung über Konsole nicht mitsenden muss, bzw. wenn ich es mache, er mir dort einen Fehler auswirft...

                Was ich nicht verstehe, aber es vielleicht die Lösung sein könnte: Was bzw. wo in meinem String wird ein terminierendes Nullzeichen mitgesendet?

                Was du oben in deinem Beispiel zeigst, fällt mir noch schwer zu verstehen, wenn ich ehrlich bin. Wofür stehen die hexadezimalen Ausdrücke. Oder anders: Wie sieht das Ergebnis deines strinset aus...
                Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

                Kommentar


                  #9
                  Zitat von Janosch25786 Beitrag anzeigen
                  Hi Bernd,
                  Dein Vorschlag mit dem \r\n habe ich gestern auch noch getestet mit sendtcp, aber hier auch kein korrektes Ergebnis erhalten. Irritierend für mich hier ist trotzdem, wieso ich das \r\n bei der Steuerung über Konsole nicht mitsenden muss, bzw. wenn ich es mache, er mir dort einen Fehler auswirft...
                  Die Konsole fügt das automatisch ein.
                  Was du oben in deinem Beispiel zeigst, fällt mir noch schwer zu verstehen, wenn ich ehrlich bin. Wofür stehen die hexadezimalen Ausdrücke. Oder anders: Wie sieht das Ergebnis deines strinset aus...
                  Du musst die Strings verknüpften:
                  sendtcp(... , MeinWunschString+CRLF, ...)
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #10
                    Hi,

                    verstehe ich das richtig, dass ich entsprechend folgendes für meinen "Play"-Befehl ansetzen müsste:

                    Play=$Play$+CRLF
                    sendtcp(6600u16,10.0.10.151,Play)
                    Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

                    Kommentar


                      #11
                      Ja und CRLF muss in der V2 noch selbst definiert werden - wie oben bei bmx
                      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                      Enertex Produkte kaufen

                      Kommentar


                        #12
                        So,

                        eher Feierabend gemacht und gerade mal direkt an den PC gegangen...

                        Was soll ich sagen

                        Es funktioniert...

                        Danke euch vielmals!!!
                        Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

                        Kommentar


                          #13
                          So, nun muss ich doch noch einmal nerven :-D

                          Also ich bin nun so weit, dass ich die Befehle senden kann und dies funktioniert auch grundsätzlich.
                          Leider muss ich aber einige Befehle mehrfach senden, bis endlich eine Aktion eintritt.

                          Gibt es für mich Unwissenden noch einen Ausdruck, den ich mitsenden muss, ausser dem CRLF?

                          Wäre jetzt schade, wenn ich 3-4 Mal eine Taste drücken muss, bis entsprechende Aktion ausgelöst würde.

                          Anbei noch mein sehr rudimentärer Code:
                          MPD1=5
                          MPD_Port=6600u16
                          MPD_Server_IP=10.0.10.151
                          MPD_Play_String=$play$+CRLF
                          MPD_Pause_String=$pause 1$+CRLF
                          MPD_Stop_String=$stop$+CRLF

                          if after(systemstart(),500u64) then {
                          MPD1=connecttcp(MPD_Port,MPD_Server_IP)
                          } endif
                          if cycle(0,20) and (MPD1==0) then {
                          closetcp(MPD_Port,MPD_Server_IP)
                          } endif
                          if after(change(MPD1) and (MPD1==7),100u64) then {
                          MPD1=connecttcp(MPD_Port,MPD_Server_IP)
                          } endif
                          if cycle(0,2) and (MPD1==2) then {
                          MPD1=connecttcp(MPD_Port,MPD_Server_IP)
                          } endif

                          if event("MPD_1_Play-0/5/0") and ("MPD_1_Play-0/5/0"==EIN) then {
                          sendtcp(MPD_Port,MPD_Server_IP,MPD_Play_String)
                          } endif

                          if event("MPD_1_Pause-0/5/1") and ("MPD_1_Pause-0/5/1"==EIN) then {
                          sendtcp(MPD_Port,MPD_Server_IP,MPD_Pause_String)
                          } endif

                          if event("MPD_1_Stop-0/5/2") and ("MPD_1_Stop-0/5/2"==EIN) then {
                          sendtcp(MPD_Port,MPD_Server_IP,MPD_Stop_String)
                          } endif
                          Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

                          Kommentar


                            #14
                            Du sollstest den Wireshark anschauen und sehen, was dort ankommt.
                            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                            Enertex Produkte kaufen

                            Kommentar

                            Lädt...
                            X