Arduino Yún Bridge nutzen für TCP Kommunikation

über eigenen Port mit YunServer und YunClient

Mit einem Arduino über Netzwerk zu kommunizieren ist generell nichts Neues. Auch der Yún mit WLAN und Ethernet macht da an sich keine Ausnahme. Die bekannte Ethernet Library steht wie gewohnt auch auf dem Yún zur Verfügung. Zusätzlich dazu bietet der Yun aber mit YunServer und YunClient zwei neue Klassen, welche für Netzwerkkommunikation eingesetzt werden können. Beide gehören zur mit dem Yún eingeführten Bridge Library.

Und das sollte man auch durchaus in Betracht ziehen, denn die beiden Klassen sind bereits auf dem Yún vorhanden und belegen daher in einem Sketch keinen zusätzlichen Speicher. Bei größeren Sketches kommt man irgendwann an die Grenzen des verfügbaren Platzes, da sollte man sparen wo man kann.

Für die Verwendung von YunServer und YunClient gibt es grundlegend zwei Möglichkeiten. Einmal die vorkonfigurierte Lösung über Port 5555 und der REST Api, sowie zum anderen die etwas komplexere Möglichkeit der direkten TCP Verbindung, welche auch über einen eigenen Port erfolgen kann. Im Folgenden möchte ich beide Ansätze kurz vorstellen und erläutern. Gerade bei der TCP Variante bin ich selbst auf einige Probleme gestoßen, bis diese wie gewünscht funktionierte.

Standardverwendung, Port 5555 mit REST Api

An vielen Stellen vereinfacht der Yun die Arbeit im Vergleich zu anderen Boards. So auch bei der grundsätzlichen Verwendung der Netzwerkkommunikation. Nutzt man die Klassen ohne weitere Konfiguration, so kann man ganz bequem die REST Api verwenden um Befehle im Sketch auszuführen. Wenn man YunServer nutzt wird im Standard immer der Port 5555 verwendet. In der setup() Funktion wird der Server einmal instanziiert, danach kann im loop() mit dem YunClient auf neue Verbindungen reagiert werden.

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

// initialize server on default port
YunServer server;

void setup()
{
    Bridge.begin();

    // start listening on localhost
    server.listenOnLocalhost();
    server.begin();
}

void loop()
{
    YunClient client = server.accept();

    // if some connection is available
    if( client )
    {
        // receive command
        String command = client.readStringUntil('/');

        // execute action if we know the received command
        if( command == "my_command" ) {
            client.print("Hello World!");
        }

        client.stop();
    }

    delay(30);
}

Wirklich interessant wird dieses Beispiel aber erst, wenn wir die vorhandene REST Api mit einbeziehen. Mit dem Arduino Yún bekommt man eine nette und vor allem einfache Möglichkeit mit dem Sketch zu kommunizieren. Ruft man die die Adresse des Yún mit dem Zauberwort arduino gefolgt von den zu sendenden Daten auf, also z.B. http://192.168.1.100/arduino/my_command/, werden diese direkt an den Sketch geschickt und die Rückgabe angezeigt. Im oben gezeigten Beispiel sollten wir also die Zeile Hello World! im Browser lesen können.

Es ist möglich, dass bei der ersten Anfrage über die REST Api ein Benutzername und Passwort abgefragt wird. Hierbei handelt es sich im Standard um den User root mit dem bei der Einrichtung des Yun eingegebenen Passwort. Sollte die REST Api bereits in der Konfiguration frei zugänglich gemacht worden sein fällt eine Eingabe natürlich weg und jeder kann Befehle absetzen. Dies sollte man bedenken, wenn man sein Yún auch über das Internet verfügbar machen möchte. Optional kann man die URL auch mit Benutzerdaten z.B. über curl über absetzen.

curl -u root:password http://192.168.1.100/arduino/my_command/

Mit diesen einfachen Bordmitteln kann man schnell und unkompliziert eine Netzwerkbasierte Anwendung entwickeln. Zudem ist der Zugriff über HTTP-Aufrufe für viele einfacher abzusetzen und zu behandeln.

Erweiterte Verwendung für TCP mit eigenem Port

Manch einer wird aber den Wunsch verspüren einen anderen Port verwenden zu wollen, oder noch besser, eine direkte TCP Kommunikation aufzubauen ohne den Yún eigenen Schnick-Schnack. So auch mein Wunsch. Das stellte sich anfangs, auch wegen etwas falschem Verständnis des Yún, als weniger Trivial da. Im Endeffekt geht aber auch das sehr einfach von der Hand.

Für alle nicht ganz so Erfahrenen: Wenn man eine TCP Verbindung nutzen möchte muss man mit der Konsequenz leben, dass ohne weiteres ein Browser nicht für diese genutzt werden kann. Es wird ein Programm/Skript benötigt, was den Verbindungsaufbau und die Datenübertragung übernimmt. Sonst bringt diese Möglichkeit keinen Nutzen und man sollte lieber zum ersten Ansatz mit REST greifen.

Grundsätzlich bleibt der Aufbau wieder gleich. Man initialisiert den YunServer in der setup() Funktion und verwendet dann den YunClient in der loop() um Verbindungen zu behandeln. Allerdings können wir hierbei noch einen Port angeben, auf welchen der YunServer horchen soll.

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

// initialize server on port '1337'
YunServer server(1337);

void setup()
{
    Bridge.begin();

    // start listening on all connections
    server.noListenOnLocalhost();
    server.begin();
}

void loop()
{
    YunClient client = server.accept();

    // if a connection is available
    if( client )
    {
        client.setTimeout(5);

        // receive the sended data
        String command = client.readString();
        command.trim();

        // execute action if we know the received command
        if( command == "my_command" ) {
            client.print("Hello World!");
        }

        // let some time pass to receive all data
        delay(50);
        client.stop();
    }
}

Ab diesem Punkt haben wir keine Möglichkeit mehr die REST Api zu nutzen um direkt mit dem Sketch zu kommunizieren. Es muss ein anderer Weg geschaffen werden. Das liegt natürlich immer am Anwendungsfall und kann alles sein. Ob nun ein Programm, eine mobile App, eine Webseite oder ein einfaches Skript. Es gibt ab jetzt viele Wege.

Zum Testen kann man einfach ein simples PHP Skript zur Hilfe nehmen. Mit dem folgenden Beispiel sollte man die Rückgabe Hello World! vom Yun erhalten und im Browser ausgeben.

$connection = fsockopen("192.168.2.100", 1337, $errorNr, $errorMsg, 30);

if (!$connection) {
    echo $errorMsg . " (" . $errorNr . ")\n";
}
else {
    $command = "my_command";
    fwrite($connection, $command);

    while (!feof($connection)) {
        echo fgets($connection, 128);
    }

    fclose($connection);
}

Natürlich sind auch dauerhafte TCP Verbindungen mit dem Beispiel möglich. Hierzu kann das oben gezeigte Beispiel so modifiziert werden, das die Verbindung nicht geschlossen wird und mit einer while-Schleife so lange gearbeitet werden, bis die Verbindung final geschlossen wird. Wer dies einsetzen möchte wird aber vermutlich grundsätzlich wissen was zu tun ist, weshalb ich hier in meiner kleinen Vorstellung nicht weiter drauf eingehe.

Fazit

Durch die zur Verfügung stehenden Funktionen kann man recht leicht und vor allem Speicherplatz sparend einfache netzwerkgesteuerte Anwendungen erstellen. Für mich persönlich definitiv noch ein weiterer Punkt auf der Liste, wieso mir der Yun mittlerweile weit besser gefällt und mehr Spaß bereitet wie beispielsweise der kleine Bruder, dem Arduino Uno.

Viel Spaß beim selbst probieren!

Share:

Einen Kommentar verfassen

Ihre E-Mail-Adresse wird nicht veröffentlicht, sie dient nur der Identifikation! Für die Profilbilder wird Gravatar verwendet und reCAPTCHA, um Spam zu vermeiden.

Kommentare 0

Es sind noch keine Kommentare für diesen Beitrag vorhanden.