2012-12-21 21 views
7

Tôi khá mới phát triển Android và gần đây tôi đã khám phá Máy chủ lưu trữ USB.Phát triển Android bằng USB

Có ai có thể cho tôi biết cách sử dụng Chuyển số lượng lớn để tôi có thể xem camera bên ngoài nhìn thấy gì nhưng thay vào đó hiển thị trên máy tính bảng của tôi?

Camera: Canon Powershot A1300 Tablet: Iconia A200

Tôi đã nhìn quanh đống tràn và một số diễn đàn khác nhưng chưa thể tìm thấy một lời giải thích tốt về cách sử dụng chuyển số lượng lớn hoặc những gì hằng số để sử dụng làm tham số để truy xuất dữ liệu nhất định.

Tôi có thể xem các điểm cuối và thiết lập kết nối với camera bên ngoài nhưng tôi không biết phải đi đâu từ đây.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

14

API máy chủ lưu trữ USB trong Android khá mỏng, nghĩa là khi bạn đã vượt quá liệt kê các giao diện/điểm cuối và tạo kết nối, nó không hoạt động nhiều hơn để hỗ trợ bạn. Sau đó, bạn đang ở trong lĩnh vực giao tiếp với dữ liệu USB thô, định dạng tùy thuộc vào loại thiết bị mà máy ảnh của bạn đại diện. Yêu cầu của bạn là một phần của sâu, vì vậy tôi sẽ cố hết sức để cung cấp các tài nguyên hữu ích.

Thật không may, các thiết bị lưu trữ và phương tiện truyền thông không phải là các lớp thiết bị đơn giản nhất để giải thích, do đó có thể khó khăn nếu bạn chỉ bị ướt chân trên USB nói chung. Lời khuyên tốt nhất tôi có thể đưa ra là xem xét các thông số kỹ thuật của lớp thiết bị cho lớp giao diện mà máy ảnh của bạn báo cáo (hầu hết là Mass Storage hoặc MTP), có thể tìm thấy tại đây: http://www.usb.org/developers/devclass_docs

Tài liệu đặc tả sẽ liệt kê các lệnh bạn cần sử dụng để giao tiếp với thiết bị. Tôi cũng khuyên bạn nên kiểm tra USB In a Nutshell, một công cụ tuyệt vời chỉ ra cách các yêu cầu USB được xây dựng nói chung, có thể giúp bạn lập bản đồ những gì bạn thấy trong tài liệu đặc tả cho các tham số được tìm thấy trong các phương thức UsbDeviceConnection: http://www.beyondlogic.org/usbnutshell/usb1.shtml

Có thể sẽ có một số lệnh điều khiển bạn cần gửi tới "điểm cuối 0" ban đầu để thiết lập máy ảnh, và sau đó các lần chuyển còn lại có thể sẽ diễn ra trên các điểm cuối số lượng lớn.

Trong điều khoản Android, yêu cầu kiểm soát chỉ có thể được gửi đồng bộ bằng cách sử dụng UsbDeviceConnection.controlTransfer(), có nghĩa là phương pháp này sẽ chặn cho đến khi quá trình chuyển hoàn tất. Các tham số điền vào phương thức này được tìm thấy trong tài liệu đặc tả cho lớp thiết bị của bạn.

Yêu cầu về điểm cuối hàng loạt có thể được gửi đồng bộ qua UsbDeviceConnection.bulkTransfer() HOẶC không đồng bộ bằng cách sử dụng phiên bản UsbRequest. Với UsbRequest bạn có thể xếp hàng chuyển khoản và sau đó kiểm tra lại (qua số UsbDeviceConnection.requestWait()) để biết kết quả.

Tôi có một số ví dụ trên trang Github của tôi khi sử dụng API máy chủ để thực hiện một số lệnh ngắt và kiểm soát cơ bản để nhận thông tin như mô tả thiết bị. Có lẽ một số trong đó sẽ rất hữu ích đối với bạn cũng như: https://github.com/devunwired/accessory-samples


Liên quan đến câu hỏi của bạn về mã ví dụ USB:

Yêu cầu thực hiện trong mã này chỉ là một generic "Nhận Cấu hình Descriptor" yêu cầu tất cả các thiết bị USB phải đáp ứng (đó là một lệnh cốt lõi, không phải là lớp cụ thể).Trong thực tế, yêu cầu của nó nơi API Android nhận được thông tin bạn có thể truy vấn cho giao diện và điểm cuối. Các giá trị trường đến từ Đặc tả USB lõi (lệnh này được xác định cụ thể tại mục 9.4.3 và 9.6.3 trong thông số 3.0): http://www.usb.org/developers/docs/ hoặc mô tả hữu ích hơn mà bạn có thể tìm thấy từ USB trong Nutshell, có nhiều hơn một chút thảo luận: http://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors

Độ dài hơi tùy ý, điều này cho trình điều khiển biết số byte cần đọc hoặc ghi. Hầu hết các trình điều khiển máy chủ USB đầu tiên sẽ truy vấn bộ mô tả thiết bị, bao gồm một trường cho biết máy chủ lưu trữ Kích thước gói tối đa mà thiết bị hỗ trợ và sau đó sẽ sử dụng kích thước đó làm độ dài cho các yêu cầu trong tương lai. Một trình điều khiển đầy đủ tính năng có thể sẽ thực hiện lệnh này và sau đó kiểm tra byte độ dài đầu tiên (trường wTotalLength của bộ mô tả) để xem bộ đệm có đủ lớn và sửa đổi/gửi lại nếu không. Trong ví dụ này, tôi chỉ chọn 64 để đơn giản vì đó là kích thước gói tối đa "tối đa" mà giao thức xác định là có thể hỗ trợ.

Một lần nữa, sau đó thực hiện các yêu cầu của dữ liệu cụ thể mà thiết bị của bạn cung cấp, các lệnh này sẽ được tìm thấy trong tài liệu lớp cụ thể, không phải là đặc tả cốt lõi.

+0

Tôi đã lén nhìn xung quanh trang web vượt trội trước đó và có một chút rắc rối khi diễn giải rất nhiều và không thể tìm thấy mối quan hệ với phần android của nó. Tôi nhận thấy thiết bị được coi là cuối cùng tĩnh công cộng int USB_CLASS_STILL_IMAGE Tôi sẽ nghiên cứu kỹ bản pdf ngay bây giờ và xem những gì tôi có thể tìm thấy! Cảm ơn một lần nữa, (hy vọng tôi sẽ không gặp khó khăn!) –

+0

Tôi gặp một chút khó khăn khi tìm kiếm tính hữu ích của các yêu cầu thiết bị tiêu chuẩn vì tất cả dường như chỉ cung cấp siêu dữ liệu cho thiết bị. Tôi có đọc không chính xác không? Tôi đã ghi lại lớp, lớp con và mã giao thức cũng như dữ liệu điểm cuối tương ứng nhưng vẫn chưa khám phá bất kỳ lệnh nào có liên quan để gửi những gì máy ảnh nhìn thấy trên thiết bị. –

+0

Thông tin này là những gì bạn sẽ tìm thấy trong các tài liệu đặc tả lớp thiết bị. Ảnh tĩnh được liệt kê trên trang web tôi đã liên kết hoặc đây là liên kết trực tiếp đến tài liệu lớp đó. Cụ thể, Phần 7 thảo luận về quy trình làm việc với việc chụp ảnh: http://www.usb.org/developers/devclass_docs/usb_still_img10.pdf – Devunwired