2011-09-27 59 views
18

我對Mac OS X操作系統的曝光有限,現在我已經開始使用Xcode並正在研究I/O套件。我需要在命令行工具下的Xcode中創建一個程序,以列出在Mac系統中連接的所有USB設備。在此之前有經驗的人請幫助我。如果任何人都可以爲我提供示例代碼,那麼它將非常有用,因爲我正在尋找出發點。如何創建一個程序來列出Mac中的所有USB設備?

回答

19

可以適應USBPrivateDataSample您的需求樣本設置通知程序,列出當前連接的設備,然後等待設備連接/分離。如果這樣做,則需要刪除匹配字典的usbVendorusbProduct,以便匹配所有USB設備。

或者,您可以使用IOServiceGetMatchingServices爲所有當前匹配服務使用由IOServiceMatching(kIOUSBDeviceClassName)創建的字典獲取迭代器。

這裏是一個簡短的樣品(這是我從來沒有運行):

#include <IOKit/IOKitLib.h> 
#include <IOKit/usb/IOUSBLib.h> 

int main(int argc, const char *argv[]) 
{ 
    CFMutableDictionaryRef matchingDict; 
    io_iterator_t iter; 
    kern_return_t kr; 
    io_service_t device; 

    /* set up a matching dictionary for the class */ 
    matchingDict = IOServiceMatching(kIOUSBDeviceClassName); 
    if (matchingDict == NULL) 
    { 
     return -1; // fail 
    } 

    /* Now we have a dictionary, get an iterator.*/ 
    kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter); 
    if (kr != KERN_SUCCESS) 
    { 
     return -1; 
    } 

    /* iterate */ 
    while ((device = IOIteratorNext(iter))) 
    { 
     /* do something with device, eg. check properties */ 
     /* ... */ 
     /* And free the reference taken before continuing to the next item */ 
     IOObjectRelease(device); 
    } 

    /* Done, release the iterator */ 
    IOObjectRelease(iter); 
    return 0; 
} 
+0

感謝您的幫助。這非常有用,這與iam尋找的相似。當我構建它,但此代碼顯示錯誤,如錯誤:IOServiceGetmatchingServices從_main在main.o引用...類似的錯誤爲_IOObjectRelease,_IOServiceMatching,_IOIteratorNext,_kIOMasterPortDefault..I創建一個項目在xcode->命令行工具 - >標準C++。如果你可以幫忙,我會非常感謝你 – Dili

+0

我在建設時遇到的錯誤................. 未定義符號: 「_kIOMasterPortDefault」,引用自: _kIOMasterPortDefault $ non_lazy_ptr在main.o中 「_IOServiceGetMatchingServices」,從引用:在main.o中 「_IOObjectRelease」 _main,從引用:在main.o中 「_IOServiceMatching」 在main.o中 _main _main,從引用: _main in main.o 「_IOIteratorNext」,引用來自: _main in main。0 ld:符號未找到 collect2:ld返回1退出狀態 – Dili

+3

您需要在項目中使用I/O Kit框架(即'IOKit.framework')和Core Foundation框架,否則會贏得' t鏈接。 – Hasturkun

2

如果您運行system_profiler SPUSBDataType它會列出連接到系統的所有USB設備,然後您可以通過將其轉儲到文本文件或將其從命令讀入應用程序並與其一起使用來與該數據交互。

+0

感謝您的幫助。 – Dili

7

你只需要訪問由於IOKit 註冊。您可以使用ioreg工具來執行此操作(例如,通過system()popen()運行它)。如果沒有,那麼你至少可以用它來驗證你的代碼:

信息上ioreg工具:USB設備的

$ man ioreg 

獲取列表:

$ ioreg -Src IOUSBDevice 
+0

感謝您的幫助。這對驗證非常有幫助。但我需要一個xcode程序(用C++)來列出usb設備 – Dili

+2

您是否閱讀過使用'system()'或'popen()'在代碼中執行ioreg工具的部分? –

+0

我看過了。但我喜歡hausturkun下面給出的代碼。這也是有用的。但如果你提供一些示例代碼,就像我說的那樣,這將是最好的。 – Dili

相關問題