UDP socket lesen

Hallo,

wie ich an einem UDP Socket was rausschreibe ist klar (USCK_SendText).
Gibt es auch ein Spezialkommando mit dem ich einen UDP Socket lese? Bzw kann mir jemand ein Beispiel geben, wie ich lese und wie ich feststelle, ob auf dem Socket ein Kommando kam.

Danke!

gros_ibou

Moin,

ich bin zwar im Büro, aber ausm Kopf würde ich sagen:

Server Socket, Cutter, Register Variable

Gruß
Jens

Hättest Du mir bei Gelegenheit (z.B. heute abend) noch ein Beispielskript?

Danke

gros_ibou

Also dazu gibt im Prinzip schon diverses hier im Forum, ansonsten in der Doku nach RegisterVariable suchen…

Prizipiell legst du nen Server Socket an (Port usw.) und dazu dann bei Bedarf einen Cutter und dann eine RegisterVariable. So bald auf dem Port etwas empfangen wird, landet das in der Registervariable und darüber wird das hinterlegte Script angetriggert welches den Inhalt dann auswertet.
Wie das aussieht hängt von deinen Daten ab die du auswerten willst …

Gruß
Jens

Ich habe einen UDP Socket angelegt und übergebe die empfangenen Daten einer RegisterVarariblen.
Diese Variable triggert das beigefügte Script
(Sorry, bin kein PHP Profi und immer für Verbesserungsvorschläge dankbar).


<?php
// Ventos Lüftungsüberwachung
// Empfangener Datensatz von Ventos UDP Port via RegisterVariable:
// MSW=004;THH=007;TMM=050;TSS=019;DYY=011;DMM=003;DDD=013;DDW=007;FAN=B;TFO=+26.4;TAU=+26.8;TAB=+26.8;TZU=+26.5;TR1=-99.9;TR2=-99.9;<cr><lf>

if ($IPS_SENDER == "RegisterVariable")                                          // über Register Var ausgeführt
{
  if ($IPS_INSTANCE == 36782 /*[Wohnen\Lüftung\Hidden\LU RegVar UDP]*/)
  {
    $Data  = RegVar_GetBuffer($IPS_INSTANCE);                                   // im Puffer der Instanz vorhandene Daten in $data kopieren
    $Data .= $IPS_VALUE;                                                        // neu empfangene Daten an $data anhängen
    $CRLF  = "
";
    if (strpos($Data, $CRLF))                                                   // wenn das Trennzeichen CRLF in $data gefunden worden ist
    {
      $DataSets = explode($CRLF, $Data);                                        // $data in durch CRLF separierte Datensätze zerlegen
      for ($i = 0; $i < count($DataSets) - 1; $i++)                             // alle nicht durch CRLF terminierten Datensätze ausgeben
      {
        echo "[".IPS_GetLocation($IPS_INSTANCE)."] ".$DataSets[$i]."
";
        $Pair	= explode(';', $DataSets[$i]);                                  // Datensätze trennen
        for ($j = 0; $j < count($Pair) - 1; $j++)
        {
          $VarVal	= explode('=', $Pair[$j]);                              // InVariable und Wert trennen
          for ($k = 0; $k < count($VarVal) - 1; $k++)
          {
            switch ($VarVal[$k])
            {
              case "MSW": $MSW = (int)$VarVal[$k+1];                            // MainSwitch
                          break;
              case "THH": $THH = (int)$VarVal[$k+1];                            // TimeHour
                          break;
              case "TMM": $TMM = (int)$VarVal[$k+1];                            // TimeMinute
                          break;
              case "TSS": $TSS = (int)$VarVal[$k+1];                            // TimeSecond
                          break;
              case "DYY": $DYY = (int)$VarVal[$k+1];                            // DateYear
                          break;
              case "DMM": $DMM = (int)$VarVal[$k+1];                            // DateMonth
                          break;
              case "DDD": $DDD = (int)$VarVal[$k+1];                            // DateDay
                          break;
              case "DDW": $DDW = (int)$VarVal[$k+1];                            // DateDayOfWeek
                          break;
              case "FAN": $FAN = $VarVal[$k+1];                                 // Ventilatoren
                          break;
              case "TFO": $TFO = $VarVal[$k+1];                                 // Temperatur Fortluft
                          break;
              case "TAU": $TAU = $VarVal[$k+1];                                 // Temperatur Aussenluft
                          break;
              case "TAB": $TAB = $VarVal[$k+1];                                 // Temperatur Abluft
                          break;
              case "TZU": $TZU = $VarVal[$k+1];                                 // Temperatur Zuluft
                          break;
              case "TR1": $TR1 = $VarVal[$k+1];                                 // Temperatur Reserve 1
                          break;
              case "TR2": $TR2 = $VarVal[$k+1];                                 // Temperatur Reserve 2
                          break;
              case "STA": $STA = $VarVal[$k+1];                                 // Status rebooted : BOT, running : RUN
                          break;
            }
          }
        }
        if (isset($THH))
        {
          $SYTime = time();
          $LUTime = mktime((int)$THH, (int)$TMM, (int)$TSS, (int)$DMM, (int)$DDD, (int)$DYY);
          $TimeDiff = abs($SYTime - $LUTime);
          setvalue(23207 /*[Wohnen\Lüftung\Zeitdifferenz in Sekunden]*/, $TimeDiff);
        }
        if (isset($MSW))
        {
          $MSW = substr($MSW,-1);
          setvalue(34123 /*[Wohnen\Lüftung\Stufe]*/,$MSW);
        }
        if (isset($FAN))
        {
          switch ($FAN)
          {
            case "Z": setvalue(42844 /*[Wohnen\Lüftung\Zuluftventilator]*/,true);
                      setvalue(31716 /*[Wohnen\Lüftung\Abluftventilator]*/,false);
                      break;
            case "F": setvalue(42844 /*[Wohnen\Lüftung\Zuluftventilator]*/,false);
                      setvalue(31716 /*[Wohnen\Lüftung\Abluftventilator]*/,true);
                      break;
            case "B": setvalue(42844 /*[Wohnen\Lüftung\Zuluftventilator]*/,true);
                      setvalue(31716 /*[Wohnen\Lüftung\Abluftventilator]*/,true);
                      break;
          }
        }
        if (isset($TFO)) {setvalue(32137 /*[Wohnen\Lüftung\Temperatur Fortluft]*/,$TFO);}
        if (isset($TAU)) {setvalue(44197 /*[Wohnen\Lüftung\Temperatur Aussenluft]*/,$TAU);}
        if (isset($TAB)) {setvalue(29813 /*[Wohnen\Lüftung\Temperatur Abluft]*/,$TAB);}
        if (isset($TZU)) {setvalue(51191 /*[Wohnen\Lüftung\Temperatur Zuluft]*/,$TZU);}
        if (isset($TR1)) {setvalue(24327 /*[Wohnen\Lüftung\Temperatur Reserve 1]*/,$TR1);}
        if (isset($TR2)) {setvalue(19245 /*[Wohnen\Lüftung\Temperatur Reserve 2]*/,$TR2);}
        if (isset($STA))
        {
          if ($STA == "BOT")
          {
            setvalue(30070 /*[Wohnen\Lüftung\Status]*/,$STA);
          }
        }
      }
      $Data = $DataSets[count($DataSets) - 1];                                  // $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
    }
    RegVar_SetBuffer($IPS_INSTANCE, $Data);                                     // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
  }
}
?>

Erwin

Danke,

werd mich dann morgen mal damit befassen.

Zum gleichen Thema: Gibts irgendwo eine Doku wie der Cutter genau funktioniert. Ich find da nichts

Gruss

gros_ibou