Android Open Accessory 1.0

Phụ kiện USB Android phải tuân thủ giao thức Phụ kiện mở Android (AOA). Giao thức này xác định cách một phụ kiện phát hiện và thiết lập giao tiếp với một thiết bị chạy Android. Phụ kiện nên thực hiện các bước sau:

  1. Chờ và phát hiện thiết bị đã kết nối.
  2. Xác định khả năng hỗ trợ chế độ phụ kiện của thiết bị.
  3. Cố gắng khởi động thiết bị ở chế độ phụ kiện (nếu cần).
  4. Nếu thiết bị hỗ trợ AOA, hãy thiết lập giao tiếp với thiết bị.

Các phần sau đây giải thích cách triển khai các bước này.

Chờ và phát hiện các thiết bị được kết nối

Phụ kiện phải liên tục kiểm tra các thiết bị chạy Android đã kết nối. Khi một thiết bị được kết nối, phụ kiện sẽ xác định xem thiết bị đó có hỗ trợ chế độ phụ kiện hay không.

Xác định khả năng hỗ trợ chế độ phụ kiện

Lưu ý: Bạn không cần phải gỡ lỗi qua USB để kết nối các phụ kiện, nhưng có thể cần đến ADB trong quá trình phát triển. Để biết thông tin chi tiết, hãy xem phần Những điều cần cân nhắc khi gỡ lỗi.

Khi kết nối, thiết bị chạy Android có thể ở một trong ba trạng thái:

  • Hỗ trợ chế độ phụ kiện Android và đang ở chế độ phụ kiện.
  • Hỗ trợ chế độ phụ kiện Android nhưng không ở chế độ phụ kiện.
  • Không hỗ trợ chế độ phụ kiện Android.

Trong lần kết nối đầu tiên, phụ kiện phải kiểm tra phiên bản, mã nhà cung cấp và mã sản phẩm của mô tả thiết bị USB của thiết bị đã kết nối. Mã nhà cung cấp phải khớp với mã của Google (0x18D1). Nếu thiết bị đã ở chế độ phụ kiện, mã sản phẩm phải là 0x2D00 hoặc 0x2D01 và phụ kiện có thể thiết lập giao tiếp với thiết bị thông qua các điểm cuối chuyển hàng loạt bằng cách sử dụng giao thức giao tiếp riêng (không cần khởi động thiết bị ở chế độ phụ kiện).

Lưu ý: 0x2D00 được dành riêng cho các thiết bị chạy Android hỗ trợ chế độ phụ kiện. 0x2D01 được dành riêng cho các thiết bị hỗ trợ chế độ phụ kiện cũng như giao thức Cầu gỡ lỗi Android (ADB). Giao thức này hiển thị một giao diện thứ hai với hai điểm cuối hàng loạt cho ADB. Bạn có thể sử dụng các điểm cuối này để gỡ lỗi ứng dụng phụ kiện nếu đang mô phỏng phụ kiện trên máy tính. Nhìn chung, bạn không nên sử dụng giao diện này trừ phi phụ kiện triển khai tính năng chuyển tiếp đến ADB trên thiết bị.

Nếu phiên bản, mã nhà cung cấp hoặc mã sản phẩm trong mô tả thiết bị USB không khớp với các giá trị dự kiến, thì phụ kiện không thể xác định xem thiết bị có hỗ trợ chế độ phụ kiện Android hay không. Phụ kiện phải cố gắng khởi động thiết bị ở chế độ phụ kiện (chi tiết bên dưới) để xác định khả năng hỗ trợ thiết bị.

Lưu ý quan trọng: Thiết bị phụ kiện USB phải gửi một tiêu đề khi bắt tay ban đầu. Tiêu đề chứa nhà sản xuất, kiểu máy và phiên bản. Mặc dù phiên bản là một trường không bắt buộc, nhưng nếu một ứng dụng Android được cài đặt chỉ khớp với phiên bản, nhưng phụ kiện không gửi phiên bản, thì các thiết bị Android chạy trên Android 10 trở xuống sẽ khởi động lại do một ngoại lệ được gửi trong quy trình hệ thống.

Cố gắng khởi động ở chế độ phụ kiện

Nếu mã phiên bản, nhà cung cấp và sản phẩm không tương ứng với một thiết bị chạy Android ở chế độ phụ kiện, thì phụ kiện không thể xác định liệu thiết bị có hỗ trợ (nhưng không ở) chế độ phụ kiện hay không hỗ trợ chế độ phụ kiện. Điều này có thể xảy ra vì các thiết bị hỗ trợ chế độ phụ kiện (nhưng không ở chế độ phụ kiện) ban đầu báo cáo mã sản phẩm và nhà cung cấp của nhà sản xuất thiết bị thay vì mã sản phẩm và nhà cung cấp AOA.

Phụ kiện nên cố gắng khởi động thiết bị ở chế độ phụ kiện để xác định xem thiết bị có hỗ trợ chế độ đó hay không:

  1. Gửi yêu cầu điều khiển 51 ("Get Protocol" (Lấy giao thức)) để xác định xem thiết bị có hỗ trợ giao thức phụ kiện Android hay không. Nếu thiết bị hỗ trợ giao thức, thì thiết bị sẽ trả về một số khác 0 đại diện cho phiên bản giao thức được hỗ trợ. Yêu cầu điều khiển nằm trên điểm cuối 0 với các đặc điểm sau:
    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. Nếu thiết bị trả về phiên bản giao thức được hỗ trợ, hãy gửi yêu cầu điều khiển kèm theo thông tin chuỗi nhận dạng đến thiết bị. Thông tin này cho phép thiết bị xác định một ứng dụng phù hợp cho phụ kiện (hoặc hiển thị URL cho người dùng nếu không có ứng dụng phù hợp). Yêu cầu kiểm soát nằm trên điểm cuối 0 (cho mỗi mã chuỗi) với các đặc điểm sau:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    Các mã nhận dạng chuỗi sau đây được hỗ trợ, với kích thước tối đa là 256 byte cho mỗi chuỗi (phải kết thúc bằng 0 với \0).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Gửi yêu cầu điều khiển để yêu cầu thiết bị khởi động ở chế độ phụ kiện. Yêu cầu điều khiển nằm trên điểm cuối 0 với các đặc điểm sau:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

Sau khi hoàn tất các bước này, phụ kiện sẽ chờ thiết bị USB đã kết nối tự giới thiệu lại trên bus ở chế độ phụ kiện, sau đó liệt kê lại các thiết bị đã kết nối. Thuật toán này xác định khả năng hỗ trợ chế độ phụ kiện bằng cách kiểm tra mã nhà cung cấp và mã sản phẩm. Các mã này phải chính xác (ví dụ: tương ứng với mã nhà cung cấp và mã sản phẩm của Google thay vì mã của nhà sản xuất thiết bị) nếu thiết bị chuyển sang chế độ phụ kiện thành công. Nếu mã nhận dạng và phiên bản chính xác, thì phụ kiện sẽ chuyển sang thiết lập giao tiếp với thiết bị.

Lưu ý: AOA hiện không hỗ trợ kết nối AOA và MTP đồng thời. Để chuyển từ AOA sang MTP, trước tiên, phụ kiện phải ngắt kết nối thiết bị USB (theo cách vật lý hoặc tương đương về điện) rồi kết nối lại bằng MTP.

Nếu có bước nào không thành công, phụ kiện sẽ xác định thiết bị không hỗ trợ chế độ phụ kiện Android và chờ thiết bị tiếp theo kết nối.

Thiết lập giao tiếp với thiết bị

Nếu phát hiện một thiết bị chạy Android ở chế độ phụ kiện, thì phụ kiện có thể truy vấn giao diện thiết bị và chỉ số mô tả điểm cuối để lấy các điểm cuối hàng loạt nhằm giao tiếp với thiết bị.

Số lượng giao diện và điểm cuối hàng loạt phụ thuộc vào mã sản phẩm. Một thiết bị chạy Android có mã sản phẩm là:

  • 0x2D00 có một giao diện với hai điểm cuối hàng loạt để giao tiếp đầu vào và đầu ra.
  • 0x2D01 có hai giao diện với hai điểm cuối hàng loạt, mỗi giao diện dùng để giao tiếp đầu vào và đầu ra. Giao diện đầu tiên xử lý giao tiếp tiêu chuẩn và giao diện thứ hai xử lý giao tiếp ADB. Để sử dụng giao diện, hãy xác định các điểm cuối đầu vào và đầu ra hàng loạt đầu tiên, đặt cấu hình thiết bị thành giá trị 1 bằng yêu cầu thiết bị SET_CONFIGURATION (0x09), sau đó giao tiếp bằng các điểm cuối.