อุปกรณ์เสริม Android Open 1.0

อุปกรณ์เสริม Android USB ต้องเป็นไปตามโปรโตคอล Android Open Accessory (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) ซึ่งเปิดเผยอินเทอร์เฟซที่สองพร้อมจุดสิ้นสุดจำนวนมากสองจุดสำหรับ ADB คุณสามารถใช้จุดสิ้นสุดเหล่านี้เพื่อแก้ไขข้อบกพร่องของแอปพลิเคชันเสริมได้ หากคุณกำลังจำลองอุปกรณ์เสริมบนคอมพิวเตอร์ โดยทั่วไป ห้ามใช้อินเทอร์เฟซนี้ เว้นแต่อุปกรณ์เสริมจะใช้การส่งผ่านไปยัง ADB บนอุปกรณ์

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

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

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

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

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

  1. ส่งคำขอควบคุม 51 ("รับโปรโตคอล") เพื่อตรวจสอบว่าอุปกรณ์รองรับโปรโตคอลอุปกรณ์เสริม Android หรือไม่ หากอุปกรณ์รองรับโปรโตคอล อุปกรณ์จะส่งกลับตัวเลขที่ไม่ใช่ศูนย์ซึ่งแสดงถึงเวอร์ชันโปรโตคอลที่รองรับ คำขอควบคุมอยู่ที่ปลายทาง 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 (สำหรับ ID สตริงแต่ละรายการ) โดยมีลักษณะดังต่อไปนี้:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    รองรับ ID สตริงต่อไปนี้ โดยมีขนาดสูงสุด 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 แทนที่จะเป็นรหัสของผู้ผลิตอุปกรณ์) หากอุปกรณ์เปลี่ยนเป็นโหมดอุปกรณ์เสริมได้สำเร็จ หาก ID และเวอร์ชันถูกต้อง อุปกรณ์เสริมจะเคลื่อนที่เพื่อ สร้างการสื่อสารกับอุปกรณ์

หมายเหตุ: ขณะนี้ AOA ยังไม่รองรับการเชื่อมต่อ AOA และ MTP พร้อมกัน หากต้องการเปลี่ยนจาก AOA เป็น MTP อุปกรณ์เสริมจะต้องถอดอุปกรณ์ USB ออกก่อน (ทั้งทางกายภาพหรือทางไฟฟ้าที่เทียบเท่า) จากนั้นจึงเชื่อมต่อใหม่โดยใช้ MTP

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

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

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

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

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