© AlesiaKan/Shutterstock.com
PHP goes Hardware

Arduino an PHP


PHP direkt auf einem Mikrocontroller auszuführen, ist auch heute nur den schwer handhabbaren kombinatorischen Systemen wie dem ATM32MP1 aus dem Hause STMicroelectronics vorbehalten – er kann auf seiner Linux-Partition eine PHP-Installation hosten. Das bedeutet allerdings nicht, dass man nicht kreative Umwege gehen kann.

Als Entwickler vor einigen Jahren erste Versuche im Bereich der Ausführung von Python und JavaScript auf Mikrocontrollern durchführten, lachten die Auguren. Zu gering die damals verfügbare Rechenleistung, und zu schlecht die Performance – der alte Kalauer, dass ein Garbage Collector der Echtzeitfähigkeit nicht zuträglich ist, gilt nun mal universell. Die direkte Ausführung von PHP am Mikrocontroller ist derzeit noch nicht möglich. Möchten Sie über PHP-Webseiten allerdings mit Hardware interagieren, so ist das durchaus möglich. In diesem Artikel stelle ich die einfachere Variante vor und gehe auf Grenzen, Möglichkeiten und Ausbaustufen ein.

Ein Blick ins Pleistozän

Die Einführung des Arduino Yun war in vielerlei Hinsicht ein technischer Quantensprung – besonders relevant dafür war das in Abbildung 1 gezeigte Konzept des kombinatorischen Prozessrechners.

hanna_arduino_php_1.tif_fmt1.jpgAbb. 1: Der Arduino Yun kombinierte zwei verschiedene Prozessorkerne

Während WLAN-Kommunikation, HTTP-Protokollverarbeitung und Co. auf einem unter Linux laufenden Hochleistungsmikrocontroller abgearbeitet wurden, stand dem Anwender zusätzlich der von klassischen Arduino Uno bekannt Atmel-Achtbitter zur Verfügung, auf dem sich echtzeitkritische oder sonstwie haarige Hardwareinteraktionsaufgaben implementieren ließen. Über eine als Bridge bezeichnete Bibliothek konnten die beiden Prozessoren dann Informationen untereinander austauschen, was das Konzept des kombinatorischen Prozessrechners hinreichend beschreibt. Bei direkter, also über ein USB-Kabel zwischen PHP-Server und Prozessrechner erfolgender Kommunikation finden wir im Prinzip dasselbe Designparadigma. Es kommt nur statt der Bridge-Bibliothek das mittlerweile in einer Vielzahl von Forks vorliegende PHP-Serial-Modul zum Einsatz. Das erlaubt der PHP-Applikation den Zugriff auf die serielle Schnittstelle der Workstation, über die der PHP-Code mehr oder weniger beliebige Kommandos in Richtung des angeschlossenen Prozessrechners jagt. Auf ihm findet sich dann eine entweder selbst entwickelte oder fertig bezogene Firmware, die den seriellen Port auswertet und die eingehenden Änderungskommandos in Richtung eventuell angeschlossener Hardware weiterleitet. Aus der Logik folgt, dass diese Vorgehensweise eine hohe Latenz zwischen dem Absenden und dem Empfangen des Kommandos erzeugt. Wer schnell auf Ereignisse reagieren muss, ist gut beraten, den dazu notwendigen Code direkt auf dem Arduino zu platzieren – für Visualisierungen oder die im Smart-Home-Bereich auftretenden und meist wenig latenzkritischen Aufgaben ist das System indes geradezu ideal geeignet.

Einrichtung der Arbeitsumgebung

Der hinter PHP-Serial stehende Entwickler weist auf GitHub mehrfach darauf hin, dass die Bibliothek unter Linux am besten funktioniert – MacOS mag bis zu einem gewissen Grad ebenfalls denkbar sein, während eine Windows-Arbeitsumgebung im Allgemeinen mit Problemen einhergeht. Erwähnt sei allerdings, dass es mittlerweile eine ganze Gruppe von Forks gibt, die für derartige Einsatzszenarien optimiert sind. Schon an dieser Stelle sei angemerkt, dass der vernünftigste Weg zur Nutzung von PHP-Serial das lokale Deployment ist. Der Autor wird in den folgenden Schritten mit seiner unter Ubuntu 18.04 LTS laufenden Workstation arbeiten. Öffnen Sie als Erstes ein Terminalfenster und befehlen Sie die Bereitstellung eines LAMP-Stacks durch Eingabe des folgenden Kommandos:

tamhan@TAMHAN18:~$ sudo apt-get install lamp-server^

Da unser hier vorliegendes Programm direkt mit Hardware interagieren muss, ist der P.T.-PHP-Programmierer nicht von der Administration des Servers befreit. Von besonderer Wichtigkeit ist, dass der für die Ausführung des PHP-Servers verantwortliche Benutzer auf die seriellen Ports der Maschine zugreifen darf. Das lässt sich am einfachsten bewerkstelligen, wenn man sein Userkonto zur dialout-Gruppe hinzufügt. dialout ist eine Art Universalberechtigungsfilter, der unter Linux den Zugriff auf serielle Peripheriegeräte ermöglicht. Hierzu müssen wir jedenfalls ins Terminalfenster zurückkehren und mit folgendem Kommando die Einpflegung anvisieren:

tamhan@TAMHAN18:~$ sudo usermod -a -G dialout www-data

Als Nächstes müssen wir feststellen, wo genau im Dateisystem sich der Stack eingenistet hat – die PHP-Bibliothek sollte nämlich in das Wurzelverzeichnis des Servers kommen. Hierzu bietet sich folgendes Kommando an, das auf der Workstation des Autors das in Abbildung 2 gezeigte Ergebnis liefert:

grep -R "DocumentRoot" /etc/apache2/sites-enabled
hanna_arduino_php_2.tif_fmt1.jpgAbb. 2: Die Einrichtung der PHP-Serverumgebung erfolgte im ausgegebenen Ordner

Als Nächstes müssen wir den eigentlichen Quellcode der Bibliothek bereitstellen. Hierzu besuchen wir das bereits bestehende GitHub-Repository [1] und klicken dort den Raw-Knopf an, um das GitHub-Frontend zum Bereitstellen der Datei ohne die diversen Formatierungsergänzungen zu animieren. Im nächsten Schritt nutzen wir sudo und einen Texteditor unserer Wahl, um den dort bereitgestellten PHP-Code in einer lokalen Datei namens PhpSerial.php zu platzieren. Sie kommt im Server-Root-Verzeichnis unter, was auf der Workstation des Autors nach Eingabe von ls folgenden Dateisystemaufbau präsentiert:

tamhan@TAMHAN18:/var/www$ ls html PhpSerial.php

Je nach Konfiguration ihrer Workstation müssen Sie an dieser Stelle sudo verwenden, da das Verzeichnis /var/www oft nur für den Superuser und den PHP-Server-User ansprechbar ist. Als paranoide Natur passt der Autor danach noch die Einstellungen der Datei an, um sicherzugehen, dass die in Unix enthaltene Dateizugriffsberechtigungs-Engine nicht mit der Interaktion der Hardware querschießt:

tamhan@TAMHAN18:/var/www$ sudo chmod 777 PhpSerial.php

Als nächste Aufgabe müssen wir prüfen, ob die Integration der Datei korrekt verlaufen ist. Hierzu legen wir im Home-Verzeichnis des Stacks eine Arbeiterdatei an und statten sie mit dem Code aus Listing 1 aus:

Listing 1

<html> <head><title>PHP Test</title></head> <body> <?php include 'PhpSerial.php'; echo '<p>Hello World</p>'; ?> </body> </html>

Für erfahrene PHP-Entwickler dürfte das Starten bzw. Aktivieren dieser Datei keine große Herausforderung sein – so die Meldung im Browserfenster erscheint, ist vorerst alles in bester Ordnung. Da es in der Praxis doch immer wieder zu Proble...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang