
تطبيق مفتوح المصدر لجانب الهاتف من Android Auto مع هندسة عكسية للبروتوكول، والمصادقة المتبادلة عبر TLS، وإسقاط الفيديو H.264، وإدخال اللمس، وبث بيانات الاستشعار عبر USB AOA.
تطبيق مفتوح المصدر لجانب الهاتف في نظام Android Auto. يعمل هذا التطبيق على هاتفك ويُعرض على وحدة الرأس في السيارة عبر USB، ليحل محل تطبيق Google الخاص com.google.android.projection.gearhead.
هذا المشروع في مراحل التطوير المبكرة. عملية المصافحة البروتوكولية وعرض الفيديو تعملان مع وحدة رأس حقيقية. يتم عرض شاشة الهاتف بنجاح على وحدة رأس السيارة لعدة ثوانٍ قبل انقطاع الاتصال (يتم تحسين استقرار الفيديو).
استخدم على مسؤوليتك الخاصة. هذا البرنامج مقدم "كما هو"، دون أي ضمان من أي نوع.
USB Plug-in → MainActivity → ProjectionService ↓ UsbAoaTransport (USB AOA accessory mode) ↓ MessageFramer (16KB frame fragmentation) ↓ InBandTls (TLSv1.2 via SSLEngine) ↓ ProtocolEngine (AAP state machine) ↓ ┌───────────┼───────────┐ Video Input Audio (H.264) (touch/keys) (PCM)
## الأخطاء المعروفة
- **افتراض ترتيب تعيين القناة** — نقوم بتعيين أول `av_channel` في SERVICE_DISCOVERY_RESPONSE كفيديو والثاني كصوت. يعمل هذا مع وحدة الرأس في السيارة (القناة 1 = فيديو) ولكن يفشل مع openauto (القناة 4 = صوت، وليس فيديو). الإصلاح: تحليل حقل `stream_type` داخل `av_channel` لتمييز `VIDEO(3)` عن `AUDIO(1)`.
- **استقرار الفيديو** — ينقطع الاتصال بعد البث الممتد بسبب تجاوز سعة المخزن المؤقت USB لوحدة الرأس. انظر نتائج الاختبار أدناه.
- **ظهور الجهاز مكررًا على وحدة الرأس** — تعرض صفحة الهاتف الذكي لوحدة الرأس تطبيقنا كمدخلين منفصلين (واحد لـ Android Auto وآخر لـ Bluetooth) بدلاً من إدخال واحد بكلتا الإمكانيتين. يحدث هذا بسبب منع Android 12+ الوصول إلى عنوان Bluetooth MAC الحقيقي (يعيد `02:00:00:00:00:00`). الحل البديل: كتابة العنوان الحقيقي إلى ملف إعدادات عبر `adb shell "echo $(adb shell settings get secure bluetooth_address) > /sdcard/Android/data/org.openandroidauto/files/bt_address.txt"`. نحتاج إلى شاشة إعدادات واجهة مستخدم للسماح للمستخدم بإدخال عنوان BT MAC يدويًا.
- **زر المساعد الصوتي لا تتم معالجته** — عندما يضغط السائق على زر الصوت/المساعد على وحدة الرأس، نتلقى طلب VOICE_SESSION_REQUEST ونحاول تشغيل مساعد صوتي (Dicio أو الافتراضي للنظام). ومع ذلك، لا يتلقى المساعد المشغل الصوت من ميكروفون وحدة الرأس بعد.
### نتائج اختبار استقرار الفيديو
نمط اختبار (أشرطة الألوان) بدقة 800x480، فاصل الإطارات I ثانية واحدة:
| FPS | معدل البت | تجزئة | المدة | الإطارات | الحالة |
|-----|--------|----------|--------|--------|--------|
| 30 | 2Mbps | لا | ~3ث | ~90 | ❌ سريع جدًا |
| 15 | 2Mbps | لا | ~33ث | ~500 | ⚠️ أفضل |
| 10 | 2Mbps | لا | ~93ث | ~930 | ⚠️ جيد |
| 30 | 2Mbps | نعم (2KB) | 5-25ث | 150-750 | ⚠️ متغير |
| 30 | 500Kbps | نعم (2KB) | ~54ث | ~1691 | ⚠️ أفضل |
| 15 | 250Kbps | نعم (2KB) | ~67ث+ | 1000+ | ⚠️ جيد |
| 30 | 250Kbps | نعم (2KB)، I=5ث | ~20ث | ~600 | ❌ أسوأ مع إطار I طويل |
| 15 | 250Kbps | لا | ~13ث | ~200 | ❌ التجزئة ساعدت هنا |
السبب الجذري: تجاوز سعة المخزن المؤقت لاستقبال USB لوحدة الرأس مع الإنتاجية العالية المستمرة. معدل بيانات أقل = اتصال أطول.
**أفضل إعداد مؤكد:** 10 إطارات في الثانية، 2 ميجابت في الثانية، بدون تجزئة = 93 ثانية. تنفيذ التجزئة قبل التشفير معطل (لا تستطيع وحدة الرأس إعادة التجميع) — يحتاج إلى مزيد من التحقيق.