2010-07-19 9 views
14

udev का उपयोग करते हुए मैं एक निश्चित USB डिवाइस के लिए इस जानकारी को प्राप्त करने में सक्षम है:लिनक्स पर यूएसबी विक्रेता और उत्पाद जानकारी प्रोग्रामेटिक तरीके से कैसे प्राप्त करें?

idVendor: 13b1 
idProduct: 0018 
manufacturer: 
product: USB 2.0 Network Adapter ver.2 
serial: 00FFFF 

अब मैं पूर्ण तार कि विक्रेता और उत्पाद आईडी के साथ जुड़े रहे हैं करना चाहते हैं। मैंने पाया कि फ़ाइल /usr/share/misc/usb.ids जानकारी है कि मैं के लिए देख रहा हूँ में शामिल हैं:

13b1 Linksys 
     000b WUSB11 v4.0 802.11b Adapter 
     000d WUSB54G Wireless Adapter 
     0011 WUSB54GP v4.0 802.11g Adapter 
     0018 USB200M 10/100 Ethernet Adapter 
     001a HU200TS Wireless Adapter 
     001e WUSBF54G 802.11bg 
     0020 WUSB54GC 802.11g Adapter [ralink rt73] 
     0023 WUSB54GR 
     0024 WUSBF54G v1.1 802.11bg 

हालांकि, यह मेरे लिए स्पष्ट नहीं है मैं अपने आवेदन में किस प्रकार इस डेटा को पुनः प्राप्त करना चाहिए। क्या कोई एपीआई उपलब्ध है या क्या मुझे फाइल को पार्स करना चाहिए? अगर मैं इसे पार्स करना चुनता हूं, तो /usr/share/misc/usb.ids हमेशा सही स्थान होने जा रहा है?

+1

मेरे सिस्टम पर यह '/ usr/share/usb.ids' है। इस फ़ाइल के लिए जगह को नियंत्रित करने वाला कोई मानक नहीं मिल रहा है। –

+2

यहां सबसे हालिया संस्करण है: http://www.linux-usb.org/usb.ids और उन्हें सबमिट करने के लिए इंटरफ़ेस: http://www.linux-usb.org/usb-ids.html – endolith

+0

एंड्रॉइड पर, मेरा सी प्रोग्राम * libusbhost * का उपयोग करता है जो डिवाइस सम्मिलन/हटाने के लिए कॉलबैक प्रदान करता है। सभी डिवाइस डिस्क्रिप्टर lib द्वारा उपलब्ध कराए जाते हैं। –

उत्तर

17

lsusb वर्तमान में प्लग किए गए यूएसबी डिवाइस के बारे में कमांड क्वेरी जानकारी। आप एक निश्चित विक्रेता/उत्पाद क्वेरी करने के लिए अपने -d विकल्प का उपयोग कर सकते हैं (लेकिन यह वर्तमान में खामियों को दूर उपकरणों के लिए केवल काम करने के लिए लगता है):

$ lsusb -d 0e21:0750 
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc. 

आप सभी उपकरणों के लिए जानकारी दिखा सकते हैं:

$ lsusb 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 
Bus 001 Device 004: ID 0421:01c7 Nokia Mobile Phones 
Bus 001 Device 003: ID 0bda:8187 Realtek Semiconductor Corp. RTL8187 Wireless Adapter 
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 
Bus 006 Device 002: ID 046d:c01b Logitech, Inc. MX310 Optical Mouse 
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 

आप कर सकते हैं यह वर्बोज़ (lsusb -v) बनाते हैं और प्रिंटिंग के बहुत सारे प्रिंट करते हैं।

ध्यान दें कि लिनक्स ओएस में सिस्टम के बारे में जानकारी तक पहुंचने पर, इसे कमांड कमांड (जैसे कि lsusb) के माध्यम से इसे करने के लिए बहुत पसंद किया जाता है, ताकि इन आदेशों को एक्सेस करने के लिए सिस्टम फ़ाइलों को सीधे पार्स किया जा सके।

+0

तो मुझे popen का उपयोग कर lsusb को कॉल करने की आवश्यकता है? – StackedCrooked

+1

@ स्टैक्ड, हां (सी के लिए), लेकिन यह उस भाषा पर निर्भर करता है जिसमें आप विकसित होते हैं। लेकिन किसी भी तरह से आप किसी स्ट्रीम से कुछ पढ़ रहे होंगे, और 'pops' के माध्यम से 'lsusb -d ...' को कॉल करना आवश्यक लगता है विवरण के साथ पूरी फ़ाइल को पार्स करने से कम कीस्ट्रोक। –

1

आपके यूएसबी डिवाइस को वास्तविक सही नामों पर विक्रेता और उत्पाद आईडी से मिलान करने की आवश्यकता नहीं है।

यह जानकारी डिवाइस से ही libusb या lsusb जैसी चीज़ों से प्राप्त करना सुरक्षित होगा।

3

मेरी उबंटू प्रणाली पर, lsusb(1) मैनपेज कहता है कि /var/lib/usbutils/usb.ids आईडी फ़ाइल का स्थान है; वास्तव में, दो सिम्लिंक हैं, जिनमें से एक आपका /usr/share/misc/usb.ids है। मैं सिमलिंक पर भरोसा करने से पहले वास्तविक स्थान पर भरोसा चाहते हैं:

$ ls -l /usr/share/misc/usb.ids /var/lib/misc/usb.ids /var/lib/usbutils/usb.ids 
lrwxrwxrwx 1 root root  25 2010-04-29 18:08 /usr/share/misc/usb.ids -> /var/lib/usbutils/usb.ids 
lrwxrwxrwx 1 root root  19 2010-04-29 18:08 /var/lib/misc/usb.ids -> ../usbutils/usb.ids 
-rw-r--r-- 1 root root 368377 2009-11-06 09:26 /var/lib/usbutils/usb.ids 
3

इस अपने आप की कोशिश की नहीं है, लेकिन libudev's udev_device_get_property_value यह होना चाहिए; इसका उपयोग pulseaudio's udev-util.c में udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")) के रूप में किया जाता है।

यहाँ एक छोटा सा उदाहरण मैं सिर्फ एक साथ रखा, पर udev-util.c आधारित है - ध्यान दें कि मैं का उपयोग किया है एक Arduino Duemillanove FTDI FT232 चिप के साथ, जिसका udev पथ मैं udevadm का उपयोग कर पाते हैं (नीचे दिए गए कोड में टिप्पणी देखें), और फिर मैं नीचे दिए गए कार्यक्रम में यह hardcoded, udevl.c:

// sudo apt-get install libudev-dev 
// build with: gcc -o udevl -ludev -Wall -g udevl.c 

#include <stdio.h> 

#include <libudev.h> 

int main(int argc, char **argv) 
{ 
    const char *v; 
    char t[256]; 
    struct udev *udev; 
    struct udev_device *card = NULL; 

    if (!(udev = udev_new())) { 
     fprintf(stderr, "Failed to allocate udev context.\n"); 
     return -1; 
    } 

    // $ lsusb | grep FT232 
    // Bus 002 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC  
    // $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep "looking at device" 
    // looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0' 
    // (that one is under /sys) 
    // hardcode that path below: 

    // udev_get_sys_path(udev) for me: '/sys' 
    sprintf(t, "%s/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0", udev_get_sys_path(udev)); 
    fprintf(stdout, " path: %s\n", t); 

    card = udev_device_new_from_syspath(udev, t); 
    fprintf(stdout, " udev_device: 0x%08X\n", (unsigned int)card); 

    if ((v = udev_device_get_property_value(card, "ID_MODEL_FROM_DATABASE"))) 
    fprintf(stdout, "got ID_MODEL_FROM_DATABASE: %s\n", v); 
    else 
    fprintf(stdout, "failed getting ID_MODEL_FROM_DATABASE: %s\n", v); 

    fprintf(stdout, "Done.\n"); 

    if (card) 
    udev_device_unref(card); 

    if (udev) 
    udev_unref(udev); 

    return 0; 
} 

इस कार्यक्रम (साथ Arduino संलग्न) आउटपुट:

$ ./udevl 
path: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0 
udev_device: 0x09FBF080 
got ID_MODEL_FROM_DATABASE: FT232 USB-Serial (UART) IC 
Done. 

... और "FT232 USB-सीरियल (यूएआरटी) आईसी "वीआईडी ​​के लिए सही प्रविष्टि है: पीआईडी ​​0403: 6001 usb.ids में।

उम्मीद है कि यह मदद करता है,
चीयर्स!

+0

संरचना udev * udev कैसे प्रारंभ करें ;? संरचना udev * udev = नल? क्योंकि मेरा कोड चेकर इसके लिए त्रुटि दे रहा है। धन्यवाद। – sree

संबंधित मुद्दे

 संबंधित मुद्दे