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.