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

来源:互联网 发布:ubuntu安装迅雷播放器 编辑:程序博客网 时间:2024/04/30 14:27
上一篇日志说了如何响应设备插入,但是设备有很多中,多媒体设备,鼠标键盘什么的都是,那如何判断是不是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手机,所以我截的图不是手机信息,只是告诉你这么一样东西,你可以自己插入手机试验一下):


 


 
有一部分手机直接判断 兼容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操作手机的功能.
0 0
原创粉丝点击