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 :)

  • 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. ;-)

  • Der Code stimmt ja wahrscheinlich den Antworten nach.. Aber es gibt einfach keine Ausgabe


    habe die Rechte über


    Code
    sudo chown -R www-data:www-data /var/www
    sudo chmod -R 775 /var/www


    versucht zu setzen, stimmt das?

  • 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
  • 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.

  • Darauf sagt er wieder


    Code
    [Thu Feb 06 18:54:11 2014] [notice] Apache/2.2.22 (Debian) PHP/5.4.4-14+deb7u7 configured -- resuming normal operations
    cat: /sys/class/gpio/gpio17/value: Permission denied
  • 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: http://www.forum-raspberrypi.d…-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?

  • 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?


  • ich verzweifle

  • 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:

  • :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: