Forum: Mikrocontroller und Digitale Elektronik Raspberry PI mit Webinterface


von Kranig (Gast)


Lesenswert?

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

von Ernstl (Gast)


Lesenswert?

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.

von Kranig (Gast)


Lesenswert?

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?

von Harry L. (mysth)


Lesenswert?

Kranig schrieb:
> Da gibt es doch bestimmt eine Lösung für?

Steht doch oben: NodeRed

von Kranig (Gast)


Lesenswert?

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

von Tilo R. (joey5337) Benutzerseite


Lesenswert?

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)

von Ernstl (Gast)


Lesenswert?

Dann sollte Fast-cgi Deine Lösung sein. Damit läuft das cgi permanent 
und reagiert auf die Anfragen.

von M.K. B. (mkbit)


Lesenswert?

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.

von Daniel B. (dbuergin)


Lesenswert?

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

von Kranig (Gast)


Lesenswert?

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.

von M.K. B. (mkbit)


Lesenswert?

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
Noch kein Account? Hier anmelden.