เอกสารนี้อธิบายการเปลี่ยนแปลงในโปรโตคอลอุปกรณ์เสริมแบบเปิดของ Android (AOA) นับตั้งแต่รุ่นแรกและเป็นส่วนเสริมของเอกสารประกอบ AOA 1.0 AOAv2 จะมีฟีเจอร์ต่อไปนี้
- เอาต์พุตเสียง (เลิกใช้งานแล้วใน Android 8.0)
- รองรับอุปกรณ์เสริมที่ทำหน้าที่เป็นอุปกรณ์อินเทอร์เฟซผู้ใช้ (HID) อย่างน้อย 1 เครื่องกับอุปกรณ์ Android
API ของ Android SDK ที่พร้อมให้บริการแก่นักพัฒนาแอป Android จะไม่มีการเปลี่ยนแปลง
ตรวจหาการรองรับ AOAv2
หากต้องการตรวจสอบว่าอุปกรณ์ Android ที่เชื่อมต่อรองรับอุปกรณ์เสริมและเวอร์ชันโปรโตคอลที่รองรับหรือไม่ อุปกรณ์เสริมจะต้องส่งgetProtocol()
คำสั่งและตรวจสอบผลลัพธ์ อุปกรณ์ Android ที่รองรับเฉพาะฟีเจอร์ใน AOAv1 จะต้องแสดงผลเป็น 1
เป็นเวอร์ชันโปรโตคอล ส่วนอุปกรณ์ที่รองรับฟีเจอร์เพิ่มเติมใน AOAv2 จะต้องแสดงผลเป็น 2
เป็นเวอร์ชันโปรโตคอล AOAv2 ใช้งานร่วมกับ AOAv1 ได้ ดังนั้นอุปกรณ์เสริมที่ออกแบบมาสำหรับโปรโตคอลอุปกรณ์เสริมเดิมจะยังคงใช้งานได้กับอุปกรณ์ Android รุ่นใหม่ๆ
ตัวอย่างต่อไปนี้จากไลบรารีซอร์สโค้ด (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) ของชุดพัฒนาอุปกรณ์เสริม 2011 แสดงการตรวจสอบโปรโตคอลนี้
bool AndroidAccessory::switchDevice(byte addr) { int protocol = getProtocol(addr); if (protocol >= 1) { Serial.print("device supports protocol 1 or higher\n"); } else { Serial.print("could not read device protocol version\n"); return false; } sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer); sendString(addr, ACCESSORY_STRING_MODEL, model); sendString(addr, ACCESSORY_STRING_DESCRIPTION, description); sendString(addr, ACCESSORY_STRING_VERSION, version); sendString(addr, ACCESSORY_STRING_URI, uri); sendString(addr, ACCESSORY_STRING_SERIAL, serial); usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL); return true; }
AOAv2 มีรหัสผลิตภัณฑ์ USB ใหม่สำหรับชุดค่าผสมของอินเทอร์เฟซ USB แต่ละชุดที่พร้อมใช้งานในโหมดอุปกรณ์เสริม ดังนี้
เวอร์ชัน | รหัสผลิตภัณฑ์ | การสื่อสาร | คำอธิบาย |
---|---|---|---|
AOAv1 | 0x2D00 |
เครื่องประดับ | มีปลายทางแบบเป็นกลุ่ม 2 รายการสําหรับการสื่อสารกับแอป Android |
0x2D01 |
อุปกรณ์เสริม + adb | เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่องระหว่างการพัฒนาอุปกรณ์เสริม ใช้ได้เฉพาะในกรณีที่ผู้ใช้เปิดใช้การแก้ไขข้อบกพร่องผ่าน USB ในการตั้งค่าอุปกรณ์ Android | |
AOAv2 | 0x2D02 |
เสียง | สําหรับการสตรีมเสียงจากอุปกรณ์ Android ไปยังอุปกรณ์เสริม |
0x2D03 |
เสียง + adb | ||
0x2D04 |
อุปกรณ์เสริม + เสียง | ||
0x2D05 |
อุปกรณ์เสริม + เสียง + adb |
ระบบจะยังคงรองรับรหัสผลิตภัณฑ์ที่ใช้ใน AOAv1 (0x2D00
และ 0x2D01
) ใน AOAv2
การรองรับเสียง
AOAv2 รองรับเอาต์พุตเสียงจากอุปกรณ์ Android ไปยังอุปกรณ์เสริมผ่านอินเทอร์เฟซคลาสเสียง USB มาตรฐานที่รองรับเสียง PCM 2 แชนแนล 16 บิตที่มีอัตราบิต 44100 Khz (อาจเพิ่มโหมดเสียงอื่นๆ ในอนาคต)
หากต้องการเปิดใช้การสนับสนุนเสียง อุปกรณ์เสริมต้องส่งคำขอการควบคุม USB ใหม่ โดยทำดังนี้
**SET_AUDIO_MODE** requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 58 value: 0 for no audio (default), 1 for 2 channel, 16-bit PCM at 44100 KHz index: 0 data none
ต้องส่งคำสั่งนี้ก่อนส่งคำสั่ง ACCESSORY_START
เพื่อเข้าสู่โหมดอุปกรณ์เสริม
การรองรับ HID
AOAv2 อนุญาตให้อุปกรณ์เสริมลงทะเบียนอุปกรณ์อินเทอร์เฟซผู้ใช้ (HID) ผ่าน USB อย่างน้อย 1 เครื่องกับอุปกรณ์ Android แนวทางนี้จะกลับทิศทางการสื่อสารสำหรับอุปกรณ์ USB HID ทั่วไป เช่น เมาส์และแป้นพิมพ์ USB โดยปกติแล้ว อุปกรณ์ HID เป็นอุปกรณ์ต่อพ่วงที่เชื่อมต่อกับโฮสต์ USB (เช่น คอมพิวเตอร์ส่วนบุคคล) แต่ใน AOA โฮสต์ USB สามารถทำหน้าที่เป็นอุปกรณ์อินพุตอย่างน้อย 1 เครื่องต่ออุปกรณ์ต่อพ่วง USB
การรองรับ HID เป็นพร็อกซีสําหรับเหตุการณ์ HID มาตรฐาน การใช้งานจะไม่คาดเดาเนื้อหาหรือประเภทของเหตุการณ์และเพียงแค่ส่งผ่านไปยังระบบอินพุต ซึ่งช่วยให้อุปกรณ์เสริม AOAv2 ทํางานเป็นอุปกรณ์ HID ได้ (เมาส์ แป้นพิมพ์ อุปกรณ์ควบคุมเกม ฯลฯ) คุณสามารถใช้การรองรับ HID เพื่อมอบฟังก์ชันพื้นฐาน เช่น ปุ่มเล่น/หยุดชั่วคราวบนแท่นชาร์จอุปกรณ์สื่อ หรือเพื่อฟังก์ชันขั้นสูง เช่น แท่นชาร์จที่มีเมาส์และแป้นพิมพ์ QWERTY แบบเต็ม
AOAv2 เพิ่มคําขอการควบคุม USB ใหม่ซึ่งช่วยให้อุปกรณ์เสริมทําหน้าที่เป็นอุปกรณ์อินพุต HID อย่างน้อย 1 เครื่องในอุปกรณ์ Android ได้ การรองรับ HID จะจัดการผ่านคำขอควบคุมที่ปลายทาง 0 ทั้งหมด จึงไม่จำเป็นต้องมีอินเทอร์เฟซ USB ใหม่ คำขอควบคุมใหม่ 4 รายการ ได้แก่
- ACCESSORY_REGISTER_HID ลงทะเบียนอุปกรณ์ HID ใหม่กับอุปกรณ์ Android อุปกรณ์เสริมจะให้รหัสที่ใช้ระบุอุปกรณ์ HID สําหรับการเรียกอีก 3 ครั้ง รหัสนี้จะใช้งานได้จนกว่า USB จะตัดการเชื่อมต่อหรืออุปกรณ์เสริมจะส่ง
ACCESSORY_UNREGISTER_HID
เพื่อยกเลิกการลงทะเบียนอุปกรณ์ HID - ACCESSORY_UNREGISTER_HID ยกเลิกการลงทะเบียนอุปกรณ์ HID ที่ลงทะเบียนไว้ก่อนหน้านี้กับ
ACCESSORY_REGISTER_HID
- ACCESSORY_SET_HID_REPORT_DESC ส่งตัวบ่งชี้รายงานสำหรับอุปกรณ์ HID ไปยังอุปกรณ์ Android คำขอนี้ใช้เพื่ออธิบายความสามารถของอุปกรณ์ HID และต้องส่งก่อนรายงานเหตุการณ์ HID ไปยังอุปกรณ์ Android หากตัวระบุรายงานมีขนาดใหญ่กว่าขนาดแพ็กเก็ตสูงสุดสำหรับปลายทาง 0 ระบบจะส่งคำสั่ง
ACCESSORY_SET_HID_REPORT_DESC
หลายรายการเพื่อโอนตัวระบุทั้งหมด - ACCESSORY_SEND_HID_EVENT ส่งเหตุการณ์อินพุตจากอุปกรณ์เสริมไปยังอุปกรณ์ Android
คําจํากัดความของโค้ดสําหรับคําขอการควบคุมใหม่มีดังนี้
/* Control request for registering a HID device. * Upon registering, a unique ID is sent by the accessory in the * value parameter. This ID will be used for future commands for * the device * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_REGISTER_HID_DEVICE * value: Accessory assigned ID for the HID device * index: total length of the HID report descriptor * data none */ #define ACCESSORY_REGISTER_HID 54 /* Control request for unregistering a HID device. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_REGISTER_HID * value: Accessory assigned ID for the HID device * index: 0 * data none */ #define ACCESSORY_UNREGISTER_HID 55 /* Control request for sending the HID report descriptor. * If the HID descriptor is longer than the endpoint zero max packet size, * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC * commands. The data for the descriptor must be sent sequentially * if multiple packets are needed. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_SET_HID_REPORT_DESC * value: Accessory assigned ID for the HID device * index: offset of data in descriptor * (needed when HID descriptor is too big for one packet) * data the HID report descriptor */ #define ACCESSORY_SET_HID_REPORT_DESC 56 /* Control request for sending HID events. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_SEND_HID_EVENT * value: Accessory assigned ID for the HID device * index: 0 * data the HID report for the event */ #define ACCESSORY_SEND_HID_EVENT 57
ความสามารถในการทำงานร่วมกันกับ AOAv1
โปรโตคอลเดิม (AOAv1) รองรับแอป Android เพื่อสื่อสารกับโฮสต์ USB (อุปกรณ์เสริม) โดยตรงผ่าน USB AOAv2 จะยังคงรองรับการทำงานนี้และเพิ่มฟีเจอร์ใหม่ๆ เพื่ออนุญาตให้อุปกรณ์เสริมสื่อสารกับระบบปฏิบัติการ Android ได้โดยตรง (โดยเฉพาะระบบเสียงและระบบอินพุต) การออกแบบของ AOAv2 ทำให้สามารถสร้างอุปกรณ์เสริมที่ใช้การรองรับเสียงและ HID ใหม่ได้นอกเหนือจากชุดฟีเจอร์เดิม เพียงใช้ฟีเจอร์ใหม่ควบคู่ไปกับฟีเจอร์เดิม
เชื่อมต่อ AOAv2 โดยไม่มีแอป Android
คุณออกแบบอุปกรณ์เสริม (เช่น แท่นชาร์จที่มีเสียง) ที่ใช้เสียงและรองรับ HID ได้ แต่ไม่สื่อสารกับแอปในอุปกรณ์ Android สําหรับอุปกรณ์เสริมเหล่านี้ ผู้ใช้ไม่จําเป็นต้องได้รับการแจ้งเตือนแบบกล่องโต้ตอบเพื่อค้นหาและเชื่อมโยงอุปกรณ์เสริมที่เพิ่งต่อเข้ากับแอป Android ที่สื่อสารกับอุปกรณ์เสริมได้
หากต้องการปิดใช้กล่องโต้ตอบดังกล่าวหลังจากที่อุปกรณ์เสริมเชื่อมต่อแล้ว อุปกรณ์เสริมสามารถเลือกที่จะไม่ส่งชื่อผู้ผลิตและรุ่นไปยังอุปกรณ์ Android ได้ ในกรณีที่ไม่ได้ระบุสตริงเหล่านี้ให้กับอุปกรณ์ Android
- ระบบจะไม่พยายามค้นหาแอปเพื่อสื่อสารกับอุปกรณ์เสริม
- อินเทอร์เฟซ USB ของอุปกรณ์เสริมไม่อยู่ในการกำหนดค่า USB ของอุปกรณ์ Android หลังจากที่อุปกรณ์เข้าสู่โหมดอุปกรณ์เสริม