تطبيق Android الرسمي متاح على Google Play. إنه عقدة مرافقة ويتطلب Gateway OpenClaw قيد التشغيل. يتوفر كود المصدر أيضًا في مستودع OpenClaw ضمن
apps/android؛ راجع apps/android/README.md للحصول على تعليمات البناء.لقطة الدعم
- الدور: تطبيق عقدة مرافقة (لا يستضيف Android الـ Gateway).
- Gateway مطلوب: نعم (شغّله على macOS أو Linux أو Windows عبر WSL2).
- التثبيت: Google Play للتطبيق، وبدء الاستخدام للـ Gateway، ثم الإقران.
- 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، أو
- نفس شبكة Tailscale tailnet باستخدام Wide-Area Bonjour / unicast DNS-SD (انظر أدناه)، أو
- مضيف/منفذ Gateway يدوي (احتياطي)
- لا يستخدم إقران Android عبر tailnet/عام نقاط نهاية raw tailnet IP
ws://. استخدم Tailscale Serve أو عنوان URL آخر بصيغةwss://بدلًا من ذلك. - يمكنك تشغيل CLI (
openclaw) على جهاز الـ Gateway (أو عبر SSH).
1) ابدأ الـ Gateway
listening on ws://0.0.0.0:18789
wss:// / https://. إعداد gateway.bind: "tailnet" عادي لا يكفي لإقران Android عن بُعد للمرة الأولى ما لم تنه TLS بشكل منفصل أيضًا.
2) تحقق من الاكتشاف (اختياري)
من جهاز الـ Gateway: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. - كوّن Tailscale split DNS لنطاقك المختار بحيث يشير إلى خادم DNS ذلك.
3) اتصل من Android
في تطبيق Android:- يحافظ التطبيق على اتصال الـ Gateway حيًا عبر خدمة أمامية (إشعار مستمر).
- افتح تبويب الاتصال.
- استخدم وضع رمز الإعداد أو يدوي.
- إذا كان الاكتشاف محظورًا، فاستخدم المضيف/المنفذ اليدوي في عناصر التحكم المتقدمة. بالنسبة إلى مضيفي LAN الخاصة، يظل
ws://يعمل. وبالنسبة إلى مضيفي Tailscale/العامة، فعّل TLS واستخدم نقطة نهايةwss:/// Tailscale Serve.
- نقطة النهاية اليدوية (إذا كانت مفعّلة)، وإلا
- آخر Gateway مكتشف (بأفضل جهد).
منارات حضور alive
بعد اتصال جلسة العقدة المصادق عليها، وعندما ينتقل التطبيق إلى الخلفية بينما تكون الخدمة الأمامية لا تزال متصلة، يستدعي Androidnode.event مع
event: "node.presence.alive". يسجل الـ Gateway هذا كـ lastSeenAtMs/lastSeenReason في
بيانات تعريف العقدة/الجهاز المقترن فقط بعد معرفة هوية جهاز العقدة المصادق عليها.
يعدّ التطبيق المنارة مسجلة بنجاح فقط عندما تتضمن استجابة الـ Gateway
handled: true. قد تقر الـ Gateways الأقدم node.event مع { "ok": true }؛ هذه الاستجابة
متوافقة لكنها لا تُحتسب كتحديث دائم لآخر ظهور.
4) الموافقة على الإقران (CLI)
على جهاز الـ Gateway:role: node جديد
بلا نطاقات مطلوبة. لا يزال إقران المشغل/المتصفح وأي تغيير في الدور أو النطاق أو البيانات التعريفية أو
المفتاح العام يتطلب موافقة يدوية.
5) تحقق من أن العقدة متصلة
-
عبر حالة العُقد:
-
عبر Gateway:
6) الدردشة + السجل
يدعم تبويب الدردشة في 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 - تحديثات الدفع (بأفضل جهد):
chat.subscribe→event:"chat"
7) Canvas + الكاميرا
مضيف Gateway Canvas (موصى به لمحتوى الويب)
إذا كنت تريد أن تعرض العقدة HTML/CSS/JS حقيقيًا يمكن للوكيل تعديله على القرص، فوجه العقدة إلى مضيف canvas الخاص بالـ Gateway.تحمّل العُقد canvas من خادم HTTP الخاص بالـ Gateway (نفس منفذ
gateway.port، الافتراضي 18789).-
أنشئ
~/.openclaw/workspace/canvas/index.htmlعلى مضيف الـ Gateway. - انتقل بالعقدة إليه (LAN):
.local، مثل http://<gateway-magicdns>:18789/__openclaw__/canvas/.
يحقن هذا الخادم عميلاً لإعادة التحميل المباشر في 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)
8) الصوت + سطح أوامر Android الموسّع
- تبويب الصوت: لدى Android وضعا التقاط صريحان. الميكروفون هو جلسة يدوية في تبويب الصوت ترسل كل توقف مؤقت كدورة دردشة وتتوقف عندما يغادر التطبيق الواجهة أو يغادر المستخدم تبويب الصوت. التحدث هو وضع Talk مستمر ويواصل الاستماع حتى يتم إيقافه بالتبديل أو تنقطع العقدة.
- يرقّي وضع Talk الخدمة الأمامية الموجودة من
connectedDeviceإلىconnectedDevice|microphoneقبل بدء الالتقاط، ثم يخفضها عند توقف وضع Talk. تعلن خدمة العقدةFOREGROUND_SERVICE_CONNECTED_DEVICEمعCHANGE_NETWORK_STATE؛ ويتطلب Android 14+ أيضًا تصريحFOREGROUND_SERVICE_MICROPHONE، ومنح وقت التشغيلRECORD_AUDIO، ونوع خدمة الميكروفون في وقت التشغيل. - افتراضيًا، يستخدم Android Talk التعرف الأصلي على الكلام، ودردشة Gateway، و
talk.speakعبر مزود Talk المكوّن في الـ Gateway. يُستخدم TTS المحلي للنظام فقط عندما يكونtalk.speakغير متاح. - يستخدم Android Talk ترحيل Gateway بالزمن الحقيقي فقط عندما يكون
talk.realtime.modeهوrealtimeوtalk.realtime.transportهوgateway-relay. - يظل تنبيه الصوت معطلًا في تجربة مستخدم Android/وقت التشغيل.
- عائلات أوامر Android إضافية (يعتمد التوفر على الجهاز والأذونات وإعدادات المستخدم):
device.status،device.info،device.permissions،device.healthdevice.appsفقط عندما يكون الإعدادات > إمكانات الهاتف > التطبيقات المثبتة مفعّلًا؛ يسرد التطبيقات الظاهرة في المشغّل افتراضيًا.notifications.list،notifications.actions(راجع إعادة توجيه الإشعارات أدناه)photos.latestcontacts.search،contacts.addcalendar.events،calendar.addcallLog.searchsms.searchmotion.activity،motion.pedometer
نقاط دخول المساعد
يدعم Android تشغيل OpenClaw من مشغّل مساعد النظام (Google Assistant). عند تكوينه، يؤدي الضغط المطول على زر الصفحة الرئيسية أو قول “يا Google، اطلب من OpenClaw…” إلى فتح التطبيق وتمرير الطلب إلى محرر الدردشة. يستخدم هذا بيانات تعريف إجراءات التطبيق في Android المعلنة في بيان التطبيق. لا يلزم أي تكوين إضافي من جهة الـ Gateway — تتم معالجة نية المساعد بالكامل بواسطة تطبيق Android وتُمرر كرسالة دردشة عادية.يعتمد توفر App Actions على الجهاز وإصدار Google Play Services،
وما إذا كان المستخدم قد عيّن OpenClaw كتطبيق المساعد الافتراضي.
إعادة توجيه الإشعارات
يمكن لـ Android إعادة توجيه إشعارات الجهاز إلى الـ Gateway كأحداث. تتيح لك عدة عناصر تحكم تحديد نطاق الإشعارات التي تُعاد توجيهها ومتى.| المفتاح | النوع | الوصف |
|---|---|---|
notifications.allowPackages | string[] | أعد توجيه الإشعارات من أسماء الحزم هذه فقط. إذا ضُبط، فسيتم تجاهل جميع الحزم الأخرى. |
notifications.denyPackages | string[] | لا تعد توجيه الإشعارات أبدًا من أسماء الحزم هذه. يُطبّق بعد allowPackages. |
notifications.quietHours.start | string (HH:mm) | بداية نافذة ساعات الهدوء (وقت الجهاز المحلي). يتم كتم الإشعارات خلال هذه النافذة. |
notifications.quietHours.end | string (HH:mm) | نهاية نافذة ساعات الهدوء. |
notifications.rateLimit | number | الحد الأقصى للإشعارات المعاد توجيهها لكل حزمة في الدقيقة. تُسقط الإشعارات الزائدة. |
يتطلب توجيه الإشعارات إذن Android Notification Listener. يطلب التطبيق هذا الإذن أثناء الإعداد.