【问题标题】:Android Development Usb TransferAndroid开发Usb传输
【发布时间】:2012-12-09 11:33:46
【问题描述】:

我对 Android 开发还很陌生,最近一直在探索 Usb Host。

谁能告诉我如何使用批量传输,以便我可以看到外部摄像头看到的内容,而是将其显示在我的平板电脑上?

相机:佳能 Powershot A1300 平板电脑:Iconia A200

我查看了堆栈溢出和其他一些论坛,但还没有找到关于如何使用批量传输或将哪些常量用作检索某些数据的参数的良好解释。

我能够看到端点并建立与外部摄像头的连接,但我不知道从这里去哪里。

非常感谢任何帮助。

【问题讨论】:

    标签: android usb transfer


    【解决方案1】:

    Android 中的 USB 主机 API 相当薄,我的意思是,一旦您超越了枚举接口/端点并创建连接,它就不会为您提供更多帮助。然后,您就处于与原始 USB 数据传输进行通信的领域,其格式取决于您的相机所代表的设备类别。您的要求有点像虫子,所以我会尽力提供有用的资源。

    不幸的是,存储设备和媒体设备并不是最容易解释的设备类,所以如果您只是在 USB 上开始接触,可能会很困难。我能给出的最佳建议是查看您的相机报告的接口类的设备类规范(大多数是海量存储或 MTP),可以在这里找到:http://www.usb.org/developers/devclass_docs

    规范文档将列举您需要用来与设备通信的命令。我还建议您查看 USB In a Nutshell,它很好地指出了 USB 请求的一般构造方式,它可以帮助您将您在规范文档中看到的内容映射到在 @987654328 的方法中找到的参数@:http://www.beyondlogic.org/usbnutshell/usb1.shtml

    最初您可能需要向“端点 0”发送一些控制命令来设置摄像头,然后剩余的传输可能会通过批量端点进行。

    在 Android 术语中,控制请求只能使用UsbDeviceConnection.controlTransfer() 同步发送,这意味着此方法会阻塞,直到传输完成。填写此方法的参数可在您的设备类的规范文档中找到。

    批量端点上的请求可以通过UsbDeviceConnection.bulkTransfer() 同步发送或使用UsbRequest 实例异步发送。使用UsbRequest,您可以对传输进行排队,然后稍后返回(通过UsbDeviceConnection.requestWait())查看结果。

    我的 Github 页面上有一些使用主机 API 进行基本中断和控制传输以获取设备描述符等信息的示例。也许其中一些对您也有帮助:https://github.com/devunwired/accessory-samples


    关于您关于 USB 示例代码的问题:

    此代码中发出的请求只是所有 USB 设备必须响应的通用“获取配置描述符”请求(它是核心命令,不是特定于类的)。事实上,它是 Android API 获取您可以查询的接口和端点信息的请求。字段值来自核心 USB 规范(此命令在 3.0 规范中的第 9.4.3 和 9.6.3 节专门定义):http://www.usb.org/developers/docs/ 或者您可以从 USB in a Nutshell 中找到更有用的描述,它有一个更多讨论:http://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors

    长度有点随意,它告诉驱动程序要读取或写入多少字节。大多数 USB 主机驱动程序将首先查询设备描述符,其中包括一个告诉主机设备支持的最大数据包大小的字段,然后将使用该大小作为未来请求的长度。一个全功能的驱动程序可能会发出这个命令,然后首先检查长度字节(描述符的 wTotalLength 字段)以查看缓冲区是否足够大,如果没有则修改/重新发送。在示例中,为了简单起见,我只是选择了 64,因为这是协议定义为可支持的“最大”最大数据包大小。

    再一次,然后请求您的设备必须提供的特定数据,这些命令将在特定的类文档中找到,而不是在核心规范中。

    【讨论】:

    • 我之前曾浏览过 Beyondlogic 网站,但在解释其中的大部分内容时遇到了一些麻烦,并且无法找到与其中的 android 部分的关系。我发现该设备被认为是公共静态最终 int USB_CLASS_STILL_IMAGE 我现在将深入研究规范 pdf,看看我能找到什么!再次感谢,(希望我不会卡住!)
    • 我很难找到标准设备请求的用处,因为它们似乎都只是为设备提供元数据。我读错了吗?我记下了类、子类和协议代码以及各自的端点数据,但还没有发现任何相关命令将相机看到的内容发送到设备。
    • 此信息包含在设备类规范文档中。静止图像列在我链接的网站上,或者这里是指向该课程文档的直接链接。具体来说,第 7 节讨论了使用图像捕获的工作流程:usb.org/developers/devclass_docs/usb_still_img10.pdf
    • Devunwired,再次查看您的 USB 源代码github.com/devunwired/accessory-samples/blob/master/UsbMonitor/… 您在哪里找到 getDeviceStatus 这个特定命令的长度、值和缓冲区等?这似乎是我的最后一块拼图,感谢您迄今为止的指导和链接!
    • 我已经用这方面的更多信息更新了答案。
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2012-05-12
    相关资源
    最近更新 更多