Saltar para o conteúdo principal

App Android (Nó)

Snapshot de suporte

Controle do sistema

O controle do sistema (launchd/systemd) fica no host do Gateway. Veja Gateway.

Runbook de conexão

App de nó Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway O Android se conecta diretamente ao WebSocket do Gateway (padrão ws://<host>:18789) e usa o pareamento de propriedade do Gateway.

Pré-requisitos

  • Voce consegue executar o Gateway na máquina “master”.
  • O dispositivo/emulador Android consegue alcançar o WebSocket do gateway:
    • Mesma LAN com mDNS/NSD, ou
    • Mesmo tailnet do Tailscale usando Wide-Area Bonjour / DNS-SD unicast (veja abaixo), ou
    • Host/porta do gateway manual (fallback)
  • Voce consegue executar a CLI (openclaw) na máquina do gateway (ou via SSH).

1. Inicie o Gateway

openclaw gateway --port 18789 --verbose
Confirme nos logs que voce ve algo como:
  • listening on ws://0.0.0.0:18789
Para setups somente em tailnet (recomendado para Viena ⇄ Londres), faça o bind do gateway ao IP do tailnet:
  • Defina gateway.bind: "tailnet" em ~/.openclaw/openclaw.json no host do gateway.
  • Reinicie o Gateway / app de menubar do macOS.

2. Verifique a descoberta (opcional)

A partir da máquina do gateway:
dns-sd -B _openclaw-gw._tcp local.
Mais notas de depuração: Bonjour.

Descoberta via DNS-SD unicast no tailnet (Viena ⇄ Londres)

A descoberta NSD/mDNS do Android não atravessa redes. Se o nó Android e o gateway estiverem em redes diferentes, mas conectados via Tailscale, use Wide-Area Bonjour / DNS-SD unicast:
  1. Configure uma zona DNS-SD (exemplo openclaw.internal.) no host do gateway e publique registros _openclaw-gw._tcp.
  2. Configure split DNS do Tailscale para o dominio escolhido apontando para esse servidor DNS.
Detalhes e exemplo de configuração do CoreDNS: Bonjour.

3. Conecte a partir do Android

No app Android:
  • O app mantém a conexão com o gateway ativa por meio de um serviço em primeiro plano (notificação persistente).
  • Abra Configurações.
  • Em Gateways descobertos, selecione seu gateway e toque em Conectar.
  • Se o mDNS estiver bloqueado, use Avançado → Gateway manual (host + porta) e Conectar (Manual).
Após o primeiro pareamento bem-sucedido, o Android reconecta automaticamente ao iniciar:
  • Endpoint manual (se habilitado), caso contrário
  • O ultimo gateway descoberto (melhor esforço).

4. Aprove o pareamento (CLI)

Na máquina do gateway:
openclaw nodes pending
openclaw nodes approve <requestId>
Detalhes do pareamento: Pareamento do Gateway.

5. Verifique se o nó esta conectado

  • Via status dos nós:
    openclaw nodes status
    
  • Via Gateway:
    openclaw gateway call node.list --params "{}"
    

6. Chat + histórico

A aba Chat do nó Android usa a chave de sessão primária do gateway (main), portanto o histórico e as respostas são compartilhados com o WebChat e outros clientes:
  • Histórico: chat.history
  • Enviar: chat.send
  • Atualizações push (melhor esforço): chat.subscribeevent:"chat"

7. Canvas + câmera

Host do Canvas do Gateway (recomendado para conteudo web)

Se voce quiser que o nó mostre HTML/CSS/JS reais que o agente pode editar em disco, aponte o nó para o host do Canvas do Gateway. Observação: os nodes carregam o canvas do servidor HTTP do Gateway (mesma porta que gateway.port, padrão 18789).
  1. Crie ~/.openclaw/workspace/canvas/index.html no host do gateway.
  2. Navegue o nó ate ele (LAN):
openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18793/__openclaw__/canvas/"}'
Tailnet (opcional): se ambos os dispositivos estiverem no Tailscale, use um nome MagicDNS ou IP do tailnet em vez de .local, por exemplo http://<gateway-magicdns>:18793/__openclaw__/canvas/. Este servidor injeta um cliente de live-reload no HTML e recarrega em mudanças de arquivo. O host A2UI fica em http://<gateway-host>:18793/__openclaw__/a2ui/. Comandos do Canvas (somente em primeiro plano):
  • canvas.eval, canvas.snapshot, canvas.navigate (use {"url":""} ou {"url":"/"} para retornar ao scaffold padrão). canvas.snapshot retorna { format, base64 } (padrão format="jpeg").
  • A2UI: canvas.a2ui.push, canvas.a2ui.reset (canvas.a2ui.pushJSONL alias legado)
Comandos da câmera (somente em primeiro plano; com permissão):
  • camera.snap (jpg)
  • camera.clip (mp4)
Veja Nó de câmera para parametros e helpers da CLI.