Linux如何使用libudev获取USB设备VID及PID
在本文将使用libudev库来访问hidraw的设备。通过libudev库,我们可以查询设备的厂家ID(VendorID,VID),产品ID(ProductID,PID),序列号和设备字符串等而不需要打开设备。进一步,libudev可以告诉我们在/dev目录下设备节点的具体位置路径,为应用程序提供一种具有足够鲁棒性而又和系统厂家独立的访问设备的方式。使用libudev库,需要包含libudev.h头文件,并且在编译时加上-ludev告诉编译器去链接udev库。
将列出当前连接在系统中的所有hidraw设备,并且输出它们的设备节点路径、生产商、序列号等信息。
为了获取这些信息,需要创建一个udev_enumerate对象,其中“hidraw”字符串作为过滤条件,
libudev将返回所有匹配这个过滤字符串的udev_device对象。
这个列子的步骤如下:
1、初始化库,获取一个structudev句柄
2、枚举设备
3、对找到的匹配设备输出它的节点名称,找到实际USB设备的起始节点,打印出USB设备的IDs和序列号等,最后解引用设备对象
4、解引用枚举对象
5、解引用udev对象
具体代码如下:
#include#include #include #include #include intmain(void) { structudev*udev; structudev_enumerate*enumerate; structudev_list_entry*devices,*dev_list_entry; structudev_device*dev; /*Createtheudevobject*/ udev=udev_new(); if(!udev){ printf("Can'tcreateudev\n"); exit(1); } /*Createalistofthedevicesinthe'hidraw'subsystem.*/ enumerate=udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(enumerate,"hidraw"); udev_enumerate_scan_devices(enumerate); devices=udev_enumerate_get_list_entry(enumerate); /*Foreachitemenumerated,printoutitsinformation. udev_list_entry_foreachisamacrowhichexpandsto aloop.Theloopwillbeexecutedforeachmemberin devices,settingdev_list_entrytoalistentry whichcontainsthedevice'spathin/sys.*/ udev_list_entry_foreach(dev_list_entry,devices){ constchar*path; /*Getthefilenameofthe/sysentryforthedevice andcreateaudev_deviceobject(dev)representingit*/ path=udev_list_entry_get_name(dev_list_entry); dev=udev_device_new_from_syspath(udev,path); /*usb_device_get_devnode()returnsthepathtothedevicenode itselfin/dev.*/ printf("DeviceNodePath:%s\n",udev_device_get_devnode(dev)); /*Thedevicepointedtobydevcontainsinformationabout thehidrawdevice.Inordertogetinformationaboutthe USBdevice,gettheparentdevicewiththe subsystem/devtypepairof"usb"/"usb_device".Thiswill beseverallevelsupthetree,butthefunctionwillfind it.*/ dev=udev_device_get_parent_with_subsystem_devtype( dev, "usb", "usb_device"); if(!dev){ printf("Unabletofindparentusbdevice."); exit(1); } /*Fromhere,wecancallget_sysattr_value()foreachfile inthedevice's/sysentry.Thestringspassedintothese functions(idProduct,idVendor,serial,etc.)correspond directlytothefilesinthedirectorywhichrepresents theUSBdevice.NotethatUSBstringsareUnicode,UCS2 encoded,butthestringsreturnedfrom udev_device_get_sysattr_value()areUTF-8encoded.*/ printf("VID/PID:%s%s\n", udev_device_get_sysattr_value(dev,"idVendor"), udev_device_get_sysattr_value(dev,"idProduct")); printf("%s\n%s\n", udev_device_get_sysattr_value(dev,"manufacturer"), udev_device_get_sysattr_value(dev,"product")); printf("serial:%s\n", udev_device_get_sysattr_value(dev,"serial")); udev_device_unref(dev); } /*Freetheenumeratorobject*/ udev_enumerate_unref(enumerate); udev_unref(udev); return0; }
编译程序:
gcc-Wall-g-oudev_exampleudev_example.c-ludev
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。