2011-09-27 41 views
18

Tôi có giới hạn hiển thị đối với hệ điều hành Mac OS X và bây giờ tôi đã bắt đầu sử dụng Xcode và đang nghiên cứu về bộ I/O. Tôi cần tạo một chương trình trong Xcode dưới công cụ dòng lệnh để liệt kê tất cả các thiết bị USB được kết nối trong hệ thống Mac. Những người có kinh nghiệm trước đây, xin hãy giúp tôi. Nếu bất cứ ai có thể cung cấp cho tôi với mã mẫu sau đó nó sẽ được sử dụng tuyệt vời, như tôi đang tìm kiếm điểm khởi đầu.Làm cách nào để tạo chương trình liệt kê tất cả các thiết bị USB trong máy Mac?

Trả lời

19

Bạn có thể thích ứng USBPrivateDataSample yêu cầu của bạn , mẫu thiết lập trình thông báo, liệt kê các thiết bị hiện được đính kèm, sau đó đợi thiết bị đính kèm/tháo rời. Nếu bạn làm như vậy, bạn sẽ muốn xóa usbVendorusbProduct từ điển phù hợp, vì vậy tất cả các thiết bị USB được kết hợp.

Cách khác, bạn có thể sử dụng IOServiceGetMatchingServices để nhận trình lặp cho tất cả các dịch vụ phù hợp hiện tại, sử dụng từ điển được tạo bởi IOServiceMatching(kIOUSBDeviceClassName).

Đây là một mẫu ngắn (mà tôi chưa bao giờ chạy):

#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

Cảm ơn sự giúp đỡ của bạn. Nó rất hữu ích và điều này tương tự như những gì tôi đang tìm kiếm. khi tôi xây dựng nó nhưng mã này được hiển thị lỗi như lỗi: IOServiceGetmatchingServices được tham chiếu từ _main trong main.o ... Lỗi tương tự cho _IOObjectRelease, _IOServiceMatching, _IOIteratorNext, _kIOMasterPortDefault..I đã tạo một dự án theo xcode-> Command line tool-> standard C++. Nếu bạn có thể giúp đỡ, tôi sẽ rất biết ơn bạn – Dili

+0

Lỗi mà tôi gặp khi xây dựng ................. Ký hiệu không xác định: "_kIOMasterPortDefault", được tham chiếu từ: _kIOMasterPortDefault $ non_lazy_ptr trong main.o "_IOServiceGetMatchingServices", tham chiếu từ: _main trong main.o "_IOObjectRelease", tham chiếu từ: _main trong main.o _main trong main.o "_IOServiceMatching", tham chiếu từ: _chính trong chính.o "_IOIteratorNext", được tham chiếu từ: _chính trong chính.o ld: (các) biểu tượng không tìm thấy collect2: ld trả về 1 trạng thái thoát – Dili

+3

Bạn cần sử dụng khung công cụ I/O Kit (ví dụ 'IOKit.framework') và Core Foundation trong dự án của bạn, hoặc chiến thắng này ' t liên kết. – Hasturkun

2

Nếu bạn chạy system_profiler SPUSBDataType nó sẽ liệt kê tất cả các thiết bị USB được kết nối với hệ thống, sau đó bạn có thể tương tác với dữ liệu đó bằng cách đổ nó vào tệp văn bản hoặc đọc nó từ lệnh vào ứng dụng và làm việc với nó .

+0

nhờ sự giúp đỡ của bạn. – Dili

7

Bạn chỉ cần truy cập IOKit Registry. Bạn cũng có thể sử dụng công cụ ioreg để thực hiện việc này (ví dụ: chạy công cụ này qua system() hoặc popen()). Nếu không thì bạn ít nhất có thể sử dụng nó để xác minh mã của bạn:

Thông tin về ioreg công cụ: danh sách

$ man ioreg 

Nhận các thiết bị USB:

$ ioreg -Src IOUSBDevice 
+0

Cảm ơn sự giúp đỡ của bạn. Nó sẽ rất hữu ích để xác minh. Nhưng tôi cần một chương trình trong xcode (trong c + +) cho danh sách các thiết bị USB – Dili

+2

Bạn đã đọc một phần về cách sử dụng 'system()' hoặc 'popen()' để thực thi công cụ ioreg từ bên trong mã của bạn? –

+0

Tôi đã đọc nó. nhưng tôi đã looing cho một cái gì đó giống như mã được đưa ra dưới đây bởi hausturkun. điều này cũng hữu ích. nhưng nếu bạn đưa ra một số mã mẫu như tôi đã nói nó sẽ là tốt nhất. – Dili

Các vấn đề liên quan