אביזר פתוח לאנדרואיד 1.0

אביזרי USB של Android חייבים לציית לפרוטוקול Android Open Accessory (AOA), המגדיר כיצד אביזר מזהה ומגדיר תקשורת עם מכשיר המופעל על ידי אנדרואיד. אביזרים צריכים לבצע את השלבים הבאים:

  1. המתן וזיהוי התקן מחובר.
  2. קבע את תמיכת מצב האביזרים של המכשיר.
  3. נסה להפעיל את המכשיר במצב אביזר (במידת הצורך).
  4. אם ההתקן תומך ב-AOA, צור תקשורת עם ההתקן.

הסעיפים הבאים מסבירים כיצד ליישם את השלבים הללו.

המתן וזיהוי התקנים מחוברים

אביזרים צריכים לבדוק כל הזמן מכשירים מחוברים המופעלים על ידי אנדרואיד. כאשר התקן מחובר, האביזר צריך לקבוע אם ההתקן תומך במצב אביזר.

קבע תמיכה במצב אביזר

הערה: איתור באגים ב-USB אינו נדרש לחיבור אביזרים, אך ייתכן שיהיה צורך ב-ADB במהלך הפיתוח. לפרטים, ראה שיקולי ניפוי באגים .

כאשר מכשיר מבוסס אנדרואיד מתחבר, הוא יכול להיות באחד משלושה מצבים:

  • תומך במצב אביזר אנדרואיד וכבר נמצא במצב אביזר.
  • תומך במצב אביזר אנדרואיד אבל הוא לא במצב אביזר.
  • אינו תומך במצב אביזר אנדרואיד.

במהלך החיבור הראשוני, האביזר צריך לבדוק את הגרסה, מזהה הספק ומזהה המוצר של מתאר התקן ה-USB של ההתקן המחובר. מזהה הספק צריך להתאים למזהה של Google ( 0x18D1 ). אם המכשיר כבר נמצא במצב אביזר, מזהה המוצר צריך להיות 0x2D00 או 0x2D01 והאביזר יכול ליצור תקשורת עם המכשיר דרך נקודות קצה של העברה בכמות גדולה באמצעות פרוטוקול תקשורת משלו (אין צורך להפעיל את המכשיר במצב אביזר).

הערה: 0x2D00 שמור למכשירים המופעלים על ידי אנדרואיד התומכים במצב אביזרים. 0x2D01 שמור למכשירים התומכים במצב אביזר וכן בפרוטוקול Android Debug Bridge (ADB), אשר חושף ממשק שני עם שתי נקודות קצה בכמות גדולה עבור ADB. אתה יכול להשתמש בנקודות קצה אלה לאיתור באגים ביישום האביזר אם אתה מדמה את האביזר במחשב. באופן כללי, אל תשתמש בממשק זה אלא אם האביזר מיישם מעבר ל-ADB במכשיר.

אם הגרסה, מזהה הספק או מזהה המוצר בתיאור מכשיר ה-USB אינם תואמים לערכים הצפויים, האביזר אינו יכול לקבוע אם המכשיר תומך במצב אביזרי אנדרואיד. האביזר צריך לנסות להפעיל את המכשיר במצב אביזר (מפורט להלן) כדי לקבוע את תמיכת המכשיר.

נקודת מפתח: אביזר USB חייב לשלוח כותרת עם לחיצת יד ראשונית. הכותרת מכילה את היצרן, הדגם והגרסה. למרות שהגרסה היא שדה אופציונלי, אם מותקנת אפליקציית אנדרואיד התואמת רק לגרסה, אך האביזר אינו שולח גרסה, מכשירי אנדרואיד הפועלים על אנדרואיד 10 ומטה יתאתחלו עקב חריג שנזרק בתהליך המערכת.

נסה להתחיל במצב אביזר

אם מזהי הגרסה, הספק ומזהי המוצר אינם תואמים למכשיר המופעל באמצעות אנדרואיד במצב אביזר, האביזר אינו יכול לקבוע אם המכשיר תומך (אך אינו נמצא) במצב אביזר או אם המכשיר אינו תומך במצב אביזר. זה יכול להתרחש מכיוון שמכשירים התומכים במצב אביזר (אך אינם במצב אביזר) מדווחים תחילה על מזהי יצרן המכשיר ומזהי המוצר במקום על מזהי הספק ומזהי המוצר של AOA .

האביזר צריך לנסות להפעיל את המכשיר במצב אביזר כדי לקבוע אם המכשיר תומך במצב זה:

  1. שלח בקשת שליטה 51 ("קבל פרוטוקול") כדי לקבוע אם המכשיר תומך בפרוטוקול אביזר אנדרואיד. אם ההתקן תומך בפרוטוקול, הוא מחזיר מספר שאינו אפס המייצג את גרסת הפרוטוקול הנתמכת. בקשת הבקרה נמצאת בנקודת קצה 0 עם המאפיינים הבאים:
    requestType:    USB_DIR_IN | USB_TYPE_VENDOR
    request:        51
    value:          0
    index:          0
    data:           protocol version number (16 bits little endian sent from the
                    device to the accessory)
    
  2. אם המכשיר מחזיר גרסת פרוטוקול נתמכת, שלח בקשת בקרה עם פרטי מחרוזת מזהה למכשיר. מידע זה מאפשר למכשיר לקבוע אפליקציה מתאימה לאביזר (או להציג כתובת URL למשתמש אם לא קיימת אפליקציה מתאימה). בקשת הבקרה נמצאת בנקודת קצה 0 (עבור כל מזהה מחרוזת) עם המאפיינים הבאים:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    מזהי המחרוזת הבאים נתמכים, עם גודל מקסימלי של 256 בתים עבור כל מחרוזת (יש להסתיים באפס עם \0 ).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. שלח בקשת שליטה כדי לבקש מהמכשיר להתחיל במצב אביזר. בקשת הבקרה נמצאת בנקודת קצה 0 עם המאפיינים הבאים:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

לאחר השלמת שלבים אלה, האביזר צריך להמתין עד שהתקן ה-USB המחובר יציג את עצמו מחדש באפיק במצב אביזר, ואז למנות מחדש את ההתקנים המחוברים. האלגוריתם קובע תמיכה במצב אביזרים על ידי בדיקת מזהי הספק והמוצר, שאמורים להיות נכונים (לדוגמה, להתאים למזהי הספק והמוצר של Google במקום לזהות יצרן המכשיר) אם המכשיר עבר בהצלחה למצב אביזר. אם המזהים והגרסה נכונים, האביזר זז כדי ליצור תקשורת עם המכשיר .

הערה: AOA אינו תומך כעת בחיבורי AOA ו-MTP בו זמנית. כדי לעבור מ-AOA ל-MTP, על האביזר לנתק תחילה את התקן ה-USB (באופן פיזי או באופן שווה ערך חשמלי) ולאחר מכן לחבר מחדש באמצעות MTP.

אם שלב כלשהו נכשל, האביזר קובע שהמכשיר אינו תומך במצב אביזר אנדרואיד וממתין לחיבור המכשיר הבא.

צור תקשורת עם המכשיר

אם האביזר מזהה מכשיר המופעל באמצעות אנדרואיד במצב אביזר, האביזר יכול לבצע שאילתות בממשק המכשיר ובמתארי נקודות הקצה כדי להשיג את נקודות הקצה בכמות גדולה לתקשורת עם המכשיר.

מספר הממשקים ונקודות הקצה בכמות גדולה תלוי במזהה המוצר. מכשיר מבוסס אנדרואיד עם מזהה מוצר של:

  • 0x2D00 יש ממשק אחד עם שתי נקודות קצה בתפזורת לתקשורת קלט ופלט.
  • ל 0x2D01 שני ממשקים עם שתי נקודות קצה בכמות גדולה כל אחת לתקשורת קלט ופלט. הממשק הראשון מטפל בתקשורת רגילה והממשק השני מטפל בתקשורת ADB. כדי להשתמש בממשק, אתר את נקודות הקצה הראשונות של קלט ופלט בתפזורת, הגדר את תצורת ההתקן לערך של 1 עם בקשת התקן SET_CONFIGURATION ( 0x09 ), ולאחר מכן תקשר באמצעות נקודות הקצה.