Android Open Accessory 프로토콜 1.0

Android USB 액세서리는 액세서리에서 Android 지원 기기를 감지하고 설정하는 방법을 정의하는 Android Open Accessory(AOA) 프로토콜을 준수해야 합니다. 액세서리는 다음 단계를 실행해야 합니다.

  1. 잠시 기다린 다음 연결된 기기를 감지합니다.
  2. 기기의 액세서리 모드 지원을 확인합니다.
  3. 액세서리 모드에서 기기를 시작해 봅니다(필요한 경우).
  4. 기기가 AOA를 지원하는 경우 기기와의 통신을 설정합니다.

다음 섹션에서는 이러한 단계를 구현하는 방법을 설명합니다.

대기 후 연결된 기기 감지

액세서리는 연결된 Android 기기에 대해 지속적으로 확인해야 합니다. 기기가 연결되면 액세서리에서 기기의 액세서리 모드 지원 여부를 확인해야 합니다.

액세서리 모드 지원 확인

Android 기기가 연결되면 다음 세 가지 상태 중 하나일 수 있습니다.

  • Android 액세서리 모드를 지원하며 이미 액세서리 모드입니다.
  • Android 액세서리 모드를 지원하지만 액세서리 모드에 있지 않습니다.
  • Android 액세서리 모드를 지원하지 않습니다.

처음 연결할 때는 액세서리에서 연결된 기기의 USB 기기 설명자에서 버전, 공급업체 ID, 제품 ID를 확인해야 합니다. 공급업체 ID는 Google의 ID(0x18D1)와 일치해야 합니다. 기기가 이미 액세서리 모드인 경우 제품 ID는 0x2D00 또는 0x2D01이어야 하며 액세서리는 자체 통신 프로토콜을 사용하여 대량 전송 엔드포인트를 통해 기기와의 통신을 설정할 수 있습니다. 기기를 액세서리 모드에서 시작할 필요는 없습니다.

참고: 0x2D00은 액세서리 모드를 지원하는 Android 지원 기기에 예약되어 있습니다. 0x2D01은 액세서리 모드를 지원하는 기기뿐 아니라 ADB용 대량 엔드포인트가 두 개 있는 두 번째 인터페이스를 노출하는 Android 디버그 브리지(ADB) 프로토콜에 예약되어 있습니다. 컴퓨터에서 액세서리를 시뮬레이션하는 경우 이러한 엔드포인트를 사용하여 액세서리 애플리케이션을 디버깅할 수 있습니다. 액세서리가 기기에서 adb로의 패스 스루를 구현하지 않는 한 일반적으로 이 인터페이스를 사용하지 않습니다.

USB 기기 설명자의 버전, 공급업체 ID 또는 제품 ID가 예상 값과 일치하지 않으면 액세서리에서 기기가 Android 액세서리 모드를 지원하는지를 확인할 수 없습니다. 액세서리는 아래에 설명된 액세서리 모드에서 기기를 시작하여 기기 지원을 확인해야 합니다.

요점: USB 액세서리는 초기 핸드셰이크 시 헤더를 전송해야 합니다. 헤더에는 제조업체, 모델, 버전이 포함됩니다. 버전 입력은 선택사항입니다. 단, 일치하는 액세서리 버전과만 페어링되는 Android 앱이 설치되어 있지만 액세서리가 버전을 보내지 않는 경우 시스템 프로세스에서 예외가 발생하여 Android 10 이하의 기기가 재부팅됩니다.

액세서리 모드에서 시작 시도

액세서리 모드에서 버전, 공급업체 ID, 제품 ID가 Android 기기와 상응하지 않는 경우 액세서리에서 기기가 액세서리 모드를 지원하지만 액세서리 모드에 있지 않은지 또는 액세서리 모드를 지원하지 않는지를 구분할 수 없습니다. 이러한 상황은 액세서리 모드를 지원하지만 액세서리 모드에 있지 않은 기기에서 AOA 공급업체 및 제품 ID 대신 기기 제조업체 및 제품 ID를 초기에 보고하기 때문에 발생할 수 있습니다.

액세서리는 액세서리 모드에서 기기를 시작하여 기기가 이 모드를 지원하는지 확인해야 합니다.

  1. 기기가 Android 액세서리 프로토콜을 지원하는지 확인하기 위해 51 제어 요청('프로토콜 가져오기')을 전송합니다. 기기가 프로토콜을 지원하면 지원되는 프로토콜 버전을 나타내는 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)
    
  2. 기기가 지원되는 프로토콜 버전을 반환하면 문자열 정보를 식별하는 제어 요청을 기기로 전송합니다. 이 정보를 통해 기기에서 액세서리에 적합한 애플리케이션을 결정하거나 적합한 애플리케이션이 없는 경우 사용자에게 URL을 제공할 수 있습니다. 제어 요청은 다음 특성을 가진 각 문자열 ID의 엔드포인트 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
    

    다음 문자열 ID가 지원되며 각 문자열(0으로 끝나야 함, \0)의 최대 크기는 256바이트이어야 합니다.

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. 기기에 액세서리 모드로 시작하도록 요청하는 제어 요청을 보냅니다. 제어 요청은 엔드포인트 0에서 다음과 같은 특성을 가집니다.
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

이러한 단계를 완료하면 액세서리는 연결된 USB 기기가 버스에 액세서리 모드로 다시 장착될 때까지 기다린 후 연결된 기기를 다시 열거합니다. 알고리즘은 기기가 액세서리 모드로 전환된 경우 공급업체 및 제품 ID를 확인하여 액세서리 모드 지원 여부를 판단합니다. 액세서리 모드로 성공적으로 전환되었다면 공급업체 및 제품 ID가 맞아야 합니다(예를 들어, 기기 제조업체 ID 대신 Google의 공급업체 및 제품 ID에 상응). 올바른 버전과 ID라면 액세서리에서 기기와의 통신을 설정합니다.

참고: 현재 AOA는 동시 AOA 및 MTP 연결을 지원하지 않습니다. AOA에서 MTP로 전환하려면 먼저 USB 기기를 물리적 또는 전기적으로 분리하고 MTP를 사용하여 다시 연결해야 합니다.

이 중 하나의 단계라도 실패하는 경우 액세서리에서 기기가 Android 액세서리 모드를 지원하지 않는다고 판단하고 다음 기기가 연결될 때까지 대기합니다.

기기와 통신 설정

액세서리가 액세서리 모드에서 Android 지원 기기를 감지하면 기기 인터페이스 및 엔드포인트 설명자를 쿼리하여 기기와 통신하기 위한 대량 엔드포인트를 가져올 수 있습니다.

Android 지원 기기의 인터페이스 수와 대량 엔드포인트는 제품 ID에 따라 다음과 같이 다릅니다.

  • 제품 ID가 0x2D00이면 입력 및 출력 통신을 위한 두 개의 대량 엔드포인트가 있는 인터페이스가 하나 있습니다.
  • 제품 ID가 0x2D01이면 각각 입력 및 출력 통신을 위한 두 개의 대량 엔드포인트가 있는 인터페이스가 두 개 있습니다. 첫 번째 인터페이스는 표준 통신을 처리하고 두 번째 인터페이스는 ADB 통신을 처리합니다. 인터페이스를 사용하려면 첫 번째 대량 입출력 엔드포인트를 찾고 SET_CONFIGURATION(0x09) 기기 요청을 통해 기기 설정의 값을 1로 설정하여 엔드포인트를 사용해 통신하세요.