لمحة للمطورين عن Android Open Accessories

تحدثنا سابقاً عن التقنية الجديدة التي طورتها غوغل لربط العالم الفيزيائي بهواتف وتطبيقات أندرويد Android Open Accessory. تستطيع الضغط هنا لمزيد من المعلومات إن لم تكن قد سمعت عنها بعد. هذه التقنية ستقدم لمطوري التطبيقات ومصنعي الهاردوير أفكاراً خلاقة ستنتج عنها آلاف التطبيقات التي ستجعل حياة مستخدمي أندرويد أسهل وأكثر عملية.

اليوم كتبت غوغل في مدونة مطوري أندرويد مقالة مختصرة قدمت فيها للواجهات البرمجية التي أتيحت للمطورين (بدءاً من أندرويد 2.3.4 وما فوق) وشرحت فيها بشكل بسيط كيف يمكن أن يبدأ بالتطوير باستخدامها من أحب من المطورين. المقالة موجهة للمطورين لكنها سهلة للقراءة والفهم حتى بالنسبة لغير المطورين لهذا قمنا بترجمتها وأنصح الجميع بقراءتها لأخذ فكرة أكثر عمقاً عن ماهية Android Open Accessories وكيف تعمل:

في الماضي لم يكن الوصول إلى المنفذ التسلسلي العام USB متاحاً للمبرمجين. وفي الأسبوع الماضي قمنا بالإعلان عن الواجهات البرمجية APIs الخاصة بـ Android Open Accessory. هذه الواجهات البرمجية تسمح للملحقات (Accessories) التي تعمل عبر USB بالاتصال بأجهزة أندرويد التي تعمل على أندرويد 3.1 أو أندرويد 2.3.4 بدون أي ترخيص أو رسوم خاصة. إن “وضعية الملحقات” (accessory mode) لا تتطلب من الجهاز الذي يعمل بأندرويد أن يدعم وضعية USB Host (الوضعية التي تسمح للجهاز بالعمل كمُضيف لأجهزة USB).ستركز هذه المقالة على وضعية الملحقات accessory mode, مع العلم بأننا أعلنا دعم الواجهات البرمجية الخاصة بوضعية USB Host للأجهزة التي تقدر على دعمها من الناحية العتادية.

حتى نفهم لماذا لا يكفي وجود منفذ تسلسلي لدعم الملحقات دعونا نلقي نظرة سريعة على كيفية عمل المنفذ التسلسلي. المنفذ التسلسلي العام USB هو بروتوكول غير متماثل asymmetric حيث يؤدي أحد الأطراف دور المُضيف USB Host وجميع الأطراف الأخرى دور الأجهزة USB Devices. في عالم الكمبيوتر, يلعب الكمبيوتر المحمول أو الكمبيوتر المكتبي دور المُضيف وتلعب طابعتك أو فأرتك أو كاميرا الويب .. الخ دور جهاز الـ USB. لمُضيف USB مهمتين هامتين: الأولى هي أن يتحكم (أو ما يسمى في علم هندسة الحاسوب بـ Bust Mastering) في أي من الأجهزة يرسل البيانات في كل مرة. الثانية هي تزويد الطاقة.

المشكلة في دعم الملحقات في أندرويد بالطريقة التقليدية هي أن عدداً قليلاً نسبياً من الأجهزة يدعم وضعية المُضيف Host mode. لهذا جاء رد أندرويد بقلب الوضعية المتعارف عليها للناقل التسلسلي رأساً على عقب.في وضعية الملحقات accessory mode يلعب الهاتف أو الحاسب اللوحي بنظام أندرويد دور الجهاز USB Device وتلعب الملحقات دور المضيف USB Host. هذا يعني بأن الجهاز المُلحق هو المُتحكم Bus Master وهو الذي يقوم بالتزويد بالطاقة.

تأسيس الاتصال

إن عملية بناء جهاز ملحق مفتوح Open Accessory هي عملية بسيطة طالما قمت بتوفير مُضيف USB واستطعت تزويد الطاقة للجهاز بنظام أندرويد. تحتاج القطعة الملحقة بتنفيذ عملية مصافحة بسيطة handshake لتأسيس اتصال ثنائي الاتجاه مع التطبيق الذي يعمل على جهاز أندرويد.

تبدأ عملية المصافحة عندما يكتشف الجهاز الملحق بأنه قد تم وصل الجهاز به. سيقوم جهاز أندرويد بالتعريف بنفسه عبر رمز الشركة المُصنعة VID/PID المناسب بحسب الشركة التي قامت بتصنيع الجهاز أو طراز الجهاز. بعد ذلك يقوم الجهاز الملحق بإرسال إشارة تحكم لجهاز أندرويد يسأله فيها إذا ما كان يدعم وضعية الملحقات accessory mode.

وبمجرد أن يؤكد الجهاز الملحق بأن جهاز أندرويد يدعم وضعية الملحقات, يقوم بإرسال سلسلة من العبارات إلى جهاز أندرويد باستخدام إشارات التحكم. هذه العبارات تسمح لجهاز أندرويد بالتعرف على التطبيقات المتوافقة بالإضافة إلى توفير رابط يقوم أندرويد باستخدامه إن لم يتم العثور على التطبيق المناسب. بعد ذلك يقوم الجهاز الملحق بإرسال إشارة تحكم لجهاز أندرويد يطلب منه فيه الدخول في وضعية الملحقات.

يقوم بعد ذلك جهاز أندرويد بالظهور برمز المُصنّع ورمز المنتج (ما يعرف ب VID/PID). يُعبر رمز VID/PID عن جهاز أندرويد في وضعية الملحقات, وبالنسبة لغوغل فالرموز الخاصة بها هي: VID 0X18D1, و PID 0x2D01 أو 0x2D00. بمجرد أن يبدأ التطبيق المناسب بالتشغيل من طرف أندرويد, يستطيع الجهاز الملحق الآن التواصل معه.

من السهل تطبيق البروتوكول على الجهاز الملحق الخاص بك. إذا كنت تستخدم الـ ADK أو طبقة USB Host متوافقة مع Arduino تستطيع استخدام مكتبة ملحقات أندرويد AndroidAccessory library لتنفيذ البروتوكول. إن الـ ADK هو أحد الطرق السهلة كي تبدأ بها مع وضعية الملحقات, لكن أي جهاز ملحق يمتلك المتطلبات العتادية المطلوبة ويتحدث البروتوكول المشروح هنا والمذكور بالتفصيل في التوثيق الخاص به.

التواصل مع الملحقات

بعد أن يتم التواصل منخفض المستوى عبر منفذ الناقل التسلسلي بين جهاز أندرويد والجهاز الملحق, يتم تسليم التحكم إلى أحد تطبيقات أندرويد. يمكن أن يتم تسجيل أي تطبيق أندرويد كي يتعامل مع الاتصال بأي ملحقات USB. هذه هي طريقة التصريح عن هذا ضمن ملف AndroidManifest.xml:


    
        
    

    

وهنا كيفية تعريف الملحقات التي تدعمها الأنشطة في أندرويد Activity


    

يقوم نظام أندرويد بإرسال إشارة بأن أحد ملحقات أندرويد أصبحت متوفرة عبر إطلاق Intent ثم سيتم عرض مربع حوار للمستخدم يسأله عن التطبيق الذي يجب فتحه. يسمح بروتوكول وضعية الملحقات للجهاز الملحق بتحديد رابط كي يتم عرضه على المستخدم إن لم يتم العثور على تطبيق يعرف كيف يتواصل مع الجهاز الملحق. يمكن لهذا الرابط أن يشير إلى تطبيق في سوق أندرويد مصمم لاستخدام هذه الجهاز الملحق.

بعد فتح التطبيق فإنه يستخدم الواجهات البرمجية الخاصة بـ Android Open Accessory الموجودة في الحزمة التطويرية SDK للتواصل مع الجهاز الملحق. وهذا يسمح بفتح FileInputStream وحيد و FileOutputStream وحيد لإرسال واستقبال البيانات. أما البروتوكول الذي يستخدمه التطبيق والجهاز الملحق فهو حينها عائد إليهم كي يقوموا بتحديده.

هذا الكود هو مثال تستطيع استخدامه لفتح الاتصال:

public class UsbAccessoryActivity extends Activity {
    private FileInputStream mInput;
    private FileOutputStream mOutput;

    private void openAccessory() {
        UsbManager manager = UsbManager.getInstance(this);
        UsbAccessory accessory = UsbManager.getAccessory(getIntent());

        ParcelFileDescriptor fd = manager.openAccessory(accessory);

        if (fd != null) {
            mInput = new FileInputStream(fd);
            mOutput = new FileOutputStream(fd);
        } else {
            // Oh noes, the accessory didn’t open!
        }
    }
}

التوجه المستقبلي

لدينا بعض الأفكار بالنسبة للمستقبل. أحد القضايا هي أننا نريد أن نحل مشكلة الطاقة. من الغريب نوعاً ما لشيء مثل عداد الخطوات أن يقوم بتوفير الطاقة لجهاز النيكسوس إس الخاص بك عندما يقوم بتحميل معلومات المشي اليومية. نقوم بالتحقيق في طرق نستطيع من خلالها جعل مضيف المنفذ التسلسلي أن يقوم بالتحكم فقط وليس بتزويد الطاقة. التخزين والاستماع للموسيقى على الهاتف يبدو أمراً شائعاً لهذا نريد دعم الصوت عبر المنفذ التسلسلي audio over USB. وأخيراً, العثور على طريقة للهواتف كي تدعم أجهزة الإدخال الشائعة قد تسمح للمستخدمين أن يكونوا أكثر إنتاجية. جميع هذه الميزات مثيرة ونأمل أن تصبح مدعومة في نسخة مستقبلية من أندرويد.

إن وضعية الأجهزة الملحقة تفتح أندرويد أمام عالم من الاحتمالات الجديدة.لا نستطيع الانتظار حتى نرى ما الذي سيأتي به الناس. الوثائق والنماذج موجودة. إحصل عليها!

[Android Developers Blog]

أنس المعراوي

مؤسس موقع أردرويد. إضافةً إلى عملي كرئيس تحرير للموقع، أعمل كذلك كمطوّر لتطبيقات أندرويد في ألمانيا.

لمتابعتي على تويتر: [email protected]

التعليقات: 6 ضع تعليقك

سطام الحربي يقول:

مقال رائع

كل الشكر لك اخي أنس على الترجمة.

قرأته على عجل ، وما فهمته هو أنه سيكون هنالك وضعيه ثالثه ( غير الداونلود ، والريكفري ) وهي وضعية الملحقات .

Dr.K يقول:

حسب المكتوب هنا:
http://developer.android.com/guide/topics/usb/adk.html
فإنه لا يمكن البرمجة إلا بعد إمتلاك لوحة الآردوينو المخصصة و التي تقارب قيمتها 400 دولا
http://www.rt-net.jp/shop/index.php?main_page=product_info&cPath=3_4&products_id=1
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2919&param=en546070

بينما لوحات الآردوينة العادية أسعارها تتراوح بين 20-40 دولار !!
فهل هناك طريقة أستطيع فيها إستخدام لوحات الآدروينو العادية (خصوصاً لوحة Uno)
http://www.amazon.com/Arduino-UNO-board/dp/B004CG4CN4/ref=sr_1_1?ie=UTF8&qid=1305906685&sr=8-1

وهل هناك طريقة بسيطة للبرمجة مثل App Inventor for Android اللذي يستخدم لبرمجة التطبيقات من قبل المستخخدمين العاديين
http://appinventor.googlelabs.com/about/

Dr.K يقول:

أيضاً أود أن أنبه بأن لوحة الآردوينو المخصصة للأندرويد
http://www.rt-net.jp/shop/index.php?main_page=popup_image&pID=1
ليست إلا نسخة معدلة من اللوحة المسماة MEGA 2560 (سعرها حولي 60 دولار)
http://www.eshtre.com/store/images/ArduinoMegaFront.jpg
حتى أنه عندما توصل لوحة الآندرويد فإن برنامج الآردوينو يتعرف عليها باسم MEGA 2560

عبدالله يقول:

شكرا اخ انس على الموضوع الشيق والجميل ,
سؤالي , من هذا الكلام يتبين انه اصبح من الممكن على المبرمجين الوصول الى منفذ usb بسهوله وبرجته ,
هل يعني هذا مثلا القدره على برمجة منفذ جهاز سوني اريكسون X10 اللذي لايدعم ال TVout وجعله يدعم ؟

ali يقول:

الموضوع حلو بس ايمتا بدنا كمستخدمين نستفيد من هاد الشي

الصراحة انا اشكر اندرويد على الانجاز العظيم هذا

Leave a Reply

Your email address will not be published. Required fields are marked *