อุปกรณ์เสริมแบบเปิดของ Android 1.0

อุปกรณ์เสริม USB ของ Android ต้องเป็นไปตามโปรโตคอลอุปกรณ์เสริมแบบเปิดของ Android (AOA) ซึ่งกำหนดวิธีตรวจหาและตั้งค่าการสื่อสารกับอุปกรณ์ที่ใช้ Android อุปกรณ์เสริมควรทำตามขั้นตอนต่อไปนี้

  1. รอและตรวจหาอุปกรณ์ที่เชื่อมต่อ
  2. ตรวจสอบการรองรับโหมดอุปกรณ์เสริมของอุปกรณ์
  3. พยายามเปิดอุปกรณ์ในโหมดอุปกรณ์เสริม (หากจำเป็น)
  4. หากอุปกรณ์รองรับ AOA ให้สร้างการสื่อสารกับอุปกรณ์

ส่วนต่อไปนี้จะอธิบายวิธีใช้ขั้นตอนเหล่านี้

รอและตรวจหาอุปกรณ์ที่เชื่อมต่อ

อุปกรณ์เสริมควรตรวจสอบอุปกรณ์ Android ที่เชื่อมต่ออยู่อย่างต่อเนื่อง เมื่ออุปกรณ์เชื่อมต่อแล้ว อุปกรณ์เสริมควรระบุว่าอุปกรณ์รองรับโหมดอุปกรณ์เสริมหรือไม่

ตรวจสอบการรองรับโหมดอุปกรณ์เสริม

หมายเหตุ: คุณไม่จำเป็นต้องใช้การแก้ไขข้อบกพร่อง USB เพื่อเชื่อมต่ออุปกรณ์เสริม แต่อาจต้องใช้ ADB ในระหว่างการพัฒนา โปรดดูรายละเอียดที่หัวข้อ ข้อควรพิจารณาเกี่ยวกับการแก้ไขข้อบกพร่อง

เมื่ออุปกรณ์ที่ทำงานด้วยระบบ Android เชื่อมต่อ อุปกรณ์อาจอยู่ในสถานะใดสถานะหนึ่งต่อไปนี้

  • รองรับโหมดอุปกรณ์เสริมของ Android และอยู่ในโหมดอุปกรณ์เสริมอยู่แล้ว
  • รองรับโหมดอุปกรณ์เสริมของ Android แต่ไม่ได้อยู่ในโหมดอุปกรณ์เสริม
  • ไม่รองรับโหมดอุปกรณ์เสริมของ Android

ในระหว่างการเชื่อมต่อครั้งแรก อุปกรณ์เสริมควรตรวจสอบเวอร์ชัน รหัสผู้ให้บริการ และรหัสผลิตภัณฑ์ของข้อบ่งชี้อุปกรณ์ USB ของอุปกรณ์ที่เชื่อมต่อ รหัสผู้ให้บริการควรตรงกับรหัสของ Google (0x18D1) หากอุปกรณ์อยู่ในโหมดอุปกรณ์เสริมอยู่แล้ว รหัสผลิตภัณฑ์ควรเป็น 0x2D00 หรือ 0x2D01 และอุปกรณ์เสริมสามารถสื่อสารกับอุปกรณ์ผ่านปลายทางการโอนข้อมูลจำนวนมากโดยใช้โปรโตคอลการสื่อสารของตัวเอง (อุปกรณ์ไม่จำเป็นต้องเริ่มต้นในโหมดอุปกรณ์เสริม)

หมายเหตุ: 0x2D00 สงวนไว้สำหรับอุปกรณ์ที่ใช้ Android ซึ่งรองรับโหมดอุปกรณ์เสริม 0x2D01 สงวนไว้สำหรับอุปกรณ์ที่รองรับโหมดอุปกรณ์เสริมและโปรโตคอล Android Debug Bridge (ADB) ซึ่งแสดงอินเทอร์เฟซที่ 2 ที่มีปลายทางแบบเป็นกลุ่ม 2 รายการสำหรับ ADB คุณสามารถใช้ปลายทางเหล่านี้เพื่อแก้ไขข้อบกพร่องของแอปพลิเคชันอุปกรณ์เสริมได้หากกำลังจำลองอุปกรณ์เสริมในคอมพิวเตอร์ โดยทั่วไปแล้ว อย่าใช้อินเทอร์เฟซนี้ เว้นแต่ว่าอุปกรณ์เสริมจะใช้การส่งต่อไปยัง ADB ในอุปกรณ์

หากเวอร์ชัน รหัสผู้ให้บริการ หรือรหัสผลิตภัณฑ์ในข้อบ่งชี้อุปกรณ์ USB ไม่ตรงกับค่าที่คาดไว้ อุปกรณ์เสริมจะไม่สามารถระบุได้ว่าอุปกรณ์รองรับโหมดอุปกรณ์เสริม Android หรือไม่ อุปกรณ์เสริมควรพยายามเริ่มอุปกรณ์ในโหมดอุปกรณ์เสริม (ดูรายละเอียดด้านล่าง) เพื่อดูว่าอุปกรณ์รองรับหรือไม่

ประเด็นสำคัญ: อุปกรณ์เสริม USB ต้องส่งส่วนหัวเมื่อจับมือกันครั้งแรก ส่วนหัวจะมีข้อมูลผู้ผลิต รุ่น และเวอร์ชัน แม้ว่าเวอร์ชันจะเป็นช่องที่ไม่บังคับ แต่หากติดตั้งแอป Android ที่ตรงกันเฉพาะเวอร์ชัน แต่อุปกรณ์เสริมไม่ได้ส่งเวอร์ชัน อุปกรณ์ Android ที่ใช้ Android 10 และต่ำกว่าจะรีบูตเนื่องจากระบบพบข้อยกเว้นในกระบวนการ

พยายามเริ่มในโหมดอุปกรณ์เสริม

หากเวอร์ชัน ผู้ให้บริการ และรหัสผลิตภัณฑ์ไม่ตรงกับอุปกรณ์ที่ทำงานด้วยระบบ Android ในโหมดอุปกรณ์เสริม อุปกรณ์เสริมจะไม่สามารถระบุได้ว่าอุปกรณ์รองรับ (แต่ไม่ได้อยู่ใน) โหมดอุปกรณ์เสริมหรือไม่ หรืออุปกรณ์ไม่รองรับโหมดอุปกรณ์เสริม กรณีนี้อาจเกิดขึ้นเนื่องจากอุปกรณ์ที่รองรับโหมดอุปกรณ์เสริม (แต่ไม่ได้อยู่ในโหมดอุปกรณ์เสริม) จะรายงานผู้ให้บริการและรหัสผลิตภัณฑ์ของผู้ผลิตอุปกรณ์ในตอนแรกแทนผู้ให้บริการและรหัสผลิตภัณฑ์ AOA

อุปกรณ์เสริมควรพยายามเริ่มอุปกรณ์ในโหมดอุปกรณ์เสริมเพื่อดูว่าอุปกรณ์รองรับโหมดนั้นหรือไม่ โดยทำดังนี้

  1. ส่งคําขอควบคุม 51 ("Get Protocol") เพื่อระบุว่าอุปกรณ์รองรับโปรโตคอลอุปกรณ์เสริม Android หรือไม่ หากอุปกรณ์รองรับโปรโตคอล ระบบจะแสดงผลลัพธ์เป็นตัวเลขที่ไม่ใช่ 0 ซึ่งแสดงถึงเวอร์ชันโปรโตคอลที่รองรับ คำขอควบคุมอยู่ในปลายทาง 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

หากขั้นตอนใดขั้นตอนหนึ่งไม่สำเร็จ อุปกรณ์เสริมจะระบุว่าอุปกรณ์ไม่รองรับโหมดอุปกรณ์เสริม Android และรอให้อุปกรณ์เครื่องถัดไปเชื่อมต่อ

สร้างการสื่อสารกับอุปกรณ์

หากอุปกรณ์เสริมตรวจพบอุปกรณ์ที่ทำงานด้วยระบบ Android ในโหมดอุปกรณ์เสริม อุปกรณ์เสริมจะค้นหาอินเทอร์เฟซของอุปกรณ์และตัวระบุปลายทางเพื่อรับปลายทางจำนวนมากสำหรับการสื่อสารกับอุปกรณ์ได้

จำนวนอินเทอร์เฟซและปลายทางแบบเป็นกลุ่มจะขึ้นอยู่กับรหัสผลิตภัณฑ์ อุปกรณ์ที่ทำงานด้วยระบบ Android ซึ่งมีรหัสผลิตภัณฑ์ต่อไปนี้

  • 0x2D00 มีอินเทอร์เฟซ 1 รายการที่มีปลายทางกลุ่ม 2 รายการสําหรับการสื่อสารข้อมูลเข้าและออก
  • 0x2D01 มีอินเทอร์เฟซ 2 รายการที่มีปลายทางกลุ่ม 2 รายการสําหรับการสื่อสารอินพุตและเอาต์พุต อินเทอร์เฟซแรกจัดการการสื่อสารแบบมาตรฐาน ส่วนอินเทอร์เฟซที่ 2 จัดการการสื่อสาร ADB หากต้องการใช้อินเทอร์เฟซ ให้ค้นหาปลายทางอินพุตและเอาต์พุตจํานวนมากแรก กําหนดค่ากําหนดค่าอุปกรณ์เป็นค่า 1 ด้วยคําขออุปกรณ์ SET_CONFIGURATION (0x09) จากนั้นสื่อสารโดยใช้ปลายทาง