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

เอกสารนี้อธิบายการเปลี่ยนแปลงในโปรโตคอล Android Open Accessory (AOA) นับตั้งแต่การเปิดตัวและเวอร์ชันเสริม เอกสารประกอบเกี่ยวกับ AOA 1.0 AOAv2 เพิ่มฟีเจอร์ดังต่อไปนี้

  • เอาต์พุตเสียง (เลิกใช้งานแล้วใน Android 8.0)
  • การรองรับอุปกรณ์เสริมซึ่งทำหน้าที่เป็นอุปกรณ์ที่มีอินเทอร์เฟซของบุคคลตั้งแต่ 1 เครื่องขึ้นไป (HID) ไปยังอุปกรณ์ Android

API ของ Android SDK ที่นักพัฒนาแอป Android ใช้งานได้นั้นไม่มีการเปลี่ยนแปลง

ตรวจหาการสนับสนุน AOAv2

เพื่อดูว่าอุปกรณ์ Android ที่เชื่อมต่อรองรับอุปกรณ์เสริมหรือไม่ และ เวอร์ชันโปรโตคอลที่รองรับ อุปกรณ์เสริมต้องส่ง getProtocol() และตรวจสอบผลลัพธ์ อุปกรณ์ Android ที่รองรับเฉพาะฟีเจอร์ ใน AOAv1 ต้องแสดงผล 1 เป็นเวอร์ชันโปรโตคอล อุปกรณ์ที่ รองรับฟีเจอร์เพิ่มเติมใน AOAv2 จะต้องแสดงผล 2 เป็น เวอร์ชันโปรโตคอล AOAv2 เข้ากันได้แบบย้อนหลังกับ AOAv1 ดังนั้นอุปกรณ์เสริม ที่ออกแบบมาสำหรับโปรโตคอลอุปกรณ์เสริมเดิมจะยังคงใช้งานได้กับ Android รุ่นใหม่กว่า อุปกรณ์

ตัวอย่างต่อไปนี้จากชุดเครื่องมือพัฒนาอุปกรณ์เสริม 2011 ซอร์สโค้ด (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) ของไลบรารีสาธิตการตรวจสอบโปรโตคอลนี้:

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 Audio Class มาตรฐานที่รองรับ 2 ช่องสัญญาณ 16 บิต เสียง PCM ที่มีอัตราบิต 44,100 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 อนุญาตให้อุปกรณ์เสริมลงทะเบียน USB Human Interface หนึ่งหรือหลายรายการ อุปกรณ์ (HID) กับอุปกรณ์ Android วิธีนี้กลับทิศทางของ การสื่อสารสำหรับอุปกรณ์ USB HID ทั่วไป เช่น เมาส์และแป้นพิมพ์ USB โดยปกติแล้ว อุปกรณ์ HID คืออุปกรณ์ต่อพ่วงที่เชื่อมต่อกับโฮสต์ USB (ได้แก่ คอมพิวเตอร์ส่วนบุคคล) แต่ใน AOA โฮสต์ USB สามารถทำหน้าที่เป็นอินพุต เข้ากับอุปกรณ์ต่อพ่วง 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 การกำหนดค่าหลังจากที่อุปกรณ์เข้าสู่โหมดอุปกรณ์เสริมแล้ว