Programmierung Raspberry Pi

Kommunikation zwischen PHP und C via Unix Domain Sockets

In vielen Anwendungen ist es notwendig Parameter oder andere Nutzdaten von einer Programmiersprache in eine andere zu übergeben. Dabei greift man oftmals auf eine Dateischnittelle oder eine Datenbank zurück: Die zu übergebenden Daten werden in eine Textdatei oder Datenbank geschrieben und aus der anderen Programmiersprache heraus greift man dann darauf zurück. Dieser Weg ist relativ umständlich, zeitintensiv und im Zusammenhang mit Einplatinencomputern recht ressourcen-beanspruchend.

Im Falle des Raspberry Pi und Banana Pi sind Monitoring-Aufgaben beliebte Einsatzgebiete. Dabei ist eine Steuerung und Visualisierung in einem Webinterface immer wünschenswert. Ich persönlich schreibe meine (Steuer-) Programme gerne in C/C++ und nehme über ein Webinterface die Visualisierung bzw. Programmsteuerung vor. Die Kommunikation wird mittels einem Unix Domain Socket vorgenommen. Im nachfolgenden möchte ich ein Beispiel vorstellen. Dabei setze ich ein gewisses Vorwissen und Grundkenntnisse in Sachen HTML, PHP und C voraus. Fragen beantworte ich gerne in den Kommentaren 🙂

Client

Das Webinterface stellt in unserer Kommunikationsstrecke den Client dar, von dem aus Nachrichten und Befehle an den Server versendet werden. Der Client besteht der Einfachheit halber nur aus einem simplen Formular- Beim Absenden wird das eingegebene Kommando via PHP über ein Unix Domain Socket versenden. Anschließend wird noch eine Antwort vom Server empfangen uns ausgegeben.

client.php

Server

Mit Hilfe einer C-Anwendung erstellen wir einen Server, der die Anfragen von unserem Webinterface entgegen nimmt. Der Server wird ebenfalls an ein Unix Domain Socket gebunden und lauscht an diesem. Der Einfachheit halber nehmen wir hier nur den vom Webformular gesendeten Inhalt entgegen, geben diesen aus und senden ihn zurück.

Um den Codeschnippsel in der Praxis einzusetzen wäre es denkbar, einen Befehl den man eigentlich im Terminal absetzt, zu übergeben, auszuführen und die Antwort zurückzusenden. Gleichzeitig kann man sich eigene Kommandos definieren und die Aktion des Servers darauf festlegen. Auf Basis des Codeausschnittes ist also angefangen von einer webbassierten Konsole sehr viel möglich.

Die einzelnen Bedeutungen des Quelltextes sind im Code mit einem Kommentar grob beschrieben. Gerne beantworte ich Fragen in den Kommentaren.

server.c

Test

Jetzt testen wir die Kommunikations zwischen PHP und C mittels Unix Domain Socket. Dazu muss euer Einplatinencomputer (zum Beispiel Raspberry Pi und Banana Pi) über einen Webserver mit PHP verfügen. Ich verwende für das Beispiel den Apache Webserver. Die Dateien client.php und server.c habe ich in das Verzeichnis /var/www gelegt.

Über den Webbrowser deiner Wahl ruft man die IP-Adresse des Einplatinencomputers auf und navigiert zur client.php . Außerdem melden wir uns via SSH oder per Remote Desktop am Pi an. Im Terminal wechseln wir in das Verzeichnis des Webservers.

cd /var/www

Dort liegt der Quellcode unseres Servers. Diesen kompilieren wir jetzt und starten ihn.

gcc -o server server.c
./server

Der Server wartet nun auf eine eingehende Verbindung.

Screenshot SSH

Screenshot SSH

Über das Formular auf unserem kleinen Webinterface senden wir nun einen Befehl, zum Beispiel Hallo. Mit dem Klick auf Senden wird die eingegebene Nachricht an den Server gesendet. Dieser gibt das Kommando aus, sendet die Ausgabe ebenfalls an die client.php zurück und wartet auf die nächste Verbindung.

Screenshot SSH

Screenshot SSH

Quellen (Stand: 24.11.14): Wikipedia, php.net – stream-socket-client, php.net – Unix Domain: Unix and UDG, Troy D. Hanson

Über den Autor

Tony

Ich bin Tony, begeistert von Einplatinencomputer und berichte über meine Erfahrungen und Projekte mit dem Raspberry Pi, Banana Pi und anderen Minicomputern.

Hinterlasse eine Antwort

Kommentar

  • Hilft mir gerade sehr bei der Implementierung in mein eigenes System. Es ist immer praktisch wenn man sich an einem funktionierenden Beispiel entlang hangeln kann. Vielen Dank dafür!