Guten Tag, ich möchte Peripherie, die an meinem RPi angeschlossen ist, über ein Webinterface steuern. Dabei möchte ich auch mit AJAX arbeiten um die Webseite nicht immer neu laden zu müssen. Unter anderem habe ich ein Motor angeschlossen, der letztendlich über ein C Programm gesteuert werden soll. Dabei kann es bei AJAX ja durchaus passieren, dass ein Befehl öfters gesendet wird oder ein neuer Befehl gesendet wird, obwohl der erste noch nicht komplett ausgeführt wurde. Wie wird so etwas gehandhabt? Beste Grüße A. Kranig
Wenn Du schnell was erreichen willst: Node-Red und das dazugehörige UI. Da kannst Du Dir die Ein- und Ausgänge einfach zusammenklicken. Allerdings braucht es recht viel Ressourcen, eine Prozessorlast von 8% im Idle ist normal.
Danke für die Antwort. Tatsächlich stehe ich nur vor dem Problem, dass ich nicht mehrere CGI Programme starten will, die das gleiche machen, nur weil der User öfters auf "Update Motorposition" gedrückt hat. Gleichzeitig weiß ich aber auch nicht genau wann das CGI Programm fertig ist. Da gibt es doch bestimmt eine Lösung für?
>>Kranig schrieb: >> Da gibt es doch bestimmt eine Lösung für? > >Steht doch oben: NodeRed > Danke für die Antwort. Sollte eigentlich implizieren, dass ich bereits seine Antwort aktiv gelesen habe :S
Das serverseitige CGI kann ja eine Rückmeldung geben, d.h. der Ajax-Call bekommt einen Response-Handler. Client-seitig (d.h. im Browser) kannst du den Knopf ja sperren, bis diese Rückmeldung da ist. Alternativ das versenden neuer Requests sperren (das ist User-Interface-mäßig nicht so toll, weil der User dann einen Knopf drücken, aber sich nicht mehr drauf verlassen kann, dass da auch eine passende Aktion kommt)
Dann sollte Fast-cgi Deine Lösung sein. Damit läuft das cgi permanent und reagiert auf die Anfragen.
Tilo R. schrieb: > Client-seitig (d.h. im Browser) kannst du den Knopf ja sperren, bis > diese Rückmeldung da ist. Das geht aber nur bei einem Browser. Hat man mehrere Nutzer, dann müsste man die gegeneinander verriegeln. Was du wahrscheinlich brauchst ist eine Art Zustandsautomat im Server, der deine Befehle per Ajax bekommt. Wenn ein Befehl nicht erlaubt ist gibt es die entsprechende Rückmeldung.
Eine fertige Lösung wurde Dir schon genannt, nämlich NodeRED. Wenn Du kein solches Framework benutzen willst, bleibt Dir nichts anderes übrig als es selber zu programmieren. Heist Webpages in HTML mit integriertem Javascript Code (Ajax ist ein Javascript Framework) erstellen. Dazu den Serverside Teil scripten (muss ein aktives Stück Software sein, welches Deine Ajax Calls entgegennimmt). Ich habe meinen Serverside Teil mit GO (golang.org) gebaut, der liefert auch gleich die statischen HTML-Seiten (mit Templating) aus. Ich brauche dazu also keinen Apache-Webeserver oder ähnliches mehr. Ich hoffe, Du hast Dich schon mit statischen Webseiten beschäftigt, damit Du das Zusammenspiel von Browser, Webserver und Server seitigen Scripten begriffen hast ? Ansonsten wird das Ganze eine verwirrende Angelegenheit :-)
Hey, danke für eure Antworten. So ähnlich wollte ich es machen, aber eine Sache ist mir dabei nicht klar: Angenommen ich habe ein einfachen AJAX Request, dann sende ich diesen ja gegen eine konkrete Datei ab. Üblicherweise wäre das ein PHP-Skript, der die Informationen entgegennimmt, verarbeitet und dann vielleicht noch ein JSON, HTML oder Plain Text Output erzeugt, welcher wiederum vom JavaScript genutzt werden kann. Das PHP Skript ist danach doch beendet. Wenn ich nun aber eine ausführbare Datei dort liegen habe, so wird bei jedem betätigen des Buttons ein neuer Prozess gestartet. Aber das will ich ja gar nicht? Die einzige Möglichkeit die ich jetzt sehe, ist, dass ich den Button nach dem betätigen deaktiviere, das Programm aufrufe, auf das Ende warte und den Button wieder freigebe, aber wie M.K. B. schon sagte klappt das bei mehr als einem Browser schon nicht mehr. Ich werde mir mal etwas über FastCGI durchlesen. Vielleicht ist das eine Antwort.
Das was du mit Datei meinst ist ja nur ein Pfad zu irgendwas (URL), da muss keine Datei dahinter sein. Ein Webserver (z.B. Apache) macht das bei PHP in etwas so. Auf einem Port wartet dieser auf Anfragen. Die Funktion in Apache sucht dann die entsprechende Datei heraus und interpretiert das PHP darin. In der Regel läuft das in einem eigenen Thread des Webservers ab, damit parallel noch andere Anfragen beantwortet werden können. Was du brauchst ist ein Programm (Webserver), der bei einer bestimmten URL eine Funktion aufruft. Dazu gibt es auch schon Frameworks (ich kenne gerade aber keine für den Raspberry und mit FastCGI habe ich nie gearbeitet). Dein Ajax Request (HTTP GET/POST) wird also auf die Funktion gemappt. Diese Funktion macht dann die gewünschten Änderungen und erzeugt das Ergebnis, also entweder eine Seite oder auch JSON Daten oder nur einen Statuscode. Wenn die Funktion auf gemeinsame Resourcen zugreift (was bei dir sicher der Fall ist), dann musst du diese entsprechen durch Locks oder ähnliches Synchronisieren. Dann gibt es in deinem Webserver noch Pfade, die direkt auf Dateien gemappt sind und nur diese Dateien ausliefern. Damit lieferst du dann deine Startseite, Scripte und Bilder aus. Noch ein Tipp: Mach dich mit den Debug Tools deines Browsers vertraut. Dort kann du dann die Anfrage und Antwort der Ajax Requests gut sehen. Und aus Erfahrung kann ich sagen, dass der Einstieg aus der Mikrcontrollerwelt schwierig sein kann, aber am Ende lohnt es sich, wenn es dann mit jedem Browser auf PC oder Smartphone geht.
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.