GPIO über PHP setzen/auslesen

  • Hallo, zuerstmal ich bin absoluter PI neuling, habe aber Erfahrung in Sachen HTML, Javascript und ein wenig PHP.

    Ich habe damit angefangen Raspbian, Apache Webserver und PHP5 zu installieren, was auch geklappt hat.

    Jetz möchte ich die GPIO's testen. Dazu habe ich folgendes in die console getippt:


    Code
    echo "17" > /sys/class/gpio/export
    
    
    echo "out" > /sys/class/gpio/gpio17/direction
    
    
    echo "1" > /sys/class/gpio/gpio17/value

    danach habe ich mit

    Code
    cat /sys/class/gpio/gpio17/value


    getestet, es wurde "1" angezeigt. Soweit so gut.
    Nun wollte ich das ganze über den Webserver mit PHP abfragen und habe eine test.php datei erstellt.

    und habe das:

    PHP
    <?php
    
    
      file_get_contents("/sys/devices/virtual/gpio/gpio17/value");
    
    
    ?>


    und das:

    trim(@shell_exec("cat
    /sys/class/gpio/gpio17/value"));


    getestet. Aber beides mal ist nichts passiert... PHP funktioniert aber (echo "Hello"; geht)


    Woran liegts? Fehlen da irgendwelche Rechte o.ä?

    Danke :)

    Einmal editiert, zuletzt von marcsterlabs (4. Februar 2014 um 23:11)

  • PHP
    <?php
    
    
      $value = file_get_contents("/sys/devices/virtual/gpio/gpio17/value");
      echo $value;
    ?>
    PHP
    <?php
       $value = trim(@shell_exec("cat /sys/class/gpio/gpio17/value"));
      echo $value;
    ?>

    So gehts mit beidem. ;)

  • N'Abend auch,

    ich würde mal in den Apache-Log schauen ... wenn keine Ausgabe erfolgt ist der oft ein PHP-Fehler und der wird in der Apache-Log protokolliert.
    Desweiteren: kann es sein, dass die Files (maps) nur als root gelesen werden können ...

    ciao,
    -ds-

  • Um das nochmal zusammen zu fassen. Ich habe Raspbian installiert, apache2 und php5 installiert.
    Danach dieses php file hochgeladen

    PHP
    <?php
    
    
     $value = exec('sudo cat /sys/class/gpio/gpio17/value');
      echo "GPIO17:" .$value;
      
    ?>

    und es passiert nichts außer der Ausgabe "GPIO17:"


    Im Log File steht:

    Code
    cat: /sys/class/gpio/gpio17/value: Permission denied

    Einmal editiert, zuletzt von marcsterlabs (6. Februar 2014 um 19:09)

  • Versuch noch mal die Rechte für die Datei zu setzen:

    Code
    sudo chmod 666 /sys/class/gpio/gpio17/value

    Danach sollte das gehen, lass aber das "sudo" im exec weg.

  • Wenn du in deinem PHP Script 'sudo' benutzt dann musst du dem www-data Benutzer auch erlauben sudo zu verwenden... Das würde ich dir aber nicht empfehlen da das ein großes Sicherheitsrisiko wäre

    Such mal oben rechts über die Forumsuche nach sudowebscript

    Ich wiederhol das ungerne 100x immer wieder, aber ich mach jetzt trotzdem noch mal:

    • Script erstellen, in dem Befehle definiert sind:
      nano /var/sudowebscript.sh


      Anschließend Script ausführbar machen: chmod +x /var/sudowebscript.sh

    • visudo ausführen und folgendes eintragen:
      (wenn du anstatt vi lieber nano ntzen willst dann führ ein malig export EDITOR=nano aus)

      Code
      www-data ALL=NOPASSWD:/var/sudowebscript.sh
    • PHP Script anpassen:
      [code=php]<?php
      # RaspberryPI Rev1 GPIO pin's
      $GPIO["1"] = "0,1,4,17,21,22,10,9,11,18,23,24,25,8,7";
      # RaspberryPI Rev2 GPIO pin's
      $GPIO["2"] = "2,3,4,17,27,22,10,9,11,18,23,24,25,8,7";

      # get RaspberryPI Revision
      exec('sudo /var/sudowebscript.sh rpirev', $output, $error);
      $RPIrevision = $output[0];

      foreach (explode(",",$GPIO[$RPIrevision]) AS $pin) {
      if (file_exists("/sys/class/gpio/gpio".$pin."")) {
      $fontcolor="009900";
      $Direction = exec("sudo /var/sudowebscript.sh getdirection ".$pin."");
      $Value = exec("sudo /var/sudowebscript.sh getvalue ".$pin."");
      echo "GPIO ".$pin.": ".$Value." (".$Direction.")<br/>\n";
      }
      }
      ?>
      [/php]

    Siehe dazu ggf auch: GPIO Ports Konfigurieren

  • Ja hab mir auch gedacht, dass es verweigert wird :D nur nicht wie ich da was dran ändern kann. Sorry bin blutiger Anfänger hier und ist als würde ich hier chinesisch lesen

    Ich bin jetz dennoch noch verwirrt. Natürlich kann ich das ganze ohne 'sudo' machen. Brauche ich dann das sudowebscript auch?
    Liegt es im Endeffekt nicht irgendwo an den Rechten, bei anderen gings ja auch ohne :/

    Und wozu ist WiringPi dann gut? Eine Vereinfachung der Befehle?

    Einmal editiert, zuletzt von marcsterlabs (6. Februar 2014 um 20:55)

  • Tja mien jong ;) ...


    nu mach das mal so wie meigrafd das gesagt hat.
    Die wiringPi funktioniert in einigen Fällen auch ohne sudo ... ist zugegebenermassen ein bisschen verwirrend das Ganze.
    Ausserdem: wie willst Du sonst auf IIC, SPI, LCDs ... zugreifen bzw. diese Komponenten ansprechen ;) ...
    Was sonst noch so geht steht übrigens in der Doku inkl. den Beispielen auf der Homepage.


    so long,
    -ds-

    • visudo ausführen und folgendes eintragen:
      (wenn du anstatt vi lieber nano ntzen willst dann führ ein malig export EDITOR=nano aus)
      Code: Alles markieren

      Code
      www-data ALL=NOPASSWD:/var/sudowebscript.sh


    sagt er:

    Code
    pi@raspberrypi ~ $ www-data ALL=NOPASSWD:/var/sudowebscript.sh
    -bash: www-data: command not found


    Wie muss ich das visudo ausführen?

  • Hi,

    nu sag mal ... was machst Du denn da? Das hat doch nichts mit visudo zu tun ...


    etwas verwirrt :s
    -ds-

  • Um das ganze nochmal zusammen zu fassen, um zu verstehen was ich da veranstalte:

    Einen Fabrikfrischen Pi genommen, einmal Raspbian, Apache2 und PHP5 installiert.


    Code
    echo "17" > /sys/class/gpio/export
    
    
    echo "out" > /sys/class/gpio/gpio17/direction
    
    
    echo "1" > /sys/class/gpio/gpio17/value
    
    
    sudo chmod 666 /sys/class/gpio/gpio17/value


    ausgeführt.

    Eine PHP im var/www ordner erstellt welche wie folgt aussieht:


    PHP
    <?php
    
    
     $value = exec('sudo cat /sys/class/gpio/gpio17/value');
      echo "GPIO17:" .$value;
     
    ?>


    Rufe ich die Datei auf sagt der Apache2 log:


    Code
    cat: /sys/class/gpio/gpio17/value: Permission denied


    Danach habe ich das sudowebscript.sh erstellt


    Code
    nano /var/sudowebscript.sh


    darin steht:

    danach

    Code
    chmod +x /var/sudowebscript.sh


    ausgeführt

    danach

    Code
    visudo


    ausgeführt

    irgendwo

    Code
    www-data ALL=NOPASSWD:/var/sudowebscript.sh


    eingetragen


    Danach meine PHP datei editiert zu:


    Die Ausgabe sieht so aus:


    Danke für eure Hilfe, weiß ich wirklich zu schätzen!
    :danke_ATDE:

    Einmal editiert, zuletzt von marcsterlabs (7. Februar 2014 um 08:39)

  • :blush:

    Ich muss gestehen das ich gerade auch nicht versteh wieso das nicht geht... :s

    Code
    root@raspberrypi:/var/www# php -f g.php                  
    GPIO 17: 1 out<br/>
    root@raspberrypi:/var/www# sudo -u www-data php -f g.php
    root@raspberrypi:/var/www# 
    root@raspberrypi:/var/www# sudo -u www-data sudo /var/sudowebscript.sh getvalue 17         
    1
    root@raspberrypi:/var/www# 
    root@raspberrypi:/var/www# php -r 'if (file_exists("/sys/devices/virtual/gpio/gpio17")) { echo "99 "; }'
    99 root@raspberrypi:/var/www# sudo -u www-data php -r 'if (file_exists("/sys/devices/virtual/gpio/gpio17")) { echo "99 "; }' 
    root@raspberrypi:/var/www#

    g.php:
    [code=php]
    <?php
    error_reporting(E_ALL);
    ini_set('track_errors', 1);
    ini_set('display_errors', 1);
    ini_set('log_errors', 1);

    # RaspberryPI Rev1 GPIO pin's
    $GPIO["1"] = "0,1,4,17,21,22,10,9,11,18,23,24,25,8,7";
    # RaspberryPI Rev2 GPIO pin's
    $GPIO["2"] = "2,3,4,17,27,22,10,9,11,18,23,24,25,8,7";

    # get RaspberryPI Revision
    exec('sudo /var/sudowebscript.sh rpirev', $output, $error);
    $RPIrevision = $output[0];

    foreach (explode(",",$GPIO[$RPIrevision]) AS $pin) {
    // if (file_exists("/sys/devices/virtual/gpio/gpio".$pin."")) {
    $fontcolor="009900";
    $Direction = exec("sudo /var/sudowebscript.sh getdirection $pin");
    $Value = exec("sudo /var/sudowebscript.sh getvalue $pin");
    echo "GPIO ".$pin.": ".$Value." ".$Direction."<br/>\n";
    // }
    }
    ?>
    [/php]

    Kommentiert man die if (file_exists("/sys/devices/virtual/gpio/gpio".$pin."")) { Schleife aus, funktionierts.... Aber wieso kann www-data neuerdings nichtmals mehr prüfen ob die Datei existiert? :-/

  • Ich hab die Kuriosität entdeckt:

    Es gibt eine extra Benutzergruppe für den Zugriff auf GPIO, dessen Mitglied bereits der ' pi ' Benutzer ist -> gpio

    Damit der www-data Benutzer also auch prüfen kann ob die Datei existiert muss man den Benutzer zur Gruppe gpio hinzufügen und anschließend apache2 neu starten:

    Code
    usermod -G gpio -a www-data
    
    
    /etc/init.d/apache2 restart

    Dann funktioniert auch die g.php inkl. if Schleife:

    Spoiler anzeigen

    Durch diesen Fix brauch man dann auch kein sudo mehr :)

    Code
    root@raspberrypi:/var/www# su -l www-data -c "echo in > /sys/class/gpio/gpio17/direction"    
    root@raspberrypi:/var/www# su -l www-data -c "php -f g.php"                                       
    GPIO 17: 0 in<br/>
    root@raspberrypi:/var/www#

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!