Android App (Node)

Support-Übersicht

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.json auf 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:

  1. Richte eine DNS-SD-Zone ein (z. B. openclaw.internal.) auf dem Gateway-Host und publiziere _openclaw-gw._tcp-Records.
  2. 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.subscribeevent:"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).

  1. Erstelle ~/.openclaw/workspace/canvas/index.html auf dem Gateway-Host.

  2. 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.snapshot gibt { format, base64 } zurück (Standard format="jpeg").
  • A2UI: canvas.a2ui.push, canvas.a2ui.reset (canvas.a2ui.pushJSONL Legacy-Alias)

Kamera-Befehle (nur im Vordergrund; Berechtigung erforderlich):

  • camera.snap (jpg)
  • camera.clip (mp4)

Siehe Camera Node für Parameter und CLI-Helfer.