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)通用串行总线,是一种外部 ...
随机推荐
- java复习(3)继承
一.继承为题的提出 ---------------------------------------------------- 我们知道面向对象的三大特性是:封装.继承和多态,可以知道继承在java应用 ...
- 关于python3.4版本中的zip函数
特别注意: 在window,显示变量 print(x);而在linux中 print x 例如,有两个列表: >>>a = [1,2,3] >>>b = [4,5, ...
- SpringBoot集合Linux的FastDFS与Nginx上传图片测试错误com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can't create connection to/192.168.1.104:22122
报错 com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can't create connection to/ ...
- laravel 添加筛选方式
protected function grid() { return Admin::grid(Client::class, function (Grid $grid) { $grid->id(' ...
- ceph对接openstack
一.使用rbd方式提供存储如下数据: (1)image(glance):保存glanc中的image: (2)volume(cinder)存储:保存cinder的volume:保存创建虚拟机时选择创建 ...
- 脚本_通过进程与端口判断myslq服务
#!bin/bashif [[ $port -eq 1 || $porcess -eq 2 ]];then #通过条件判断端口和进程执行的返回值. echo "mysql is s ...
- SQL Server设置启动存储过程
--设置开关 启动程序自动运行存储过程必须启动该命令 sp_configure "show advanced options",1; go reconfigure; go --设置 ...
- #1055 ... sql_mode=only_full_group_by
sql_mode=only_full_group_by 版权声明:本文为参考多篇博主文章,略作测试修改. 参考文章: 猿医生 的<5分钟学会MySQL-this is incompatible ...
- Ubuntu利用ROS搭建手机移动网络摄像头(Android)
所需设备 PC -> Ubuntu 16.04 - > ROS Kinetic Android系统手机 1.Android移动端APP下载安装 配置手机端:(一般默认即可RTSP) 2.源 ...
- JVM体系结构及优化
源文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/index.html JVM体系结构 方法区,类加载器,堆,Java ...