发表于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. golang 反射中调用方法

    反射中调用函数 众所周知,golang中的函数是可以像普通的int.float等类型变量那样作为值的,例如: package main import "fmt" func hell ...

  2. 07、poly-A内参和杂交内参(arrayanalysis的问题)

    为了验证杂交的质量,Affymetrix公司加入了两类嵌入探针组: 一.poly-A内参:包括lys.phe.thr.dap 对应的探针组名称为:AFFX-r2-Bs-lys-3_at.AFFX-r2 ...

  3. ReactNative: Android与iOS平台兼容处理

    方法一: 创建不同的文件扩展名:*.android.js*.io.js 方法二: import { Platform } from 'react-native'; if (Platform.OS == ...

  4. openstack docker build error

    1. _proto_tcp = socket.getprotobyname('tcp') OSError: protocol not found you should have a /etc/prot ...

  5. bat批处理的注释语句

    写bat批处理也一样,都要用到注释的功能,这是为了程式的可读性 在批处理中,段注释有一种比较常用的方法: goto start      = 可以是多行文本,可以是命令      = 可以包含重定向符 ...

  6. 扇形导航 css3

    本篇文章将通过对css3中的2d变化以及过渡进行分析设计 先放上最终效果图                 功能实现:1.给扇形home元素设置点击事件并添加2d旋转 2.给导航栏设置2d旋转 并通过 ...

  7. 在vue的js文件引入自定义js文件

    自定义js var provinces=[] export default provinces vue页面js引入 import riskLeft from "./index.js" ...

  8. handlebars杂记

      1.{{{caption}}}三个花括号,可以解析 空格 变成 ‘空格’.   2.数据是posts:[{  }]数组时候,可以用{{posts.length}}取得其数组长度   3.handl ...

  9. 当有多个相同的DIV时,我怎么判断我点击的是哪个

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. U-boot工作流程分析

    bootloader的作用 bootloader就好比是航天飞机升天轨道上的助推器 程序入口:在_start这里 第一阶段程序分析: 1.设置中断向量表 2.设置处理器位SVC模式 3.0.刷新I/D ...