项目场景:
相机同时支持UVC跟HID协议,多相机时,如何实现同一个相机UVC的DevicePath和HID的DevicePath的绑定??
问题描述:
相机同时支持UVC跟HID协议,起初用DirectShow获取devicepath,然后打开控制通路更视频通路。现在补充部分控制命令,走HID协议。单相机时,只需要匹配设备的PID 和VID 即可完美的工作;但是需要接多个相机时,比如两个相机A/B,发现A相机的UVC部分没问题, 但是HID确打开的是B相机。
原因分析:
取HID的DevicePath只是遍历了HID节点,拿到第一个满足PID 和VID 的就用了,没有考虑同一个相机UVC的DevicePath和HID的DevicePath的绑定。
解决方案:
首先,DirectShow无法获取HID信息,这一点就限定得更换获取UVC DevicePath方式;
其次,既然HID信息可以通过windows api来获取(“setupapi.lib”);那么肯定也可以拿到UVC的DevicePath;
最后就是找到一个关联点,来连接这两个DevicePath就可以了。
毫无疑问,对于没有做过的同学,这个摸索的过程是很痛苦的。
1、GUID是什么鬼?
2、SP_DEVICE_INTERFACE_DATA?PSP_DEVICE_INTERFACE_DETAIL_DATA?SP_DEVINFO_DATA?这几个结构体又是什么鬼?
2、SetupDiGetClassDevs函数是干嘛用的?
3、SetupDiEnumDeviceInterfaces函数是干嘛用的?
4、SetupDiGetInterfaceDeviceDetail函数是干嘛用的?
5、SetupDiEnumDeviceInfo函数是干嘛用的?
6、CM_Get_Device_ID函数是干嘛用的?
7、SetupDiGetDeviceRegistryProperty函数是干嘛用的?不一定需要每个枚举值都搞明白,但一定要知道SPDRP_BASE_CONTAINERID
8、GlobalFree函数是干嘛用的?
9、SetupDiDestroyDeviceInfoList函数是干嘛用的?
“授人以鱼不如授人以渔”,拒绝伸手要。
这里只贴知识点,搞懂了1-9,这个问题自然也就解了,因为代码中也就是这几个步骤