preloader

Auf AEQ-WEB Suchen

AEQ-WEB | Blog

Arduino steuern mit UDP und PHP

Arduino über PHP steuern

Dieses Projekt bildet zusammen mit dem Hauptprojekt (Arduino weltweit Steuern) den dafür notwendigen Client. Über ein einfaches HTML-Formular können Steuerbefehle an den Arduino gesendet werden. Ein PHP-Script eröffnet im Hintergrund einen UDP-Socket und sendet den entsprechenden Steuerbefehl weiter an den Relay-Server. Dieser Server sendet das UDP-Paket an den Controller (Arduino) weiter. Anschließend sendet der Controller im Erfolgsfall eine Rückmeldung an das UDP-Relay und dieses wiederum leitet das Datenpaket an den PHP-Script weiter, der auf die Antwort wartet. Kommt innerhalb vom definierten Timeout eine Antwort, so wird diese vom PHP-Script verarbeitet und entsprechend an das HTML-Formular übergeben.

So funktioniert das Script

Über den PHP-Code wird ein HTML Formular ausgeben. Dieses kleine Formular besteht aus drei Buttons und zwei Ausgabezeilen. Mittels POST-Methode werden einzelne Steuerbefehle vom Formular an PHP übergeben. Die Buttons können eine am Arduino angeschlossene LED schalten, oder einen Statusbericht vom Arduino anfordern. Bekommt das Script ein entsprechendes Datenpaket vom Server zurück, wird dies entsprechend verarbeitet und eine Ausgabe im Browser erfolgt. Kommt es zu einem Fehler oder kommt keine Antwort vom Controller auf den gesendeten Steuerbefehl, so wird dies mit einer Error-Meldung ausgegeben.

Bild: Erfolgreiches Einschalten der LED mit Rückmeldung

Arduino PHP switch LED success

Bild: Wenn der Steuerbefehl fehl schlägt oder das Board bzw. der Server offline ist

Arduino PHP switch LED error

Bild: Abfrage von IP-Adresse und Laufzeit des Controllers

Arduino PHP Info

Download PHP Source Code (ZIP)

PHP UDP Controller
Download
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
$ip = "localhost";
$port = 9999; //UDP port on server
$timeout = 2; //Timeout in seconds

$msg_out = "";
$msg_debug = "";

if (isset($_POST["cmd"])) {

    $cmd = $_POST["cmd"];

    if ($cmd == "CMD:LED=1" || $cmd == "CMD:LED=0" || $cmd == "CMD:INFO") {
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
        socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO,
                array("sec" => $timeout, "usec" => 0));
        socket_sendto($sock, $cmd, strlen($cmd), 0, $ip, $port);

        while (true) {
            $ret = @socket_recvfrom($sock, $buf, 1024, 0, $ip, $port);
            if ($ret === false) {
                break;
            }
            if (strpos($buf, "DONE") !== false) {
                $msg_out = "Arduino switched LED successful!";
            } else if (strpos($buf, "MSG-DEV:") !== false) {
                $msg_out = $buf;
            } else {
                $msg_out = "Error!";
            }
            $msg_debug .= "UDP Message: < $buf ><br>";
        }
        socket_close($sock);
    }
}
?>

<!DOCTYPE html>
<html>
    <body>
        <h1>PHP UDP Controller</h1>
        <p><?php echo $msg_out ?></p>
        <br>
        <form action="" method="POST">
            <button type="submit" name="cmd" value="CMD:LED=1">LED ON</button>
            <button type="submit" name="cmd" value="CMD:LED=0">LED OFF</button>
            <button type="submit" name="cmd" value="CMD:INFO">INFO</button>
        </form>
        <br>
        <small>Received Response from Server (RAW):</small><br>
        <small><?php echo $msg_debug ?></small>
    </body>
</html>

PHP Code

In diesem Absatz sind die einzelnen Befehlszeilen beschrieben:

2: IP/Domain vom UDP Server Relay
3: Port vom UDP Server Relay
4: Timeout für das empfangen von UDP-Paketen in Sekunden
9-36: Befehle werden ausgeführt, wenn ein Steuerbefehl vom HTML Formular empfangen wurde
13: Überprüfung auf gültige Steuerbefehle vom Formular
14: Eröffnet in PHP einen UDP Socket
15,16: Fügt Zusatzoptionen wie z.B. Timeouts zum Socket hinzu
18: Sendet das UDP Paket mit dem Steuerbefehl an den Relayserver
20-33: Wartet und verarbeitet die Rückmeldungen von Controller und Server
34: Beendet den Socket nach dem Ablauf vom Timeout
40-54: Einfaches HTML Formular mit drei Buttons, Statusausgabe und Debugausgabe


Share:
thumbnail
30.05.2018
Arduino Anemometer bauen

Auf dieser Seite geht es um die Konfiguration eines Anemometer Windrades mit dem Arduino Board. Welche Bauteile und Software man braucht, erfährt ihr hier

Alex @ AEQ-WEB
thumbnail
02.06.2018
Arduino Wetterstation

Hier gibt es eine professionelle Anleitung zum Bau einer Arduino Wetterstation. Temperatur, Wind, Feuchte & Luftdruck werden per HTTP an den Server gesendet

Alex @ AEQ-WEB