جمع معلومات حول أجهزة أوسب المعلقة عبر إوسبديفيسينتيرفاسي245

StackOverflow https://stackoverflow.com/questions/7377168

  •  28-10-2019
  •  | 
  •  

سؤال

أحاول الحصول على بعض المعلومات (مثل اسم المنتج) عبر IOUSBDeviceInterface245 (من يوكيت على ماك أوس س):
كود #1

io_iterator_t iterator;
io_object_t   usb_device  
SInt32 score = 0;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault,     
                                           IOServiceNameMatching("AppleUSBOHCI"),    
                                           &iterator);   
IOCFPlugInInterface     **plugin_interface = NULL; 
IOUSBDeviceInterface245 **usb_interface    = NULL;
// ...
// enumerate devices (usb_device = IOIteratorNext(iterator))
// ...
IOReturn return_code = IOCreatePlugInInterfaceForService(usb_device,  
                                                  kIOUSBDeviceUserClientTypeID, 
                                                  kIOCFPlugInInterfaceID,  
                                                  &plugin_interface,
                                                  &score);
HRESULT h_result = (*pluginInterface)->QueryInterface(pluginInterface,
                                  CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID245), 
                                  (LPVOID)&usb_interface);
IODestroyPlugInInterface(pluginInterface);

UInt8 product_string_index;
return_code = (*usb_interface)->USBGetProductStringIndex(usb_interface,  
                                                         &product_string_index);
// Next, getting a product string by string's index. To do so, we need to send  
// IOUSBDevRequest (with type "kUSBRqGetDescriptor") to the current USB-device.
// Code bellow - is a pseudocode:
char *product_name = malloc(128);
get_string_by_index(usb_interface, product_string_index, product_string, 128);

هذا الرمز يعمل بشكل جيد لجميع الأجهزة العاملة الآن ، لكنه لا يعمل مع تعليق ("النوم")
الأجهزة (product_name هو مجرد سلسلة فارغة).

ولكن ، إذا كنت تستخدم هذا الرمز:
كود #2

 CFMutableDictionaryRef child_properties = CFDictionaryCreateMutable(NULL, 0,  
                                                                NULL,NULL);
 kern_return_t kr;
 io_service_t io_service;
 // iterator = iterator for "AppleUSBOHCI" or "AppleUSBEHCI" services
 while((io_service = IOIteratorNext(iterator))) {      
    io_iterator_t   children_iterator;
    kernel_return = IORegistryEntryGetChildIterator(io_service, kIOServicePlane,  
                                                   &children_iterator);
    io_registry_entry_t child;
    while((child = IOIteratorNext(children_iterator))) {
      // Create a CFDictionary with usb-device's properties
      IORegistryEntryCreateCFProperties(child, &child_properties,  
                                        kCFAllocatorDefault, 
                                        kNilOptions);
      NSLog(@"%@",[(NSDictionary*)child_properties valueForKey:@"USB Product Name"]);
    }
  }

هذا يعمل لجميع الأجهزة على الإطلاق (لا أعرف لماذا).

حاولت تنبيه الأجهزة المعلقة بواسطة هذا الرمز (باستخدام الرمز رقم 1):

(*usb_interface)->USBDeviceSuspend(usb_interface, false);

لكنه لم يتغير شيء.

شيء واحد لاحظته-الرمز رقم 1 يعمل بشكل كامل لجميع الخصائص من أجهزة النوم ، باستثناء قيم السلسلة (التي تحصل عليها السلسلة مؤشر).

تحديث:
لذا ، سؤالي هو كيف يمكنني إلغاء تعليق جهاز لاستخدامه مع كتلة التعليمات البرمجية الأولى?
يعطيكم الصّحة.

هل كانت مفيدة؟

المحلول

لا يمكنك قراءة السلسلة من جهاز معلق (كما في الكود رقم 1) حيث تتم قراءتها مباشرة من الجهاز (الذي لا يمكنه الاستجابة ، حيث يتم تعليقه).لقراءة هذه مباشرة ، ستحتاج إلى إلغاء تعليق الجهاز أولا (والتي قد تكون فكرة سيئة إذا تم تعليقها من قبل السائق ، تذكر أيضا التحقق من النجاح)

إذا كنت ترغب في قراءة السلاسل القياسية ، فاستخدم كتلة التعليمات البرمجية الثانية (التي تقرأ الخصائص ، التي تم جلبها بالفعل من الجهاز)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top