Hallo zusammen, ich habe schon einiges mit dem kleinen Raspberry Pi (Version 2) gemacht und habe bereits die GPIOs die der Kleine zu bieten hat genutzt um LEDs zu schalten bzw. Schalter einzulesen. Das Ganze erfolgt über eine Library die man auf dem Raspberry installiert. Anschließend kann man mittels Shellkommando die jeweligen GPIOs schalten. Beispielsweise würde der Befehl: >gpio 3 1 den GPIO-Pin 3 auf High (1) schalten. Mein Projket soll sein, mit dem Raspberry Pi über die GPIOs Relais zu steuern. Bedient soll das Ganze über ein Android-Smartphone werden. Ich stelle mir das so vor: Auf dem Raspberry Pi läuft ein Apache Webserver. Verbunden wird dieser über WLAN mit dem Smartphone. Auf dem Webserver liegt eine Webseite mit Buttons "Relais 1 ein/aus", "Relais 2 ein/aus", usw. Drückt man nun einen dieser Buttons, soll das jeweilige Relais ein/ausschalten. Bis dahin alles kein Problem. Aaber: Wie mache ich die Schnittstelle zwischen geklicktem Button und Shellkommando? Wie kann ich also eine Aktion "gpio 3 1" als Shellkommando ausführen, wenn vorher der Button-3 gedrückt wurde? Ich habe mir nun eine umständliche Krücke überlegt, die aber eben aus meiner Sicht zu kompliziert für diesen Fall ist: Nach dem Klick auf einen Button schreibt die Webseite (cgi über Perl/PHP) einen bestimmten Wert in eine Datei. z.B. >21 Würde bedeuten, Relais 2 soll geschaltet werden. >30 Relais 3 soll stromlos gemacht werden Ein Programm pollt im Sekundentakt nach den Inhalten dieser Datei (Endlosschleife -> schlecht!) und führt dann über system() o.ä. das Shellkommando aus. Wie würdet ihr das machen? Danke und Gruß
Hallo,
das ganze lässt sich per PHP als exec Befehl ausführen.
Dazu nimmt man:
exec("python test.py");
Das ganze läuft gut, da kann man auch Argumente mitgeben (argv[] array).
Allerdings muss der Nutzer Webserver rechte haben dieses script
auszuführen.
Python ist hier dein Freund.
Mit diesen Schlagworten kannst du mal in Google rein gehen.
Gruß
Jochen
Genau so ein Projekt habe ich vor kurzem realisiert.
Ich habe die Relais allerdings nicht direkt geschalten, sondern über
einen I/O Port Expander per I²C.
Das Webinterface wird per CGI Skript dargestellt, dort wird angezeigt
welche Relais momentan aktiv sind etc.
Per Formulareingabe werden nun die nötigen Informationen zum Steuern,
wie Relais und Port d. Relais übertragen.
Das HTML Dokument ruft beim Absenden der Formulardaten anschließend eine
CGI-Datei auf, in welcher die Parameter ausgelesen und interpretiert
werden. Für C gibt es verschiedene Bibliotheken mit denen du die GPIO
Pins angesteuern kannst (Wiring Pi meine ich). Da ich mit I²C gearbeitet
habe, verwendete ich I2c-dev.
Zur not kannst du auch in C per system("") die GPIO Befehle senden.
Gruß
Ah ok vielen Dank! Dann war ja meine Idee garnicht so daneben ;-) Also ich versuche es zunächst mal mit dem einfachen "system(gpio....)". Beim Auslesen der Werte (gute Idee!) brauche ich wahrscheinlich ein kleines Programm drum herum, was mir den Rückgabewert von gpio beim Lesen in ein brauchbares interpretierbares Format wandelt, um dieses dann im Skript auszuwerten. ( if (wert == 1) print "Relais geschaltet")... Danke
Hi,
system("") ist halt ein doch arg unsauberer Programmierstil :-).
Per #include müsste sich da eine entsprechende Bibliothek finden lassen.
Gerade wenn du den Inhalt des Webinterfaces dynamisch darstellen willst,
also anzeigen welche Relais aktiv sind, lässt sich das vermutlich mit
dem System("") nicht mehr anständig realisieren.
Als Webserver habe ich lighttpd verwendet. Ich glaube es gab anfänglich
noch ein paar Probleme bzgl. den Dateiberechtigungen, aber das lässt
sich erledigen.
Ich schaue hier mal weiterhin rein.
> system("") ist halt ein doch arg unsauberer Programmierstil
Mag sein, aber es ist einfach und funktioniert. Und darauf kommt es an.
Aus Sicherheitsgründen (falls das eine Rolle Spielt) sollte man
allerdings nicht irgendwelche Strings an den Befehl anhängen, die man
vom Internet empfangen hat. Sonst können Böse Buben damit beliebige
Systemkommandos absetzen.
Also Besser die beiden Zahlen über Internet empfangen, in Integer
Variablen ablegen (damit es auch garantier nur Zahlen sein können) und
dann damit den System Befehl zusammen basteln.
das "gpio"-Programm tut doch nichts anderes, als an ein paar Sysfs-Files
herumzufrickeln.
Das geht auch direkt in PHP, ohne dass man den ganzen fork&exec overhead
hat.
Pinnummner XXX nach /sys/class/gpio/export schreiben.
Richtung ("out","in") nach /sys/class/gpio/gpioXXX/direction
schreiben.
Input geht dann über read auf /sys/class/gpio/gpioXXX/value
Output logischerweise über write.
d.H. ein paar fopen, fread, fwrite & fertig.
Aber: das gpio-Programm ist suid-root, dein PHP wohl besser nicht. d.H.
Zugriffsrechte musst du gesondert klären.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.