UVC(USB Video Class)是USB的一种协议,可以直接传输视频。之前在STM32和GD32上做过UVC的驱动,先大致介绍下

图1-1
2.UVC的枚举分析
首先看标准请求的格式,如图2-1

图2-1
以T30为例,先看BUSHOND对枚举的数据抓取,如图2-2

图2-2
先看枚举阶段一
1) CTL 80 06 00 01 00 00 12 00 (获取描述符)
CTL 是“USB control transfer”,控制传输,是双向传输方式。UVC设备插入PC后,PC向其端点0发送了8个字节的 数据
0x80(1000 0000b): D7-1 设备到主机 ; D6:5-00 标准请求; D4:0-0000 接受者为设备
0x06:GET_DESCRIPTOR 获取描述符请求
0x0100 :0x01 设备描述符 ;0x00 描述符ID
0x0000: 空
0x0012: 请求数据长度,设备需要上传0x12个数据
2) IN 12 01 00 02 ef 02 01 40 15 c2 15 17 00 02 01 12 03 01 (上传设备描述符)
3) CTL 80 06 00 02 00 00 09 00 (获取配置描述符)
0x80(1000 0000b): D7-1 设备到主机 ; D6:5-00 标准请求; D4:0-0000 接受者为设备
0x06:GET_DESCRIPTOR 获取描述符请求
0x0200 :0x02 配置描述符 ;0x00 描述符ID
0x0000: 空
0x0009: 请求数据长度,设备需要上传0x09个数据
4) IN 09 02 cf 00 02 01 11 80 32 (上传配置描述符)
5) CTL 80 06 00 02 00 00 cf 00 (获取配置描述符集合,包含配置+IAD+接口+端点)
6) IN 09 02 cf 00 02 01 11 80 32 09 04 00 00 00 0e 01…(上传描述符集合)
7) SET_CONFIGURATION(设置配置指令)
CTL 00 09 01 00 00 00 00 00 SET CONFIG
0x00(0000 0000b): D7-0 主机到设备,数据为OUT方向 ; D6:5-00 标准请求; D4:0-0000 接受者为设备
0x09: SET_CONFIGURATION 设置配置请求
0x0001 :0x01 配置描述符中的Configuration Value 值
0x0000: 空
0x0000: 空
8) CTL 01 0b 00 00 01 00 00 00 (设置接口指令)
0x00(0000 0001b): D7-0 设备到主机 ; D6:5-00 标准请求; D4:0-0001 接收者为接口
0x0b: SET_INTERFACE 设置接口请求
0x0000 :接口备用配置ID
0x0001: 接口ID(VS接口)
0x0000: 空
枚举阶段二

以上指令都是特定类请求
以第一条为例
CTL a1 86 00 02 00 03 01 00 GET INFO
0xa1(1010 0001b): D7-0 设备到主机,指的是主机请求获取数据 ; D6:5-01 类请求; D4:0-0001 接受者为接口
0x86: GET_INFO 获取功能或动态
0x0200 :0x02 PU_BRIGHTNESS_CONTROL ; 0x00 Zero
0x0300: 0x03 单元ID ; 0x00 接口ID(VC接口)
0x0001: 请求数据长度,设备需要上传1个数据
以上就是UVC的枚举过程
打开摄像头和关闭摄像头

UVC相机在打开时,会使用SET_INTERFACE命令,在停止播放时,也会发送SET_INTERFACE命令。
打开时,数据抓包为:
CTL 01 0b 01 00 01 00 00 00 SET INTERFACE
停播放时,数据抓包为:
CTL 01 0b 00 00 01 00 00 00 SET INTERFACE
通过SET_INTERFACE数据命令分析,可知
01 :x01表示从主机到设备,请求标准命令,接收者为接口。
0b :表示设置接口
打开时,值为 01 00,即0x0001,表示接口,转换接口=1
打开时,值为 01 00,即0x0000,表示接口,转换接口=0
01 00 :表示接口为1.
00 00 :表示数据长度为0.
通过上面可以知道,打开或停止摄像头,是通过转换接口来实现的。
在T30程序中,当打开摄像头时,程序会进入uint8_t USBD_UVC_SOF (USBD_HandleTypeDef *pdev)中,在里面将状态标志置为UVC_STATE_NEED_FRAME,然后再进入uint8_t USBD_UVC_DataIn (USBD_HandleTypeDef *pdev,uint8_t epnum)中,里面的状态标志判断为UVC_STATE_NEED_FRAME,之后就发送数据了。
4.通讯接口
通讯都是靠VC命令的控制对比度来实现,每次只能传输2个字节,需要发送多次SET和GET,以单点校正为例,如图4-1

图4-1
1)通讯命令的接收
发送的2个字节都会进入到uint8_t USBD_UVC_EP0_RxReady (USBD_HandleTypeDef *pdev)中,在USB_COM_Receive(VideoCtl,&USB_Command,&USB_instructReply)函数中进行一帧数据的完整接收,按照VIVA协议来进行。USB_Command是接收的结构体,USB_instructReply是回复的结构体。若是1帧完整接收,且CRC校验都正常,则会置位接收按成的标志位。
2)通讯命令的解析
当接收完成后,USB_CommunicationInteractive(&USB_Command,&USB_instructReply)函数进行解析, 在Data_Analysis文件中。所有的通讯命令如单点校正都在此文件中进行解析
3)通讯命令的驱动
当解析完成后,需要进行相应的命令驱动。我把所有的命令驱动都放在了CommandDrever文件中。
4)通讯命令的回复
主机会发送GET指令,程序最终会进入到void UVC_Req_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)中,每GET1次,传输2个字节。PtrUPloadInformation是个全局指针,指向回复的结构体地址。如图4-2和4-3所示

图4-2

图4-3
UVC的画资料不多,有个网站对这一块研究挺深的
USB中文网
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'
我想使用ruby-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby-prof可以写入任何输出之前杀死它。如何在不中断ruby-prof的情况下停止mongrel服务器? 最佳答案
一、RIPV2协议简介 RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对
文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat