最近调研一个问题时,涉及到要从嵌入式开发板上的一些外部设备中,筛选出手机,网上查询一番,可以选用的技术方案主要是adb和libusb库,其中adb方案主要针对的是安卓手机,而我要达到的效果是安卓手机和苹果手机都能识别,所以,我尝试选用libusb库进行操作。
下载并交叉编译libusb库
经过在网上查找一番,找到了一个libusb库的源码下载地址
:
https://github.c
om/libusb/libusb,从
这个地址将
源码下
载下来,然后进行交叉编译,可以得到对应目标平台的libusb库的库文件和
头文件(libusb.h),如图所示:
交叉编译的步骤可以参考网上的资料或访问我的个人博客(www.51yourong.cn)里的站内搜索(输入关键字“libusb”进行搜索),这里就不再赘述。
编写测试代码并测试
基于libusb库编写测试代码,用来检测识别连接到嵌入式开发板上的手机,大致代码如下:
bool IsMobilePhoneDevice(qint8 nDeviceClass)
{
if(LIBUSB_CLASS_PER_INTERFACE == nDeviceClass || LIBUSB_CLASS_COMM == nDeviceClass)
{
return true;
}
return false;
}
int main()
{
libusb_context* pUsbCtx = NULL;
libusb_device_handle* pUsbDeviceHandle = NULL;
if(libusb_init(&pUsbCtx) < 0)
{
printf("device init failed!\n");
return -1;
}
libusb_device** ppDeviceList = NULL;
int nDeviceCnt = libusb_get_device_list(pUsbCtx, &ppDeviceList);
if(nDeviceCnt <= 0)
{
printf("no device can been found!\n");
libusb_exit(pUsbCtx);
pUsbCtx = NULL;
return -1;
}
for(int i = 0;i < nDeviceCnt;i++)
{
libusb_device_descriptor stDeviceDescriptor;
memset(&stDeviceDescriptor, 0, sizeof(stDeviceDescriptor));
if(libusb_get_device_descriptor(ppDeviceList[i], &stDeviceDescriptor) < 0)
{
printf("can not get device descriptor!\n");
continue;
}
printf("device descriptortype:%d, class:%d, subclass:%d, protocol:%d, vid:%d, pid:%d, sn:%d, manufacturer:%d!\n",
stDeviceDescriptor.bDescriptorType,
stDeviceDescriptor.bDeviceClass,
stDeviceDescriptor.bDeviceSubClass,
stDeviceDescriptor.bDeviceProtocol,
stDeviceDescriptor.idVendor,
stDeviceDescriptor.idProduct,
stDeviceDescriptor.iSerialNumber,
stDeviceDescriptor.iManufacturer);
if(!IsMobilePhoneDevice(stDeviceDescriptor.bDeviceClass))
{
printf("this usb device is not mobile phone!\n");
continue;
}
pUsbDeviceHandle = libusb_open_device_with_vid_pid(pUsbCtx, stDeviceDescriptor.idVendor, stDeviceDescriptor.idProduct);
if(NULL != pUsbDeviceHandle)
{
printf("open device success!\n");
break;
}
}
if(NULL == pUsbDeviceHandle)
{
libusb_free_device_list(ppDeviceList, 1);
ppDeviceList = NULL;
libusb_exit(pUsbCtx);
pUsbCtx = NULL;
return -1;
}
/*一些针对手机的通信操作
...
*/
libusb_close(pUsbDeviceHandle);
pUsbDeviceHandle = NULL;
libusb_free_device_list(ppDeviceList, 1);
ppDeviceList = NULL;
libusb_exit(pUsbCtx);
pUsbCtx = NULL;
return 0;
}
通过以上测试代码,枚举连接到嵌入式开发板上的USB设备,并从中筛选出手机,判断的依据就是设备描述符里的bDeviceClass字段,我通过将多种品牌的手机连接到嵌入式开发板上测试,并结合网上查询的资料,得出结论:这个字段等于0或者2时,表示是手机,其中绝大部分情况是这个字段为0表示手机,如图所示:
写到最后
以上就是基于libusb库识别手机的简要介绍,现在很多实现手机和嵌入式开发板通信的程序底层都是基于libusb库实现的,本篇文章只是介绍识别手机的部分,在后续文章中会继续介绍基于libusb库实现手机和嵌入式开发板通信的部分,敬请期待!