Android Open Accessory 2.0

เอกสารนี้อธิบายการเปลี่ยนแปลงในโปรโตคอลอุปกรณ์เสริมแบบเปิดของ 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 หลังจากที่อุปกรณ์เข้าสู่โหมดอุปกรณ์เสริม