Platforms overview
Застосунок Android
Знімок підтримки
- Роль: супровідний застосунок вузла (Android не розміщує Gateway).
- Gateway потрібен: так (запустіть його на macOS, Linux або Windows через WSL2).
- Встановлення: Початок роботи + Сполучення.
- Gateway: Операційний довідник + Конфігурація.
- Протоколи: протокол Gateway (вузли + площина керування).
Керування системою
Керування системою (launchd/systemd) розміщене на хості Gateway. Див. Gateway.
Операційний довідник підключення
Застосунок вузла 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.
Якщо ви також налаштували домен широкозонного виявлення, порівняйте з:
openclaw gateway discover --json
Це показує local. разом із налаштованим широкозонним доменом за один прохід і використовує розв’язану кінцеву точку сервісу замість підказок лише з 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 активним через службу переднього плану (постійне сповіщення).
- Відкрийте вкладку Підключення.
- Використовуйте режим Код налаштування або Ручний.
- Якщо виявлення заблоковано, використовуйте ручні хост/порт у Розширених елементах керування. Для хостів приватної LAN
ws://і далі працює. Для хостів Tailscale/публічних хостів увімкніть TLS і використовуйте кінцеву точкуwss:/// Tailscale Serve.
Після першого успішного сполучення Android автоматично перепідключається під час запуску:
- Ручна кінцева точка (якщо ввімкнено), інакше
- Останній виявлений gateway (за можливості).
Сигнали присутності alive
Після підключення автентифікованого сеансу вузла, а також коли застосунок переходить у фон, поки служба переднього плану все ще підключена, Android викликає node.event з event: "node.presence.alive". Gateway записує це як lastSeenAtMs/lastSeenReason у метаданих сполученого вузла/пристрою лише після того, як стане відома ідентичність автентифікованого вузлового пристрою.
Застосунок рахує сигнал як успішно записаний лише тоді, коли відповідь gateway містить handled: true. Старіші gateway можуть підтверджувати node.event через { "ok": true }; така відповідь сумісна, але не рахується як довговічне оновлення останньої видимості.
4) Схваліть сполучення (CLI)
На машині gateway:
openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>
Подробиці сполучення: Сполучення.
Необов’язково: якщо вузол Android завжди підключається з жорстко контрольованої підмережі, ви можете ввімкнути автоматичне схвалення вузла під час першого сполучення з явними CIDR або точними IP-адресами:
{
gateway: {
nodes: {
pairing: {
autoApproveCidrs: ["192.168.1.0/24"],
},
},
},
}
Це вимкнено за замовчуванням. Це застосовується лише до нового сполучення role: node без запитаних областей доступу. Сполучення оператора/браузера та будь-яка зміна ролі, області доступу, метаданих або публічного ключа все одно потребують ручного схвалення.
5) Перевірте, що вузол підключено
-
Через статус вузлів:
openclaw nodes status -
Через Gateway:
openclaw gateway call node.list --params "{}"
6) Чат + історія
Вкладка Chat в Android підтримує вибір сеансу (типово main, а також інші наявні сеанси):
- Історія:
chat.history(нормалізована для відображення; inline-теги директив вилучаються з видимого тексту, XML-навантаження викликів інструментів у plain text (зокрема<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>і обрізані блоки викликів інструментів) та витеклі ASCII/повноширинні керівні токени моделі вилучаються, рядки асистента лише з безшумними токенами, як-от точніNO_REPLY/no_reply, пропускаються, а надмірно великі рядки можуть замінюватися заповнювачами) - Надсилання:
chat.send - Push-оновлення (за можливості):
chat.subscribe→event:"chat"
7) Canvas + камера
Хост Canvas Gateway (рекомендовано для вебвмісту)
Якщо ви хочете, щоб вузол показував справжні HTML/CSS/JS, які агент може редагувати на диску, спрямуйте вузол на хост Canvas Gateway.
-
Створіть
~/.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 і перезавантажує сторінку після змін файлів.
Хост A2UI доступний за http://<gateway-host>:18789/__openclaw__/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застарілий псевдонім)
Команди камери (лише передній план; обмежено дозволами):
camera.snap(jpg)camera.clip(mp4)
Параметри та допоміжні команди CLI див. у вузлі камери.
8) Голос + розширена поверхня команд Android
- Вкладка Voice: Android має два явні режими захоплення. Mic — це ручний сеанс вкладки Voice, який надсилає кожну паузу як хід чату й зупиняється, коли застосунок залишає передній план або користувач залишає вкладку Voice. Talk — це безперервний Talk Mode, який продовжує слухати, доки його не вимкнуть або вузол не від’єднається.
- Talk Mode підвищує наявну службу переднього плану з
dataSyncдоdataSync|microphoneперед початком захоплення, а потім знижує її, коли Talk Mode зупиняється. Android 14+ потребує деклараціїFOREGROUND_SERVICE_MICROPHONE, runtime-дозволуRECORD_AUDIOі типу служби мікрофона під час виконання. - Озвучені відповіді використовують
talk.speakчерез налаштованого провайдера Talk gateway. Локальний системний TTS використовується лише тоді, колиtalk.speakнедоступний. - Голосова активація залишається вимкненою в UX/runtime Android.
- Додаткові сімейства команд Android (доступність залежить від пристрою + дозволів):
device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actions(див. пересилання сповіщень нижче)photos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
Точки входу асистента
Android підтримує запуск OpenClaw із системного тригера асистента (Google Assistant). Коли це налаштовано, утримання кнопки додому або фраза "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,
},
}