Aplikacja Android (Węzeł)¶
Migawka wsparcia¶
- Rola: aplikacja węzła towarzyszącego (Android nie hostuje Gateway).
- Wymagany Gateway: tak (uruchom na macOS, Linux lub Windows przez WSL2).
- Instalacja: Pierwsze kroki + Parowanie.
- Gateway: Runbook + Konfiguracja.
- Protokoły: Protokół Gateway (węzły + płaszczyzna sterowania).
Kontrola systemu¶
Kontrola systemu (launchd/systemd) znajduje się na hoście Gateway. Zobacz Gateway.
Runbook połączenia¶
Aplikacja węzła Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
Android łączy się bezpośrednio z WebSocket Gateway (domyślnie ws://<host>:18789) i używa parowania należącego do Gateway.
Wymagania wstępne¶
- Możesz uruchomić Gateway na „głównej” maszynie.
- Urządzenie/emulator Android może osiągnąć WebSocket gateway:
- Ta sama sieć LAN z mDNS/NSD, lub
- Ten sam tailnet Tailscale z użyciem Wide-Area Bonjour / unicast DNS-SD (zobacz poniżej), lub
- Ręczne ustawienie hosta/portu gateway (awaryjne)
- Możesz uruchomić CLI (
openclaw) na maszynie gateway (lub przez SSH).
1. Uruchom Gateway¶
openclaw gateway --port 18789 --verbose
Potwierdź w logach, że widzisz coś w rodzaju:
listening on ws://0.0.0.0:18789
Dla konfiguracji tylko w tailnecie (zalecane dla Wiedeń ⇄ Londyn) zbindować gateway do adresu IP tailnetu:
- Ustaw
gateway.bind: "tailnet"w~/.openclaw/openclaw.jsonna hoście gateway. - Zrestartuj Gateway / aplikację paska menu macOS.
2. Zweryfikuj wykrywanie (opcjonalne)¶
Z maszyny gateway:
dns-sd -B _openclaw-gw._tcp local.
Więcej uwag dotyczących debugowania: Bonjour.
Wykrywanie w tailnecie (Wiedeń ⇄ Londyn) przez unicast DNS-SD¶
Wykrywanie NSD/mDNS na Androidzie nie przechodzi między sieciami. Jeśli węzeł Android i gateway są w różnych sieciach, ale połączone przez Tailscale, użyj Wide-Area Bonjour / unicast DNS-SD:
- Skonfiguruj strefę DNS-SD (przykład
openclaw.internal.) na hoście gateway i opublikuj rekordy_openclaw-gw._tcp. - Skonfiguruj split DNS w Tailscale dla wybranej domeny, wskazując ten serwer DNS.
Szczegóły i przykładowa konfiguracja CoreDNS: Bonjour.
3. Połącz z Androida¶
W aplikacji Android:
- Aplikacja utrzymuje połączenie z gateway przez usługę pierwszoplanową (stałe powiadomienie).
- Otwórz Ustawienia.
- W sekcji Discovered Gateways wybierz swój gateway i naciśnij Connect.
- Jeśli mDNS jest blokowane, użyj Advanced → Manual Gateway (host + port) i Connect (Manual).
Po pierwszym udanym parowaniu Android automatycznie ponownie łączy się przy uruchomieniu:
- Ręczny endpoint (jeśli włączony), w przeciwnym razie
- Ostatnio wykryty gateway (best-effort).
4. Zatwierdź parowanie (CLI)¶
Na maszynie gateway:
openclaw nodes pending
openclaw nodes approve <requestId>
Szczegóły parowania: Parowanie Gateway.
5. Sprawdź, czy węzeł jest połączony¶
- Przez status węzłów:
bash
openclaw nodes status
- Przez Gateway:
bash
openclaw gateway call node.list --params "{}"
6. Czat + historia¶
Arkusz Czat w węźle Android używa klucza sesji podstawowej gateway (main), więc historia i odpowiedzi są współdzielone z WebChat i innymi klientami:
- Historia:
chat.history - Wysyłanie:
chat.send - Aktualizacje push (best-effort):
chat.subscribe→event:"chat"
7. Canvas + kamera¶
Host Canvas Gateway (zalecane dla treści webowych)¶
Jeśli chcesz, aby węzeł wyświetlał prawdziwe HTML/CSS/JS, które agent może edytować na dysku, skieruj węzeł na host Canvas Gateway.
Uwaga: węzły używają samodzielnego hosta canvas na canvasHost.port (domyślnie 18793).
-
Utwórz
~/.openclaw/workspace/canvas/index.htmlna hoście gateway. -
Przejdź do niego z węzła (LAN):
openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18793/__openclaw__/canvas/"}'
Tailnet (opcjonalnie): jeśli oba urządzenia są w Tailscale, użyj nazwy MagicDNS lub adresu IP tailnetu zamiast .local, np. http://<gateway-magicdns>:18793/__openclaw__/canvas/.
Ten serwer wstrzykuje klient live-reload do HTML i przeładowuje przy zmianach plików.
Host A2UI znajduje się pod adresem http://<gateway-host>:18793/__openclaw__/a2ui/.
Polecenia Canvas (tylko na pierwszym planie):
canvas.eval,canvas.snapshot,canvas.navigate(użyj{"url":""}lub{"url":"/"}, aby wrócić do domyślnego szablonu).canvas.snapshotzwraca{ format, base64 }(domyślnieformat="jpeg").- A2UI:
canvas.a2ui.push,canvas.a2ui.reset(canvas.a2ui.pushJSONL— alias starszy)
Polecenia kamery (tylko na pierwszym planie; z kontrolą uprawnień):
camera.snap(jpg)camera.clip(mp4)
Zobacz Węzeł kamery w celu zapoznania się z parametrami i pomocnikami CLI.