首页 文章详情

嵌入式开发板识别手机

程序员超仔 | 71 2024-03-11 21:49 0 0 0
UniSMS (合一短信)

最近调研一个问题时,涉及到要从嵌入式开发板上的一些外部设备中,筛选出手机,网上查询一番,可以选用的技术方案主要是adb和libusb库,其中adb方案主要针对的是安卓手机,而我要达到的效果是安卓手机和苹果手机都能识别,所以,我尝试选用libusb库进行操作。


下载并交叉编译libusb库

经过在网上查找一番,找到了一个libusb库的源码下载地址 https://github.c om/libusb/libusb,从 这个地址将 源码下 载下来,然后进行交叉编译,可以得到对应目标平台的libusb库的库文件和 头文件(libusb.h),如图所示:

c90d29ece4045236daf033275e0b32bf.webp


交叉编译的步骤可以参考网上的资料或访问我的个人博客(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表示手机,如图所示:

9e7e3b26c7eceec600e32f008f298767.webp


写到最后

以上就是基于libusb库识别手机的简要介绍,现在很多实现手机和嵌入式开发板通信的程序底层都是基于libusb库实现的,本篇文章只是介绍识别手机的部分,在后续文章中会继续介绍基于libusb库实现手机和嵌入式开发板通信的部分,敬请期待!

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter