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