मेरे पास मैक ओएस एक्स ऑपरेटिंग सिस्टम का सीमित एक्सपोजर है और अब मैंने एक्सकोड का उपयोग करना शुरू कर दिया है और मैं आई/ओ किट के बारे में पढ़ रहा हूं। मैक सिस्टम में जुड़े सभी यूएसबी डिवाइसों को सूचीबद्ध करने के लिए मुझे कमांड लाइन उपकरण के तहत एक्सकोड में एक प्रोग्राम बनाने की आवश्यकता है। जिनके पास पिछले अनुभव है, कृपया मेरी मदद करें। अगर कोई मुझे नमूना कोड प्रदान कर सकता है तो यह बहुत अच्छा उपयोग होगा, क्योंकि मैं शुरुआती बिंदु की तलाश में हूं।मैक में सभी यूएसबी डिवाइसों को सूचीबद्ध करने के लिए प्रोग्राम कैसे बनाएं?
उत्तर
आप अपनी आवश्यकताओं के USBPrivateDataSample अनुकूलित कर सकते हैं
ioreg
उपकरण पर जानकारी: यदि नहीं तो आप कम से कम अपने कोड सत्यापित करने के लिए उपयोग कर सकते हैं , नमूना एक नोटिफ़ायर सेट करता है, वर्तमान में संलग्न डिवाइस सूचीबद्ध करता है, फिर डिवाइस अटैचमेंट/डिटेच के लिए प्रतीक्षा करता है। यदि आप करते हैं, तो आप usbVendor
और usbProduct
मिलान करने वाले शब्दकोशों को हटाना चाहते हैं, इसलिए सभी यूएसबी डिवाइस मेल खाते हैं।
वैकल्पिक रूप से, आप 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;
}
यदि आप system_profiler SPUSBDataType
चलाते हैं तो यह सिस्टम से जुड़े सभी यूएसबी डिवाइसों को सूचीबद्ध करेगा, फिर आप उस डेटा के साथ टेक्स्ट फ़ाइल में डंप करके या इसे कमांड से एप्लिकेशन में पढ़कर और उसके साथ काम कर सकते हैं ।
आपकी मदद के लिए धन्यवाद:
यहाँ एक छोटा नमूना (जो मैं कभी नहीं आई है) है। – Dili
आपको केवल आईओकेट रजिस्ट्री तक पहुंचने की आवश्यकता है। ऐसा करने के लिए आप ioreg
टूल का उपयोग करने में सक्षम हो सकते हैं (उदा। इसे system()
या popen()
के माध्यम से चलाएं)। यूएसबी उपकरणों की
$ man ioreg
प्राप्त सूची:
$ ioreg -Src IOUSBDevice
आपकी मदद के लिए धन्यवाद। सत्यापन के लिए यह बहुत उपयोगी होगा। लेकिन मुझे यूएसबी डिवाइसों को सूचीबद्ध करने के लिए एक्सकोड (सी ++ में) में एक प्रोग्राम की आवश्यकता है – Dili
क्या आपने अपने कोड के भीतर से ioreg टूल निष्पादित करने के लिए 'system()' या 'popen() 'का उपयोग करने के बारे में हिस्सा पढ़ा था? –
मैंने इसे पढ़ा। लेकिन मैं हुस्टुरकुन द्वारा दिए गए कोड की तरह कुछ के लिए looing था। यह भी उपयोगी है। लेकिन अगर आप कुछ नमूना कोड देते हैं जैसे मैंने कहा कि यह सबसे अच्छा होगा। – Dili
आपकी मदद के लिए धन्यवाद। यह बहुत उपयोगी है और यह वही है जो मैं देख रहा हूं। जब मैं इसे बनाता हूं लेकिन यह कोड त्रुटियों की तरह त्रुटियों को दिखा रहा है: IOServiceGetmatching सेवा _main से main.o में संदर्भित है ... _IOObjectRelease, _IOServiceMatching, _IOIteratorNext, _kIOMasterPortDefault..I के लिए समान त्रुटियां मैंने xcode-> कमांड लाइन टूल-> मानक के तहत एक प्रोजेक्ट बनाया C++। यदि आप मदद कर सकते हैं, तो मैं आपके लिए बहुत आभारी हूं – Dili
बिल्डिंग के दौरान मुझे मिली त्रुटियां ................. अपरिभाषित प्रतीकों: "_kIOMasterPortDefault", से संदर्भित: _kIOMasterPortDefault $ non_lazy_ptr main.o में "_IOServiceGetMatchingServices", से संदर्भित: main.o "_IOObjectRelease" में _main, से संदर्भित: main.o "_IOServiceMatching" में main.o _main में _main, से संदर्भित: _main main.o "_IOIteratorNext", से संदर्भित: मुख्य में _main।o ld: प्रतीक नहीं मिला संग्रह 2: ld 1 निकास स्थिति – Dili
लौटा दी गई है आपको अपनी परियोजना में I/O किट फ्रेमवर्क (यानी 'IOKit.framework') और कोर फाउंडेशन फ्रेमवर्क का उपयोग करने की आवश्यकता है, या यह ' टी लिंक – Hasturkun