Android App (Node)
Support-Übersicht
- Rolle: Begleit-Node-App (Android hostet nicht das Gateway).
- Gateway erforderlich: ja (läuft auf macOS, Linux oder Windows via WSL2).
- Installation: Erste Schritte + Pairing.
- Gateway: Runbook + Konfiguration.
- Protokolle: Gateway-Protokoll (Nodes + Control Plane).
Systemsteuerung
Die Systemsteuerung (launchd/systemd) läuft auf dem Gateway-Host. Siehe Gateway.
Verbindungs-Runbook
Android Node App ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
Android verbindet sich direkt mit dem Gateway WebSocket (Standard ws://<host>:18789) und nutzt das Gateway-eigene Pairing.
Voraussetzungen
- Du kannst das Gateway auf der “Master”-Maschine ausführen.
- Dein Android-Gerät/Emulator kann den Gateway WebSocket erreichen:
- Gleiches LAN mit mDNS/NSD, oder
- Gleiches Tailscale Tailnet mit Wide-Area Bonjour / Unicast DNS-SD (siehe unten), oder
- Manueller Gateway-Host/Port (Fallback)
- Du kannst die CLI (
openclaw) auf der Gateway-Maschine ausführen (oder via SSH).
1) Gateway starten
openclaw gateway --port 18789 --verbose
Prüfe in den Logs, ob du so etwas siehst:
listening on ws://0.0.0.0:18789
Für Tailnet-only-Setups (empfohlen für Wien ⇄ London) binde das Gateway an die Tailnet-IP:
- Setze
gateway.bind: "tailnet"in~/.openclaw/openclaw.jsonauf dem Gateway-Host. - Starte das Gateway / die macOS Menubar-App neu.
2) Discovery überprüfen (optional)
Von der Gateway-Maschine aus:
dns-sd -B _openclaw-gw._tcp local.
Weitere Debugging-Hinweise: Bonjour.
Tailnet (Wien ⇄ London) Discovery via Unicast DNS-SD
Android NSD/mDNS-Discovery funktioniert nicht über Netzwerkgrenzen hinweg. Wenn dein Android Node und das Gateway in verschiedenen Netzwerken sind, aber via Tailscale verbunden, nutze Wide-Area Bonjour / Unicast DNS-SD:
- Richte eine DNS-SD-Zone ein (z. B.
openclaw.internal.) auf dem Gateway-Host und publiziere_openclaw-gw._tcp-Records. - Konfiguriere Tailscale Split DNS für deine gewählte Domain, die auf diesen DNS-Server zeigt.
Details und Beispiel-CoreDNS-Config: Bonjour.
3) Von Android verbinden
In der Android-App:
- Die App hält die Gateway-Verbindung über einen Foreground Service (dauerhafte Benachrichtigung) aufrecht.
- Öffne Settings.
- Unter Discovered Gateways wählst du dein Gateway aus und tippst auf Connect.
- Falls mDNS blockiert ist, nutze Advanced → Manual Gateway (Host + Port) und Connect (Manual).
Nach dem ersten erfolgreichen Pairing verbindet sich Android beim Start automatisch neu:
- Manueller Endpoint (falls aktiviert), ansonsten
- Das zuletzt erkannte Gateway (Best-Effort).
4) Pairing genehmigen (CLI)
Auf der Gateway-Maschine:
openclaw nodes pending
openclaw nodes approve <requestId>
Pairing-Details: Gateway Pairing.
5) Node-Verbindung überprüfen
- Via Nodes-Status:
openclaw nodes status - Via Gateway:
openclaw gateway call node.list --params "{}"
6) Chat + Verlauf
Das Chat-Sheet des Android Node nutzt den primären Session-Key des Gateway (main), sodass Verlauf und Antworten mit WebChat und anderen Clients geteilt werden:
- Verlauf:
chat.history - Senden:
chat.send - Push-Updates (Best-Effort):
chat.subscribe→event:"chat"
7) Canvas + Kamera
Gateway Canvas Host (empfohlen für Web-Content)
Wenn du möchtest, dass der Node echtes HTML/CSS/JS anzeigt, das der Agent auf der Festplatte bearbeiten kann, richte den Node auf den Gateway Canvas Host aus.
Hinweis: Nodes nutzen den eigenständigen Canvas Host auf canvasHost.port (Standard 18793).
-
Erstelle
~/.openclaw/workspace/canvas/index.htmlauf dem Gateway-Host. -
Navigiere den Node dorthin (LAN):
openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18793/__openclaw__/canvas/"}'
Tailnet (optional): Wenn beide Geräte auf Tailscale sind, nutze einen MagicDNS-Namen oder die Tailnet-IP statt .local, z. B. http://<gateway-magicdns>:18793/__openclaw__/canvas/.
Dieser Server injiziert einen Live-Reload-Client ins HTML und lädt bei Dateiänderungen neu.
Der A2UI-Host läuft unter http://<gateway-host>:18793/__openclaw__/a2ui/.
Canvas-Befehle (nur im Vordergrund):
canvas.eval,canvas.snapshot,canvas.navigate(nutze{"url":""}oder{"url":"/"}, um zum Standard-Scaffold zurückzukehren).canvas.snapshotgibt{ format, base64 }zurück (Standardformat="jpeg").- A2UI:
canvas.a2ui.push,canvas.a2ui.reset(canvas.a2ui.pushJSONLLegacy-Alias)
Kamera-Befehle (nur im Vordergrund; Berechtigung erforderlich):
camera.snap(jpg)camera.clip(mp4)
Siehe Camera Node für Parameter und CLI-Helfer.