PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Webinterface für Relaiskarte realisieren



Oli82
09.01.07, 21:24
Hallo!

Ich plane grade ein Webinterface mit PHP zu realisieren, dass eine seriell angeschlossene Relaiskarte steuern und auslesen soll.
Da ich recht wenig Linuxerfahrung habe, habe ich keinerlei Ahnung, wie ich das realisieren soll.

Für das schalten und auslesen habe ich in C++ jeweils ein Programm geschrieben, dass die Funktion des Schaltens (switch.cpp) und des auslesens (read.cpp) übernimmt.

Zum System:

- Als System nutze ich einen 166MHz PC mit Touchscreen.
- Als BS läuft DSL 3.0 (Damn Small Linux) mit 2,4er Kernel in der Grundinstallation
- Als Relaiskarte nutze ich (wegen der Kaskadierung) die serielle Variante der Conrad Karte

Nun zu meinen Fragen:

Ich muss nun noch alles installieren um das Webinterface erstmal zum laufen zu bekommen. Ich dachte mir Lampp zu installieren, da es alles mit sich bringt und ziemlich einfach ist.

In was muss ich die .cpp Dateien kompilieren, damit sie einfach unter Linux laufen?

Wie übergebe ich in php die Befehle, die die Programme dann entgegen nehmen?

Wie realisiere ich es, dass die Programme die Rückgabewerte der Relaiskarte an php übergeben und diese angezeigt werden?

Hoffe, mir kann jemand weiter helfen.
Danke

marce
09.01.07, 21:38
ich würde Dir erst mal empfehlen, Dich selbst ein bisserl mit php und Programmierung unter Linux auseinanderzusetzen - und zwar Stück für Stück. So eine rundumglücklich-Antwort wie Du sie hier gerade haben willst können wir hier glaube ich nicht liefern. Konkrete Einzelprobleme gerne...

oracle2025
10.01.07, 10:39
Sind die cpp Dateien unter Linux programmiert worden? Falls nein, ist es fraglich ob die sich so überhaupt übersetzen lassen, da die APIs für die serielle Schnittstelle vermutlich plattform-spezifisch sind.

Oli82
10.01.07, 10:51
Hallo!

Die Programmierung habe ich unter Windows gemacht, aber so, dass es unter Linux laufen müsste. Hab es nach diesem Howto gemacht: LINK (http://en.tldp.org/HOWTO/Serial-Programming-HOWTO/)

Hab das Lese und Schreibe Programm nun in einer .cpp zusammen gefasst

Als Übergabewerte werden "Initialisierung" "Comport" "Nummer der Relaiskarte (Bei Kaskadierung)" "Aktion (also Relais1 mache das, Relais2 mach dies..." und "Status aller Relais" benötigt, die das php Script verarbeiten soll.

SirSydom
10.01.07, 14:58
Also eigentlich wäre das recht einfach zu realisieren.

Dein cpp musst du mit dem gcc kompilieren. Ob und wie das hinhaut - ka. Probiers aus.

Dann solltest du dein Programm so schreiben, das es Übergabeparamter aktzeptiert, zB so "switchrelais <relaisnum> on|off" also zb "switchrelais 5 off"
Dann setzt du dir einen Webserver auf (zb Apache2) und dazu eine Skriptsprache für den Webserver. (zB php oder perl, bei apache2 mit debian: libapache2_mod_php4/5).

Ein einfach PHP-Skirpt mit dem du dann schalten könntest würde so aussehen:


<php
// relais.php

// Überprüfen ob übergebene Variablen korrekt sind

system('/pfad/switchrelais ' . $_GET['num'] . ' ' . $_GET['mode']);
?>

schalten würdest du dann durch den Aufruf "http://192.169.0.1/relais.php?num=4&mode=on"

Eventuell (weiß ich nicht) braucht das Programm root-Rechte für die serielle Schnittstelle.
Dazu solltest du dir sudo einrichten und es so einrichten, das der apache2 DIESES spezielle Programm /pfad/switchrelais mit root rechten ausfürehn darf. Dann musst du dem systemaufruf ein sudo voranstellen, zB


<php
// relais.php

// Überprüfen ob übergebene Variablen korrekt sind

system('sudo /pfad/switchrelais ' . $_GET['num'] . ' ' . $_GET['mode']);
?>



Es gibt noch zig andere Wege, ich denke aber dieser ist recht einfach.
Du könntest zB einen eigene Webserver schreiben (einen kleinen) den du in dein Programm integrierst, oder die serielle Schnittstelle direkt aus Perl oder PHP ansprechen (möglicherweise geht das ja?).

Oli82
10.01.07, 16:16
Danke für die Antwort. Das bringt mich um einiges weiter.

Da ich ja DSL Linux nutze, was ja auf knoppix aufbaut, gibt es schon den sudo und somit entfällt das.

Werde heute abend mal den webserver aufsetzen und dann gleich mal ans testen gehen.

Da ich die Relaiskarte immer Initialisieren muss, bevor ich schalten kann, muss ich mir noch was überlegen.

Ich brauche ja mindestens 3 Variablen, um die Relais schalten zu können. Also müsste ich mein Programm und das php script so erweitern, dass ich es so aufrufe:


<php
// relais.php

// Überprüfen ob übergebene Variablen korrekt sind

system('sudo /pfad/switchrelais ' . $_GET['card'] ' . $_GET['num'] . ' ' . $_GET['mode']);
?>


". $_GET['card'] " brauche ich dann, um die Relaiskarte zu wählen. oder?

Die Variablen card, num und mode müssen im programm genauso heißen, oder lieg ich da falsch?

SirSydom
10.01.07, 18:31
$_GET['card'] brauchst du wenn du mehrere relaiskarten hast die jeweils wieder mehrere relais zum schalten haben.

es ist *völlig* egal wie die parameter im php-Skript und im C-Programm heißen. Wichtig ist nur, das die Reihenfolge stimmt.

In PHP werden Variablen $ vorangestellt. Die Variable $_GET ist ein (Hash-)Array, das alle per Get übergebenen Parameter enhält.

Wenn du das Beispiel Skript von dir mit switchrelais.php?card=3&num=7&mode=on aufrufst würde das $_GET Array so asusehen:

$_GET = array ('card' => 3, 'num' => 7, 'mode' => 'on');

$_GET['card'] == 3.

Der String, des system übergeben wird lautet dann:
"/pfad/switchrelais 3 7 on".
Ich meine in C spricht du die dann mit:
ARGV[1], ARGV[2] und ARGV[3] an.

Auch wenn sudo bereits eingerichtet ist, der user, unter dem der webserver läuft muss die rechte zugewiesen bekommen, etwas so (mit visudo):

webserveruser ALL= NOPASSWD: /pfad/switchrelais