Motivation

Für ein Projekt sollte eine Android-App entwickelt werden, die mit einem ESP8266(-Projekt) kommuniziert. Zur App-Entwicklung sollte wegen der einfachen Handhabung der MIT App Inventor 2 benutzt werden.

Die IP-Adressen der verfügbaren ESP8266-Geräte sollten im Projekt nicht fest vorgegeben werden. Die App soll selbst ermitteln, welche Geräte gerade aktiv sind und unter welchen Adressen sie angesprochen werden können.

Zur Erledigung dieser Aufgabe (Name Service) bietet sich die Nutzung der Broadcast-Funktion von UDP an. Man sendet einfach an einen vorher vereinbarten Port ein Broadcast-Datagramm an alle im lokalen Netzwerk vorhandenen Geräte mit der Aufforderung, die eigenen Verbindungsdaten zurück zu liefern. Die Geräte, die auf dem vereinbarten Port lauschen, senden daraufhin ihre IP und ggf. weitere Daten an den Absender zurück. Der Absender sammelt die Antworten auf und kennt damit alle aktiven Geräte. Da die Paket-Übermittlung bei UDP nicht garantiert ist, empfiehlt es sich, diesen Vorgang zu wiederholen und die Vereinigungsmenge der Antworten zu nutzen.

Um gezielt die Geräte eines Projekts ansprechen zu können, vereinbart man entweder unterschiedliche Ports oder man gibt eine Projekt-Kennung in der Antwort mit. Der Empfänger filtert dann diejenigen Geräte heraus, die ihn interessieren.

Nun kommt die Krux. Der App Inventor hat kein eingebautes UDP und ich habe auch keine funktionierende Erweiterung (Extension) gefunden. Also selber machen.

Download

Das ZIP-Archiv UrsAI2UDP zum Download. Das Archiv enthält den Quellcode und das kompilierte Binary zum Upload in den App Inventor.

Verwendung

 Datagramme versenden

Das Versenden der Datagramme geschieht über die Methode Xmit.

Xmit

Dieser Block versendet Datagramme an die Broadcast IP "192.168.178.255" und den Port 2017. Der Inhalt des Datagramms ist "Hallo\n". Zum Absenden wird der Port 2001 verwandt. Der Absende-Port muss nicht unbedingt festgelegt werden. Wird Null oder ein negativer Wert angegeben sucht sich der Block selbst einen beliebigen freien Port:

Xmit

Tritt beim Empfang ein Fehler auf, wird das Ereignis XmitError ausgelöst:

Xmit

Folgende ErrorCodes sind definiert:

ErrorCode Bedeutung
1 Die IP-Adresse ist ungültig.
2 Ungültige fromPort-Angabe.
3 Broadcast nicht möglich. Dieser Fehler sollte eigentlich nie auftreten.
4 Fehler beim Senden.

ErrorMsg enthält den Fehler im Klartext. Er enthält auch die Nachricht des Betriebssystem und ist deshalb eher an den Entwickler der App gerichtet, statt an dessen Anwender.

Datagramme empfangen

Zum Empfangen von Datagrammen stehen folgende Methoden zur Verfügung:

Xmit Startet das "Lauschen" auf Datagramme, die an den Port 2001 gesendet werden (UDP-Server).
Xmit Stoppt den Server.

Passend dazu gibt es das Ereigniss ServerStarted

Xmit

mit LocalIP und LocalPort als Empfangsadresse und das Ereigniss ServerStopped

Xmit

Über die Eigenschaft isRunning kann abgefragt werden, ob der Server aktuell aktiv ist.

Xmit

Wenn Daten empfangen werden, wird das Ereignis DataReceived ausgelöst:

Xmit

Data enthält die Datagramm-Daten RemoteIP und RemotePort die Absender-Adresse.

Tritt ein Fehler auf, wird das Ereignis RcvError ausgelöst:

Xmit 

Folgende ErrorCodes sind definiert:

ErrorCode Bedeutung
5 Server-Fehler

ErrorMsg enthält den Fehler im Klartext. Er enthält auch die Nachricht des Betriebssystem und ist deshalb eher an den Entwickler der App gerichtet, statt an dessen Anwender.

Die Eigenschaft dropOwnBroadcast steuert das Verhalten bei Broadcast-Datagrammen. Der Block ist standardmäßig so eingestellt, dass Nachrichten ignoriert werden, die von der eigenen IP versandt wurden. Sollen diese dennoch empfangen werden, ist dropOwnBroadcast auf false zu setzen.

Xmit 

Diverses

Die eigen lokale IP-Adresse kann über die Eigenschaft LocalIP abgerufen werden.

Xmit

Werkzeuge

Um eigene Erweiterungen entwickeln zu können, muss man einige Werkzeuge installieren. Die Installation der Werkzeuge und die Entwicklung einer Beispiel-Extension ist sehr gut bei KIO4.com beschrieben. Leider ein Gemisch aus Englisch und Spanisch, aber trotzdem gut verständlich und vor allen Dingen Schritt für Schritt erklärt. Auch der App Inventor hat eine Tutorial-Seite.

Die Entwicklung der Erweiterungen erfolgt mit JAVA. Ein Tutorial über Datagramme findet man in der Oracle JAVA Dokumentation. Dort findet man auch Informationen zur verwendeten Klasse DatagramSocket.