تطبيق Android (العقدة)
ملاحظة: لم يتم إصدار تطبيق Android للعامة بعد. الشيفرة المصدرية متاحة في مستودع OpenClaw ضمنapps/android. يمكنك بناؤه بنفسك باستخدام Java 17 وAndroid SDK (./gradlew :app:assemblePlayDebug). راجع apps/android/README.md للحصول على تعليمات البناء.
لمحة سريعة عن الدعم
- الدور: تطبيق عقدة مرافق (لا يستضيف Android الـ Gateway).
- هل يتطلب Gateway؟ نعم (شغّله على macOS أو Linux أو Windows عبر WSL2).
- التثبيت: البدء + الاقتران.
- Gateway: دليل التشغيل + الإعدادات.
- البروتوكولات: بروتوكول Gateway (العقد + مستوى التحكم).
التحكم في النظام
يوجد التحكم في النظام (launchd/systemd) على مضيف Gateway. راجع Gateway.
دليل تشغيل الاتصال
تطبيق عقدة Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway يتصل Android مباشرة بـ Gateway WebSocket ويستخدم اقتران الجهاز (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 الوصول إلى Gateway WebSocket:
- على الشبكة المحلية نفسها باستخدام mDNS/NSD، أو
- على tailnet نفسها في Tailscale باستخدام Wide-Area Bonjour / unicast DNS-SD (انظر أدناه)، أو
- مضيف/منفذ gateway يدويًا (تراجع)
- لا يستخدم اقتران Android المحمول عبر tailnet/public نقاط نهاية 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. بالإضافة إلى النطاق واسع المجال المهيأ في تمريرة واحدة ويستخدم
نقطة نهاية الخدمة المحلولة بدلًا من تلميحات TXT فقط.
اكتشاف tailnet (Vienna ⇄ London) عبر unicast DNS-SD
لن يعبر اكتشاف Android باستخدام NSD/mDNS الشبكات. إذا كانت عقدة Android وgateway على شبكتين مختلفتين لكنهما متصلتان عبر Tailscale، فاستخدم Wide-Area Bonjour / unicast DNS-SD بدلًا من ذلك. لا يكفي الاكتشاف وحده لاقتران Android عبر tailnet/public. فما يزال المسار المكتشف يحتاج إلى نقطة نهاية آمنة (wss:// أو Tailscale Serve):
- أعد منطقة DNS-SD (مثل
openclaw.internal.) على مضيف gateway وانشر سجلات_openclaw-gw._tcp. - اضبط Tailscale split DNS للنطاق الذي اخترته مع توجيهه إلى خادم DNS ذلك.
3) اتصل من Android
في تطبيق Android:- يحافظ التطبيق على اتصال gateway حيًا عبر خدمة foreground (إشعار دائم).
- افتح علامة التبويب Connect.
- استخدم وضع Setup Code أو Manual.
- إذا كان الاكتشاف محظورًا، فاستخدم المضيف/المنفذ اليدويين في Advanced controls. بالنسبة إلى مضيفات LAN الخاصة، لا يزال
ws://يعمل. أما بالنسبة إلى مضيفات Tailscale/public، ففعّل TLS واستخدم نقطة نهايةwss:/// Tailscale Serve.
- نقطة النهاية اليدوية (إن كانت مفعلة)، وإلا
- آخر Gateway مكتشف (بأفضل جهد).
4) وافق على الاقتران (CLI)
على جهاز gateway:5) تحقّق من أن العقدة متصلة
-
عبر حالة العقد:
-
عبر Gateway:
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 (بأفضل جهد):
chat.subscribe→event:"chat"
7) Canvas + الكاميرا
Gateway Canvas Host (موصى به لمحتوى الويب)
إذا كنت تريد أن تعرض العقدة 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/.
يقوم هذا الخادم بحقن عميل live-reload في HTML ويعيد التحميل عند تغيّر الملفات.
ويقع مضيف A2UI عند http://<gateway-host>:18789/__openclaw__/a2ui/.
أوامر Canvas (foreground فقط):
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)
8) الصوت + سطح أوامر Android الموسع
- الصوت: يستخدم Android تدفق تشغيل/إيقاف واحدًا للميكروفون في علامة التبويب Voice مع التقاط النص المفرغ وتشغيل
talk.speak. ويتم استخدام TTS المحلي للنظام فقط عندما لا يكونtalk.speakمتاحًا. ويتوقف الصوت عندما يغادر التطبيق foreground. - تمت إزالة مفاتيح Voice wake/talk-mode حاليًا من تجربة 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…” إلى فتح التطبيق وتمرير prompt إلى محرر الدردشة. يستخدم هذا بيانات App Actions الوصفية في Android المعلنة في manifest الخاص بالتطبيق. ولا يلزم أي إعداد إضافي على جانب 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. ويطلب التطبيق هذا أثناء الإعداد.