Platforms overview
Застосунок Android
Знімок підтримки
- Роль: застосунок супутнього вузла (Android не розміщує Gateway).
- Gateway потрібен: так (запустіть його на macOS, Linux або Windows через WSL2).
- Встановлення: Google Play для застосунку, Початок роботи для Gateway, потім Сполучення.
- Gateway: Runbook + Конфігурація.
- Протоколи: протокол Gateway (вузли + площина керування).
Керування системою
Керування системою (launchd/systemd) розміщується на хості Gateway. Див. Gateway.
Runbook підключення
Застосунок вузла Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
Android підключається безпосередньо до WebSocket Gateway і використовує сполучення пристрою (role: node).
Для Tailscale або публічних хостів Android потребує захищеної кінцевої точки:
- Бажано: Tailscale Serve / Funnel з
https://<magicdns>/wss://<magicdns> - Також підтримується: будь-яка інша URL-адреса Gateway
wss://зі справжньою кінцевою точкою TLS - Незашифрований
ws://залишається підтримуваним для приватних LAN-адрес / хостів.local, а такожlocalhost,127.0.0.1і мосту емулятора Android (10.0.2.2)
Передумови
- Ви можете запустити Gateway на "головній" машині.
- Пристрій/емулятор Android може досягти WebSocket Gateway:
- Та сама LAN з mDNS/NSD, або
- Та сама tailnet Tailscale з Wide-Area Bonjour / unicast DNS-SD (див. нижче), або
- Ручний хост/порт Gateway (резервний варіант)
- Сполучення через tailnet/публічну мобільну мережу не використовує сирі кінцеві точки IP tailnet
ws://. Натомість використовуйте Tailscale Serve або іншу URL-адресуwss://. - Ви можете запустити CLI (
openclaw) на машині Gateway (або через SSH).
1) Запустіть Gateway
openclaw gateway --port 18789 --verboseПідтвердьте, що в журналах бачите щось на кшталт:
listening on ws://0.0.0.0:18789
Для віддаленого доступу Android через Tailscale надавайте перевагу Serve/Funnel замість сирої прив’язки tailnet:
openclaw gateway --tailscale serveЦе надає Android захищену кінцеву точку wss:// / https://. Звичайного налаштування gateway.bind: "tailnet" недостатньо для першого віддаленого сполучення Android, якщо ви окремо не завершуєте TLS.
2) Перевірте виявлення (необов’язково)
З машини Gateway:
dns-sd -B _openclaw-gw._tcp local.Додаткові нотатки щодо налагодження: Bonjour.
Якщо ви також налаштували домен wide-area виявлення, порівняйте з:
openclaw gateway discover --jsonЦе показує local. разом із налаштованим доменом wide-area за один прохід і використовує розв’язану
кінцеву точку сервісу замість підказок лише з TXT.
Виявлення через tailnet (Відень ⇄ Лондон) за допомогою unicast DNS-SD
Виявлення Android NSD/mDNS не працює між різними мережами. Якщо ваш вузол Android і Gateway перебувають у різних мережах, але з’єднані через Tailscale, натомість використовуйте Wide-Area Bonjour / unicast DNS-SD.
Самого виявлення недостатньо для сполучення Android через tailnet/публічну мережу. Виявленому маршруту все одно потрібна захищена кінцева точка (wss:// або Tailscale Serve):
- Налаштуйте зону DNS-SD (приклад
openclaw.internal.) на хості Gateway і опублікуйте записи_openclaw-gw._tcp. - Налаштуйте split DNS Tailscale для вибраного домену, що вказує на цей DNS-сервер.
Докладніше й приклад конфігурації CoreDNS: Bonjour.
3) Підключіться з Android
У застосунку Android:
- Застосунок підтримує з’єднання з Gateway активним через foreground service (постійне сповіщення).
- Відкрийте вкладку Connect.
- Використайте режим Setup Code або Manual.
- Якщо виявлення заблоковане, використайте ручні хост/порт у Advanced controls. Для приватних LAN-хостів
ws://усе ще працює. Для Tailscale/публічних хостів увімкніть TLS і використовуйте кінцеву точкуwss:/// Tailscale Serve.
Після першого успішного сполучення Android автоматично перепідключається під час запуску:
- Ручна кінцева точка (якщо ввімкнено), інакше
- Останній виявлений Gateway (best-effort).
Сигнали присутності alive
Після підключення автентифікованої сесії вузла, а також коли застосунок переходить у фоновий режим, поки
foreground service усе ще підключений, Android викликає node.event з
event: "node.presence.alive". Gateway записує це як lastSeenAtMs/lastSeenReason у
метаданих сполученого вузла/пристрою лише після того, як відома ідентичність автентифікованого пристрою вузла.
Застосунок вважає сигнал успішно записаним лише тоді, коли відповідь Gateway містить
handled: true. Старіші Gateway можуть підтверджувати node.event через { "ok": true }; така відповідь
сумісна, але не рахується як довговічне оновлення last-seen.
4) Схваліть сполучення (CLI)
На машині Gateway:
openclaw devices listopenclaw devices approve <requestId>openclaw devices reject <requestId>Деталі сполучення: Сполучення.
Необов’язково: якщо вузол Android завжди підключається з суворо контрольованої підмережі, ви можете явно ввімкнути автоматичне схвалення вузла під час першого підключення через CIDR або точні IP:
{ gateway: { nodes: { pairing: { autoApproveCidrs: ["192.168.1.0/24"], }, }, },}За замовчуванням це вимкнено. Це застосовується лише до нового сполучення role: node
без запитаних областей доступу. Сполучення оператора/браузера, а також будь-яка зміна ролі, області доступу, метаданих або
публічного ключа все одно потребує ручного схвалення.
5) Перевірте, що вузол підключений
-
Через стан вузлів:
bash openclaw nodes status -
Через Gateway:
bash openclaw gateway call node.list --params "{}"
6) Чат + історія
Вкладка Chat в Android підтримує вибір сесії (типово main, а також інші наявні сесії):
- Історія:
chat.history(нормалізована для відображення; вбудовані теги директив вилучаються з видимого тексту, XML-навантаження викликів інструментів у звичайному тексті (зокрема<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>і обрізані блоки викликів інструментів) та витоки ASCII/повноширинних токенів керування моделлю вилучаються, суто беззвучні рядки асистента з токенами, як-от точніNO_REPLY/no_reply, пропускаються, а завеликі рядки можуть замінюватися заповнювачами) - Надсилання:
chat.send - Push-оновлення (best-effort):
chat.subscribe→event:"chat"
7) Canvas + камера
Хост Gateway Canvas (рекомендовано для вебвмісту)
Якщо ви хочете, щоб вузол показував справжні HTML/CSS/JS, які агент може редагувати на диску, вкажіть вузлу хост Gateway canvas.
-
Створіть
~/.openclaw/workspace/canvas/index.htmlна хості Gateway. -
Спрямуйте вузол до нього (LAN):
openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18789/__openclaw__/canvas/"}'Tailnet (необов’язково): якщо обидва пристрої в Tailscale, використовуйте ім’я MagicDNS або IP tailnet замість .local, наприклад http://<gateway-magicdns>:18789/__openclaw__/canvas/.
Цей сервер вставляє клієнт live-reload в HTML і перезавантажує сторінку під час змін файлів.
Gateway також обслуговує /__openclaw__/a2ui/, але застосунок Android трактує віддалені сторінки A2UI як такі, що призначені лише для рендерингу. Команди A2UI з діями використовують вбудовану сторінку A2UI, що належить застосунку, перед застосуванням повідомлень.
Команди Canvas (лише на передньому плані):
canvas.eval,canvas.snapshot,canvas.navigate(використовуйте{"url":""}або{"url":"/"}, щоб повернутися до стандартного каркаса).canvas.snapshotповертає{ format, base64 }(типовоformat="jpeg").- A2UI:
canvas.a2ui.push,canvas.a2ui.reset(застарілий псевдонімcanvas.a2ui.pushJSONL). Ці команди використовують вбудовану сторінку A2UI, що належить застосунку, для рендерингу з підтримкою дій.
Команди камери (лише на передньому плані; обмежені дозволами):
camera.snap(jpg)camera.clip(mp4)
Параметри та CLI-помічники див. у Вузол камери.
8) Голос + розширена поверхня команд Android
- Вкладка Voice: Android має два явні режими захоплення. Mic — це ручна сесія вкладки Voice, яка надсилає кожну паузу як хід чату й зупиняється, коли застосунок залишає передній план або користувач залишає вкладку Voice. Talk — це безперервний Talk Mode, який продовжує слухати, доки його не вимкнуть або вузол не від’єднається.
- Talk Mode підвищує наявний foreground service з
connectedDeviceдоconnectedDevice|microphoneперед початком захоплення, а потім знижує його, коли Talk Mode зупиняється. Сервіс вузла оголошуєFOREGROUND_SERVICE_CONNECTED_DEVICEзCHANGE_NETWORK_STATE; Android 14+ також потребує оголошенняFOREGROUND_SERVICE_MICROPHONE, runtime-дозволуRECORD_AUDIOі типу сервісу мікрофона під час виконання. - За замовчуванням Android Talk використовує нативне розпізнавання мовлення, чат Gateway і
talk.speakчерез налаштований Talk-провайдер Gateway. Локальний системний TTS використовується лише тоді, колиtalk.speakнедоступний. - Android Talk використовує realtime-ретрансляцію Gateway лише тоді, коли
talk.realtime.modeдорівнюєrealtime, аtalk.realtime.transportдорівнюєgateway-relay. - Voice wake залишається вимкненим в UX/runtime Android.
- Додаткові сімейства команд Android (доступність залежить від пристрою, дозволів і налаштувань користувача):
device.status,device.info,device.permissions,device.healthdevice.appsлише коли ввімкнено Settings > Phone Capabilities > Installed Apps; типово перелічує застосунки, видимі в лаунчері.notifications.list,notifications.actions(див. Пересилання сповіщень нижче)photos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
Точки входу асистента
Android підтримує запуск OpenClaw із системного тригера асистента (Google Assistant). Після налаштування утримання кнопки Home або фраза "Hey Google, ask OpenClaw..." відкриває застосунок і передає запит у композер чату.
Це використовує метадані Android App Actions, оголошені в маніфесті застосунку. На боці Gateway не потрібна додаткова конфігурація -- intent асистента повністю обробляється застосунком Android і пересилається як звичайне повідомлення чату.
Пересилання сповіщень
Android може пересилати сповіщення пристрою до Gateway як події. Кілька елементів керування дають змогу обмежити, які сповіщення пересилаються і коли.
| Ключ | Тип | Опис |
|---|---|---|
notifications.allowPackages |
string[] | Пересилати сповіщення лише від цих імен пакетів. Якщо задано, усі інші пакети ігноруються. |
notifications.denyPackages |
string[] | Ніколи не пересилати сповіщення від цих імен пакетів. Застосовується після allowPackages. |
notifications.quietHours.start |
string (HH:mm) | Початок вікна тихих годин (локальний час пристрою). Сповіщення придушуються протягом цього вікна. |
notifications.quietHours.end |
string (HH:mm) | Кінець вікна тихих годин. |
notifications.rateLimit |
number | Максимальна кількість пересланих сповіщень на пакет за хвилину. Надлишкові сповіщення відкидаються. |
Вибір сповіщень також використовує безпечнішу поведінку для пересланих подій сповіщень, запобігаючи випадковому пересиланню чутливих системних сповіщень.
Приклад конфігурації:
{ notifications: { allowPackages: ["com.slack", "com.whatsapp"], denyPackages: ["com.android.systemui"], quietHours: { start: "22:00", end: "07:00", }, rateLimit: 5, },}