libusb獲取usb設備的idVendor(vid),idProduct(pid),以及Serial Number


 

發表於2015/6/23 21:55:11  4594人閱讀

 

      最近在做關於usb設備的項目,用到了libusb,發現關於這個的函數庫的介紹,講解很少,下面僅僅是簡單展示一些基本的使用方法,以備后用。

本人的系統ubuntu,首先

 

sudo apt-get install libusb-dev
sudo apt-get install libusb-1.0-0-dev

安裝libusb開發環境,這個函數庫的函數基本上定義在libusb-1.0/libusb.h里,因此,使用時需要引用頭文件#include <libusb-1.0/libusb.h>,另外,使用gcc編譯時需要加上 `pkg-config --libs --cflags libusb-1.0`,例如

 

 

gcc findusb.c -o findusb `pkg-config --libs --cflags libusb-1.0`

下面給出兩個函數,獲取usb設備的idVendor(vid),idProduct(pid),以及Serial Number

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libusb-1.0/libusb.h>

#define CHAR_MAX_LEN 256
#define BUF_MAX_LEN INT_MAX


struct usb_st{
	char sn[CHAR_MAX_LEN];
	char product[CHAR_MAX_LEN];
	uint16_t pid;
	uint16_t vid;
};


/*
return 0 means don't equal;return 1 means equal.
*/
int chk_serial_number(uint16_t pid,uint16_t vid,char *sn){
	//usb information index
	struct libusb_device_descriptor usb_info;
	//usb device
	struct libusb_device *usb_d=NULL;
	//the handle of the opened usb device
	struct libusb_device_handle *usb_p=NULL;
	//buffer
	char buf[CHAR_MAX_LEN]={0};

	usb_p=libusb_open_device_with_vid_pid(NULL,pid,vid);
	if(usb_p!=0){
		//find information index
		usb_d=libusb_get_device(usb_p);
		if(libusb_get_device_descriptor(usb_d,&usb_info)!=0){
			perror("can't find usb device's information");
			libusb_close(usb_p);
			return 0;
		}
		//find SerialNumber
		libusb_get_string_descriptor_ascii(usb_p,usb_info.iSerialNumber,buf,CHAR_MAX_LEN);
		return (strcmp(buf,sn)==0);
	}else{
		perror("can't find usb device");
		libusb_close(usb_p);
		return 0;
	}
	libusb_close(usb_p);
	return 1;
}


/*
fill the usb devices information list
*/
ssize_t ls_usb_device(struct usb_st *st){
	ssize_t usb_list_len=0,idx=0;
	struct libusb_device **list=NULL;
	struct libusb_device *dev=NULL;
	struct libusb_device_descriptor desc={0};
	struct libusb_device_handle *usb_p=NULL;
	char buf[CHAR_MAX_LEN]={0};

	//get the list
	usb_list_len=libusb_get_device_list(NULL,&list);
	if(usb_list_len==0){
		perror("can't find usb list");
		return 0;
	}
	//access the members of the list
	for(idx=0;idx!=usb_list_len;idx++){
		memset(&desc,sizeof(struct libusb_device_descriptor),0);
		if(libusb_get_device_descriptor(list[idx],&desc)!=0){
			perror("can't find usb list information");
			return 0;
		}
		//copy usb device's information to the st
		libusb_open(list[idx],&usb_p);
		libusb_get_string_descriptor_ascii(usb_p,desc.iProduct,st[idx].product,CHAR_MAX_LEN);
		libusb_get_string_descriptor_ascii(usb_p,desc.iSerialNumber,st[idx].sn,CHAR_MAX_LEN);
		st[idx].pid=desc.idProduct;
		st[idx].vid=desc.idVendor;
		libusb_close(usb_p);
	}
	//return the lenght of list
	return usb_list_len;
}


/*
initialization
*/
void t_init(){
	libusb_init(NULL);
}


/*
when app distory
*/
void t_exit(){
	libusb_exit(NULL);
}


main(){
	struct usb_st st[CHAR_MAX_LEN];
	ssize_t usb_list_len=0;
	int i=0;
	t_init();
	printf("%d",chk_serial_number(0x8829,0x0010,"9053053023054027"));
	usb_list_len=ls_usb_device(st);
	for (i = 0; i < usb_list_len; ++i)
	{
		printf("product:%s\nsn:%s\npid:%x\nvid:%x\n\n",st[i].product,st[i].sn,st[i].pid,st[i].vid);
	}
	t_exit();
}

     首先必須使用libusb_init()初始化,運行結束需要libusb_exit(),這兩個函數,一個是chk_serial_number(),傳入pid,vid,和序列號,功能是檢測當前是否存在傳入的pid,vid與序列號相等的usb設備,存在則返回1。

 

     而ls_usb_device將當前系統所有的usb設備信息(pid,vid,序列號)放到st數組里。

     欲了解更多函數功能請移步http://libusb.sourceforge.net/api-1.0/api.html,里面的講解十分全

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM