UVC,全称为:USB video class 或USB video device class。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一。目前的主流操作系统都已提供UVC设备驱动,如:windows xp sp2、linux 2.4.6、macos10.5,这些系统及之后的版本。所以在这些操作系统上并支持UVC协议的设备,不用安装驱动就可以使用。
本章将对一个UVC摄像头设备进行抓包,做数据分析,从而对PC枚举UVC类设备的过程有一个大概的认识。
1.1 准备工作
“工欲善其事,必先利其器“,在开干之前,我们需要准备一些工具和文档来帮助我们理解和学习UVC的枚举过程。
首先,我们需要一个好用的USB抓包工具,我用的是“Bus Hound”,大家可以自行去网上下载。
其次,学习一个新技术最直接的方法就是去研究它的官方文档,我们需要去USB官网下载UVC官方文档,网址如下:https://www.usb.org/document-library/video-class-v15-document-set ,官方给的文档是最新的UVC1.5版的,但是我们平时见到的UVC设备大多使用的是UVC1.0或者UVC1.1,USB官网也早已没有1.0和1.1的文档,不过也没关系,改动不是很大,我们也可以参考UVC1.5。
最后,我们还需要一个UVC摄像机,只要是支持UVC的就可以。
为了方便,我已将上述工具已经打包好,可自行去下载,资源包括:
1 Bus Hound抓包工具
2 UVC1.5 官方文档
3 UVC1.1 官方文档(中英文)
链接:https://download.csdn.net/download/weixin_42314225/10775806
准备工作做完以后,我们下一步就可以抓取数据包了,四个字,“干就完了”。
1.2 抓包数据
USB设备都会有设备描述符、配置描述符、接口描述符、端点描述符四种描述符,主机通过读取这些描述符来获得USB Device信息,从而以这些描述符所描述的方式与其通信。
将UVC摄像头插入PC USB接口,直到PC识别其为视频设备,打开设备管理器,能够发现多了一个摄像头设备,如上图红线部分所示,将BUS Hound抓取的数据包保存为txt文件。
先看第一行,CTL意为“USB control transfer”,即控制传输,熟悉USB通信的朋友应该都知道USB有四种数据传输方式,其中“控制传输”为仅有的双向传输方式,USB枚举过程中就是用的控制传输方式与USB从机的端点0进行通信的,Device那一列“25.0”,表示通信端点为UVC设备的端点0。
UVC摄像头插入PC后,PC向其端点0发送了8个Byte的数据:80 06 00 01 00 00 12 00,第四字节“01”与第七字节“12”代表PC请求UVC设备发送“设备描述符至主机,设备描述符长度为18Byte”。
再看第二行,“IN”表示数据传输方向为输入,即PC接收UVC摄像头返回的18Byte数据:12 01 00 02 ef 02 01 40 71 18 70 76 12 03 01 02 00 01,关于这18Byte的定义,UVC官方文档给出了很详细的解释,如下图所示,其中PC就是通过画红圈的那三个字节数据知道该设备为UVC设备的。
PC收到UVC摄像头返回的18Byte配置描述符后,紧接着又发出了第二条控制命令:
80 06 00 02 00 00 09 00,第四字节“02”与第七字节“09”表示“请求UVC发送自己的配置描述符至PC,数据长度9Byte”。
随后UVC摄像头返回了9Byte数据至PC:09 02 a3 01 02 01 00 80 fa,关于配置描述符的详细信息,UVC官方文档给出了如下描述。
其中,我们暂时先关注下第3、4字节,即“wTotalLength”参数,由于USB传输是低字节先传输,故我们知道,该配置描述符以及其下所有的接口描述符和端点描述符的总字节长度为0x1a3字节。
紧接着,PC开始向UVC摄像头端点0发送第三次控制命令啦:80 06 00 02 00 00 a3 01,第7、8字节是不是很眼熟啊?没错,第4字节还是“02”,PC这次还是发送的读取UVC设备“配置描述符”命令,但是这次读取的字节长度是“0x1a3”字节,那这次就是将“接口描述符”和“端点描述符”全都读出来啦!数据量比较大,如下图所示。
至此为止,PC与UVC设备之间的枚举过程大体已经分析完了,至于后面可能还会有“字符串描述符”之类的就没有那么重要了,这里就不分析了,有兴趣可自己研究。