仿91助手的PC与android手机通讯(2) --- 检测是否是手机

来源:互联网 发布:辐射4怪物数据 编辑:程序博客网 时间:2024/04/30 15:02
上一篇日志说了如何响应设备插入,但是设备有很多中,多媒体设备,鼠标键盘什么的都是,那如何判断是不是USB设备或者是手机插入呢? 这里就介绍一下我自己的研究结果,当然我没有去研究过苹果设备,但是按道理是类似的。 

这里是我自己本人的思路,不一定是最好的方法,如果发现更好的方法我会再拿出来,当然如果你发现更好的方法的话可以留言告诉我。

我的思路是枚举USB设备,并且检查设备的兼容ID和硬件ID

枚举用到的方法包括 SetupDiGetClassDevs 和 SetupDiEnumDeviceInfo, 这两个方法可以在MSDN2008里面查到。
这里简单说明一下用法:

//获取设备信息句柄

HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL,L"USB" ,NULL,DIGCF_ALLCLASSES|DIGCF_PRESENT);

//获取设备信息数据
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for(int i = 0;SetupDiEnumDeviceInfo(hDevInfo,i,&deviceInfoData);i++)//对USB设备集进行枚举
{
....
}

上面是枚举USB设备的思路,下面讲一下如何分辨USB设备是否就是手机
这里我的思路是判断 兼容ID 和 硬件ID , 这两个ID可以在设备管理器中看得到如下(写这篇日志时我没有android手机,所以我截的图不是手机信息,只是告诉你这么一样东西,你可以自己插入手机试验一下):
仿91助手的PC与android手机通讯(2) --- 检测是否是手机 - Mongamind_蚯蚓 - Mongamind的博客
 
仿91助手的PC与android手机通讯(2) --- 检测是否是手机 - Mongamind_蚯蚓 - Mongamind的博客
 
有一部分手机直接判断 兼容ID 是否是"usb\\class_ff&subclass_42"即可,
但是有些手机的兼容ID不是这个串,那就比较麻烦了,需要匹配 硬件ID ,但是 硬件ID 不是固定的,好像是跟手机的硬件有关,但是同一款手机型号是一样的,有些品牌如vivo是一个系列都基本一样的硬件ID,甚至现在市面上的很多山寨手机直接就是用HTC的一个硬件ID(哈哈,那时候我去手机店采集硬件ID的时候就感概现在的山寨不硬件识别的ID都直接copy了,这个可能是商业问题,我也不懂.)

获取兼容ID的方法,使用上面枚举获得的HDEVINFO句柄和SP_DEVINFO_DATA数据调用SetupDiGetDeviceRegistryProperty方法:

WORD dataType= 0;

DWORD buffSize = 0;

SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_COMPATIBLEIDS,&dataType,NULL,buffSize,&buffSize);

int err = GetLastError();

if(err != ERROR_INSUFFICIENT_BUFFER)

return;

LPTSTR szCompatibleID = (LPTSTR)LocalAlloc(LPTR,buffSize+1);

SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_COMPATIBLEIDS,&dataType,(PBYTE)szCompatibleID ,buffSize,&buffSize);

//szCompatibleID 即是兼容ID

如果 兼容ID == "usb\\class_ff&subclass_42" 就直接可以知道这个是手机设备了(注意要兼容ID的大小写不确定的)

如果 兼容ID != "usb\\class_ff&subclass_42" 那么就要匹配硬件ID了,获取硬件ID的方法和获取兼容ID的方法类似:

WORD dataType= 0;

DWORD buffSize = 0;

SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_HARDWAREID,&dataType,NULL,buffSize,&buffSize);

int err = GetLastError();

if(err != ERROR_INSUFFICIENT_BUFFER)

return;

LPTSTR szHardwareID = (LPTSTR)LocalAlloc(LPTR,buffSize+1);

SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_HARDWAREID,&dataType,(PBYTE)szHardwareID ,buffSize,&buffSize);

//szHardwareID 即是硬件ID

硬件ID 的样子大概是: VID_1234&PID_4321  (1234,4321根据设备有差异,其中VID代表Vendor ID(厂家ID) , PID代表Product ID(产品ID)),VID基本一个厂商. 这个需要收集,但是网上好像有一些VID_PID大全可以满足一般使用.
(其中VID只能判断厂商,有些手机生产商也有别的设备产品,好像索尼有手机也有相机,所以不能轻判哦.

OK,手机判断完成,后面是驱动安装的介绍,手机插入后不一定有驱动,需要有驱动才能进行PC操作手机的功能.

原版地址:http://mongamind.blog.163.com/blog/static/193287261201393005331571/

0 0
原创粉丝点击