发表于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,里面的讲解十分全

libusb获取usb设备的idVendor(vid),idProduct(pid),以及Serial Number的更多相关文章

  1. 基于libUSB的USB设备固件更新程序(下载数据)(转)

    源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libU ...

  2. C# 获取USB设备信息

    C# 获取USB设备信息WMI方式 using System; using System.Management; using System.Text.RegularExpressions; using ...

  3. Qt 获取usb设备信息 hacking

    /************************************************************************** * Qt 获取usb设备信息 hacking * ...

  4. android获取USB设备的名称

    1.注释内 .是三星设备可能不支持,需要更换的代码. 2.mUsbManager.是getSystemService(Context.USB_SERVICE)获的. 3. 从stackoverflow ...

  5. 获取usb设备父系或子代

    /// <summary> /// 获取设备父系 /// </summary> /// <param name="driver"></pa ...

  6. C#:基于WMI查询USB设备信息 及 Android设备厂商VID列表

    /* ---------------------------------------------------------- 文件名称:WMIUsbQuery.cs 作者:秦建辉 MSN:splashc ...

  7. Windows下USB磁盘开发系列三:枚举系统中U盘、并获取其设备信息

    前面我们介绍了枚举系统中的U盘盘符(见<Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>).以及获取USB设备的信息(见<Windows下USB磁盘开发系列二:枚举系统中 ...

  8. 浅谈USB设备的VID和PID

    根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向U ...

  9. usb设备驱动描述,王明学learn

    usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...

随机推荐

  1. go相关资料

    1.go的调度2.go struct能不能比较 因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型 3.go defer(for defe ...

  2. MySQL表存在外键关系无法清空数据的解决方案

    先 SET FOREIGN_KEY_CHECKS=0; 然后delete删除,再 SET FOREIGN_KEY_CHECKS=1;

  3. Electric Charges CodeForces - 623C (二分答案)

    大意: 平面上n个点每个点坐标为(x,0)或(0,y), 求任意两点距离平方最大值的最小值. 二分答案, 转化为判定最大值是否<=e, 按$x$排序后, 因为固定左端点, $y$绝对值的最大值是 ...

  4. mybatis工作原理及实现

    对数据库的连接 使用时就创建连接,不使用就立即释放,对数据库进行频繁连接开启和关闭,造成数据库的资源浪费,影响数据库的性能: 解决办法:使用数据库连接池,管理数据库的连接. 2 将sql语句硬编码到j ...

  5. 几个常用I/O函数用法(printf,fprintf等)

    一 格式化输出 1.printf 定义:int printf(const char *format,[argument]); 功能:产生格式化输出的函数(定义在 stdio.h 中) 参数说明:for ...

  6. python变量、对象和引用你真的明白了吗

    python变量.对象和引用你真的明白了吗 变量.对象和引用 Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是 ...

  7. Shiro单Realm加密

    首先,我们要明确认证的流程: 1. 获取当前的 Subject. 调用 SecurityUtils.getSubject(); 2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subje ...

  8. celery源码解读

    Celery启动的入口: 文件:Celery/bin/celery.py 看下main函数做了什么事 可以看到主要做了几个事根据-P参数判断是否需要打patch,如果是gevent或者eventlet ...

  9. 百度贴吧自动回帖的两种方式,使用requests(urllib2)和selenium两种方式回帖

    本文介绍,回复贴吧指定某楼层主的帖子的方法.在这里不介绍无限发主贴和无限回复主贴的方法,无限发主题帖会爆吧,引起别人的反感,并且很容易遭到吧主的封杀:无限回主题帖,会让整个帖子的每楼的回复充满了自己的 ...

  10. ERROR 1040 (08004): Too many connections

    ERROR 1040 (08004): Too many connections 长期一来,mysql低版本中,当面对连接数陡增而出现too many connections时,往往比较棘手.今天特意 ...