2013-03-11 43 views
1

我正在编写一个Mac应用程序,该应用程序使用IOKit向Personel Video Recorder发送消息并将消息接收到该应用程序。我需要发送消息来改变它的状态,它需要给我关于分辨率或录像等视频的信息。我意识到我必须找到正确的信息发送它,所以首先我想我可以先收到它的一些消息。我已经找到了设备的接口。我将如何能够转储收到的消息?找出来自IOUSBInterface管道的数据

下面是USB探头日志:

Composite device: "PVR" 
    Port Information: 0x001d 
      Captive 
      Internal Device 
      Connected 
      Enabled 
    Number Of Endpoints (includes EP0): 
     Total Endpoints for Configuration 1 (current): 7 
    Device Descriptor 
     Descriptor Version Number: 0x0200 
     Device Class: 0 (Composite) 
     Device Subclass: 0 
     Device Protocol: 0 
     Device MaxPacketSize: 64 
     Device VendorID/ProductID: 0x2040/0xE502 (Hauppauge Computer Works, Inc.) 
     Device Version Number: 0x0800 
     Number of Configurations: 1 
     Manufacturer String: 1 "Hauppauge" 
     Product String: 2 "WinTV" 
     Serial Number String: 3 "E502-00-00AA3DEE" 
    Configuration Descriptor (current config) 
     Length (and contents): 60 
      Raw Descriptor (hex) 0000: 09 02 3C 00 01 01 00 C0 00 09 04 00 00 06 FF FF 
      Raw Descriptor (hex) 0010: FF 00 07 05 81 02 00 02 00 07 05 84 02 00 02 00 
      Raw Descriptor (hex) 0020: 07 05 88 02 00 02 00 07 05 01 02 00 02 00 07 05 
      Raw Descriptor (hex) 0030: 02 02 00 02 00 07 05 86 02 00 02 00 
     Number of Interfaces: 1 
     Configuration Value: 1 
     Attributes: 0xC0 (self-powered) 
     MaxPower: 0 mA 
     Interface #0 - Vendor-specific 
      Alternate Setting 0 
      Number of Endpoints 6 
      Interface Class: 255 (Vendor-specific) 
      Interface Subclass; 255 (Vendor-specific) 
      Interface Protocol: 255 
      Endpoint 0x81 - Bulk Input 
       Address: 0x81 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 512 
       Polling Interval: 0 (Endpoint never NAKs) 
      Endpoint 0x84 - Bulk Input 
       Address: 0x84 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 512 
       Polling Interval: 0 (Endpoint never NAKs) 
      Endpoint 0x88 - Bulk Input 
       Address: 0x88 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 512 
       Polling Interval: 0 (Endpoint never NAKs) 
      Endpoint 0x01 - Bulk Output 
       Address: 0x01 (OUT) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 512 
       Polling Interval: 0 (Endpoint never NAKs) 
      Endpoint 0x02 - Bulk Output 
       Address: 0x02 (OUT) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 512 
       Polling Interval: 0 (Endpoint never NAKs) 
      Endpoint 0x86 - Bulk Input 
       Address: 0x86 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 512 
       Polling Interval: 0 (Endpoint never NAKs) 
    Device Qualifier Descriptor 
     Descriptor Version Number: 0x0200 
     Device Class 0 (Composite) 
     Device Subclass 0 
     Device Protocol 0 
     Device MaxPacketSize: 64 
     Number of Configurations: 1 
     bReserved: 0 
    Other Speed Configuration Descriptor 
     Length (and contents): 60 
      Raw Descriptor (hex) 0000: 09 07 3C 00 01 01 00 C0 00 09 04 00 00 06 FF FF 
      Raw Descriptor (hex) 0010: FF 00 07 05 81 02 40 00 00 07 05 84 02 40 00 00 
      Raw Descriptor (hex) 0020: 07 05 88 02 40 00 00 07 05 01 02 40 00 00 07 05 
      Raw Descriptor (hex) 0030: 02 02 40 00 00 07 05 86 02 40 00 00 
     Number of Interfaces: 1 
     Configuration Value: 1 
     Attributes: 0xC0 (self-powered) 
     MaxPower: 0 mA 
     Interface #0 - Vendor-specific 
      Alternate Setting 0 
      Number of Endpoints 6 
      Interface Class: 255 (Vendor-specific) 
      Interface Subclass; 255 (Vendor-specific) 
      Interface Protocol: 255 
      Endpoint 0x81 - Bulk Input 
       Address: 0x81 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 64 
       Polling Interval: 0 ms 
      Endpoint 0x84 - Bulk Input 
       Address: 0x84 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 64 
       Polling Interval: 0 ms 
      Endpoint 0x88 - Bulk Input 
       Address: 0x88 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 64 
       Polling Interval: 0 ms 
      Endpoint 0x01 - Bulk Output 
       Address: 0x01 (OUT) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 64 
       Polling Interval: 0 ms 
      Endpoint 0x02 - Bulk Output 
       Address: 0x02 (OUT) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 64 
       Polling Interval: 0 ms 
      Endpoint 0x86 - Bulk Input 
       Address: 0x86 (IN) 
       Attributes: 0x02 (Bulk) 
       Max Packet Size: 64 
       Polling Interval: 0 ms 

enter image description here

回答

1

USB主机是驱动。这意味着设备不会发送任何消息,除非作为对来自主机(Mac/PC)的消息的回复。因此,为了从中引出消息,您首先需要发送一条有效的消息。

我从你的问题中假设你实际上没有任何有关该设备的文档/规范?这意味着您需要获取该信息,或者向制造商询问,或者通过逆向工程它。

逆向工程的最简单方法是监听由现有驱动程序生成的消息,例如,一些Windows软件可以执行类似于您想要执行的操作。然后你需要听取数据。在过去,我已经成功地在Linux上的VM上运行Windows软件,并将相关USB设备传递给VM,并使用Linux的USB调试功能记录输出。您应该可以在OSX上使用“USB Prober”应用程序和Apple开发人员下载区提供的“IOUSBFamily Log Release”执行相同的操作。

+0

感谢您的输入!实际上,我曾尝试使用USB Prober,并且在记录USB活动时不会记录发送的数据。我有Parallels,虽然它在Windows 7上。这个PVR在Windows上有一个控制器应用程序。我可以使用什么应用程序在Windows上登录? – kezi 2013-03-11 19:32:24

+0

我在Windows上使用过[Snoopy Pro](http://sourceforge.net/projects/usbsnoop/),但我发现大量数据被丢弃。也许你会有更多的运气。 usbtracer OSX应该显示你的某些类型的数据包的内容;您的虚拟化软件也可能具有记录所有转发的USB通信量的模式。否则,安装一个Linux发行版并在其上安装VirtualBox,然后通过USB并在Linux上启用USB调试。在Linux上这样做有很多文档。 – pmdj 2013-03-11 20:36:52

+0

好吧,我已经使用USBAnalyzer来获取应用程序发送的数据。 (检查上面的图像)我会通过(* usbInterface) - > WritePipe(void * self,UInt8 pipeRef,void * buf,UInt32 size)在我的应用程序中发送相同的数据。当我打电话给我时,我将如何设置上面十六进制代码的数据?当分析仪说出来时,这意味着从电脑到设备,对不对? – kezi 2013-03-11 21:21:57