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

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

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

Android SDK APIs ที่พร้อมใช้งานสำหรับนักพัฒนาแอปพลิเคชัน Android นั้นไม่มีการเปลี่ยนแปลง

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

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

ตัวอย่างต่อไปนี้จาก ไลบรารีซอร์สโค้ด Accessory Development Kit 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 ที่มีอยู่ในโหมดอุปกรณ์เสริม:

เวอร์ชัน รหัสผลิตภัณฑ์ การสื่อสาร คำอธิบาย
เอโอเอวี1 0x2D00 อุปกรณ์เสริม จัดเตรียมจุดสิ้นสุดจำนวนมากสองจุดสำหรับการสื่อสารกับแอปพลิเคชัน Android
0x2D01 อุปกรณ์เสริม+adb เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่องในระหว่างการพัฒนาอุปกรณ์เสริม ใช้ได้เฉพาะในกรณีที่ผู้ใช้เปิดใช้งาน การแก้ไขจุดบกพร่อง USB ในการตั้งค่าอุปกรณ์ Android
AOAv2 0x2D02 เสียง สำหรับการสตรีมเสียงจากอุปกรณ์ Android ไปยังอุปกรณ์เสริม
0x2D03 เสียง + ADB
0x2D04 อุปกรณ์เสริม + เครื่องเสียง
0x2D05 อุปกรณ์+เครื่องเสียง+adb

รหัสผลิตภัณฑ์ที่ใช้ใน AOAv1 ( 0x2D00 และ 0x2D01 ) ยังคงได้รับการสนับสนุนใน AOAv2

รองรับเสียง

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

การสนับสนุน HID คือพร็อกซีสำหรับเหตุการณ์ HID มาตรฐาน การใช้งานไม่ได้ตั้งสมมติฐานเกี่ยวกับเนื้อหาหรือประเภทของเหตุการณ์ และเพียงส่งผ่านไปยังระบบอินพุต ทำให้อุปกรณ์เสริม AOAv2 ทำหน้าที่เป็นอุปกรณ์ HID ใดๆ (เมาส์ คีย์บอร์ด ตัวควบคุมเกม ฯลฯ) คุณสามารถใช้การสนับสนุน HID เพื่อมอบฟังก์ชันพื้นฐาน เช่น ปุ่มเล่น/หยุดชั่วคราวบนแท่นมีเดีย หรือสำหรับฟังก์ชันขั้นสูง เช่น แท่นเชื่อมต่อพร้อมเมาส์และแป้นพิมพ์ QWERTY เต็มรูปแบบ

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

  • ACCESSORY_REGISTER_HID ลงทะเบียนอุปกรณ์ HID ใหม่กับอุปกรณ์ Android อุปกรณ์เสริมจะมี ID ที่ใช้ระบุอุปกรณ์ HID สำหรับการโทรอีกสามครั้ง ID นี้ใช้ได้จนกว่า USB จะตัดการเชื่อมต่อหรือจนกว่าอุปกรณ์เสริมจะส่ง ACCESSORY_UNREGISTER_HID เพื่อยกเลิกการลงทะเบียนอุปกรณ์ HID
  • ACCESSORY_UNREGISTER_HID ยกเลิกการลงทะเบียนอุปกรณ์ HID ที่ลงทะเบียนไว้ก่อนหน้านี้กับ ACCESSORY_REGISTER_HID
  • ACCESSORY_SET_HID_REPORT_DESC ส่งคำอธิบายรายงานสำหรับอุปกรณ์ HID ไปยังอุปกรณ์ Android คำขอนี้ใช้เพื่ออธิบายความสามารถของอุปกรณ์ HID และจะต้องส่งก่อนที่จะรายงานเหตุการณ์ HID ใด ๆ ไปยังอุปกรณ์ Android หากตัวอธิบายรายงานมีขนาดใหญ่กว่าขนาดแพ็คเก็ตสูงสุดสำหรับจุดสิ้นสุดที่เป็นศูนย์ คำสั่ง 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 หลังจากที่อุปกรณ์เข้าสู่โหมดอุปกรณ์เสริม