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,里面的讲解十分全
libusb获取usb设备的idVendor(vid),idProduct(pid),以及Serial Number的更多相关文章
- 基于libUSB的USB设备固件更新程序(下载数据)(转)
源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libU ...
- C# 获取USB设备信息
C# 获取USB设备信息WMI方式 using System; using System.Management; using System.Text.RegularExpressions; using ...
- Qt 获取usb设备信息 hacking
/************************************************************************** * Qt 获取usb设备信息 hacking * ...
- android获取USB设备的名称
1.注释内 .是三星设备可能不支持,需要更换的代码. 2.mUsbManager.是getSystemService(Context.USB_SERVICE)获的. 3. 从stackoverflow ...
- 获取usb设备父系或子代
/// <summary> /// 获取设备父系 /// </summary> /// <param name="driver"></pa ...
- C#:基于WMI查询USB设备信息 及 Android设备厂商VID列表
/* ---------------------------------------------------------- 文件名称:WMIUsbQuery.cs 作者:秦建辉 MSN:splashc ...
- Windows下USB磁盘开发系列三:枚举系统中U盘、并获取其设备信息
前面我们介绍了枚举系统中的U盘盘符(见<Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>).以及获取USB设备的信息(见<Windows下USB磁盘开发系列二:枚举系统中 ...
- 浅谈USB设备的VID和PID
根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向U ...
- usb设备驱动描述,王明学learn
usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...
随机推荐
- django1.9安装以及使用
安装setuptoolswget --no-check-certificate https://pypi.python.org/packages/69/56/f0f52281b5175e3d9ca86 ...
- Labeling Balls POJ - 3687 优先队列 + 反向拓扑
优先队列 + 反向拓扑 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include ...
- RabbitMQ入门教程(二):简介和基本概念
原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...
- Struts2.5以上版本There is no Action mapped for namespace [/] and action name [userAction_login] associated with context path []
分析:Struts2在2.5版本后添加strict-method-invocation(严格方法访问),默认为true,不能使用动态方法调用功能,故需设为false struts.xml设置如下: & ...
- MySQL主备同步延迟
今天看到mycat的日志,发现在wrapper.log中频繁warning:slave延迟23006秒 查看数据指标: show engine innodb status正常,而且slave的拷贝点在 ...
- 关于session和cookie的区别
以前对于session和cookie的认识,就只是粗略的知道cookie保存在客户端,而session则保存在服务端. 如今查了些资料,对session和cookie也有了一个初步的认识,现在来总结一 ...
- func_get_args func_num_args 的使用
func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用: func_num_args一般写在方法中,用于计数 function eeee($a='gg ...
- lilo - 安装引导装入程序
总述 主要功能: ” /sbin/lilo” - 安装引导装入程序 辅助用途: ”/sbin/lilo –q” - 查询影射表 ”/sbin/lilo –R” - 设置下次启动的默认命令行 ”/sbi ...
- 在控制台编译运行java程序详细指导
控制台编译运行.java文件 首先在cmd中输入java –version确定java环境变量是否已经配好 其次在cmd中输入javac –version 确定javac环境变量是否已经配好 在用cd ...
- itchat的使用
python 微信接口 -- itchat 文档 发表于 2018-03-16 | 分类于 Python | itchat 一. 安装 $ pip install itchat 特殊的字典使用方式通过 ...