九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
adb devices獲得的設(shè)備標(biāo)識

adb devices獲得的設(shè)備標(biāo)識

分類: android&chrome4374人閱讀評論(3)收藏舉報

在命令行執(zhí)行adb devices,你會得到連接上的設(shè)備,結(jié)果里面有每個設(shè)備的標(biāo)識(serial number)。在adb的其他命令中,你可以用adb –s 來指定用某一個設(shè)備來執(zhí)行命令,但是每個設(shè)備的serial number都不一樣,adb是如何得到的呢?查看adb的源碼后,發(fā)現(xiàn)其獲取serial number的代碼如下:

[cpp] view plaincopy?
  1. //D:/project/android/android-1.5/development/host/windows/usb/api/adb_interface.cpp  
  2. bool AdbInterfaceObject::GetSerialNumber(void* buffer,   
  3.                                          unsigned long* buffer_char_size,   
  4.                                          bool ansi) {   
  5.   if (!IsOpened()) {   
  6.     SetLastError(ERROR_INVALID_HANDLE);   
  7.     return false;   
  8.   }  
  9.   // Open USB device for this intefface   
  10.   HANDLE usb_device_handle = CreateFile(interface_name().c_str(),   
  11.                                         GENERIC_READ,   
  12.                                         FILE_SHARE_READ | FILE_SHARE_WRITE,   
  13.                                         NULL,   
  14.                                         OPEN_EXISTING,   
  15.                                         0,   
  16.                                         NULL);   
  17.   if (INVALID_HANDLE_VALUE == usb_device_handle)   
  18.     return NULL;  
  19.   WCHAR serial_number[512];  
  20.   // Send IOCTL   
  21.   DWORD ret_bytes = 0;   
  22.   BOOL ret = DeviceIoControl(usb_device_handle,   
  23.                              ADB_IOCTL_GET_SERIAL_NUMBER,   
  24.                              NULL, 0,   
  25.                              serial_number, sizeof(serial_number),   
  26.                              &ret_bytes,   
  27.                              NULL);  
  28.   // Preserve error accross CloseHandle   
  29.   ULONG error = ret ? NO_ERROR : GetLastError();  
  30.   ::CloseHandle(usb_device_handle);  
  31.   if (NO_ERROR != error) {   
  32.     SetLastError(error);   
  33.     return false;   
  34.   }  
  35.   unsigned long str_len =   
  36.     static_cast(wcslen(serial_number) + 1);  
  37.   if ((NULL == buffer) || (*buffer_char_size < str_len)) {   
  38.     *buffer_char_size = str_len;   
  39.     SetLastError(ERROR_INSUFFICIENT_BUFFER);   
  40.     return false;   
  41.   }  
  42.   if (!ansi) {   
  43.     // If user asked for wide char name just return it   
  44.     wcscpy(reinterpret_cast(buffer), serial_number);   
  45.     return true;   
  46.   }  
  47.   // We need to convert name from wide char to ansi string   
  48.   int res = WideCharToMultiByte(CP_ACP,   
  49.                                 0,   
  50.                                 serial_number,   
  51.                                 static_cast(str_len),   
  52.                                 reinterpret_cast(buffer),   
  53.                                 static_cast(*buffer_char_size),   
  54.                                 NULL,   
  55.                                 NULL);   
  56.   return (res != 0);   
  57. }  
 

從上面的代碼可以看到,adb是通過DeviceIoControl發(fā)送ADB_IOCTL_GET_SERIAL_NUMBER獲取的,而上面CreateFile使用的interface_name是adb設(shè)備的全路徑,格式如"http:////?//usb#vid_xxxx&pid_xxxx&mi_xx#123456789abcdef#{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},創(chuàng)建adb設(shè)備的代碼如下:

[cpp] view plaincopy?
  1. //D:/project/android/android-1.5/development/host/windows/usb/api/adb_api.cpp  
  2. ADBAPIHANDLE AdbCreateInterface(GUID class_id,   
  3.                                 unsigned short vendor_id,   
  4.                                 unsigned short product_id,   
  5.                                 unsigned char interface_id) {   
  6.   // Enumerate all active interfaces for the given class   
  7.   AdbEnumInterfaceArray interfaces;  
  8.   if (!EnumerateDeviceInterfaces(class_id,   
  9.                                  DIGCF_DEVICEINTERFACE | DIGCF_PRESENT,   
  10.                                  true,   
  11.                                  true,   
  12.                                  &interfaces)) {   
  13.     return NULL;   
  14.   }  
  15.   if (interfaces.empty()) {   
  16.     SetLastError(ERROR_DEVICE_NOT_AVAILABLE);   
  17.     return NULL;   
  18.   }  
  19.   // Now iterate over active interfaces looking for the name match.   
  20.   // The name is formatted as such:   
  21.   // "http:////?//usb#vid_xxxx&pid_xxxx&mi_xx#123456789abcdef#{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"   
  22.   // where   
  23.   //    vid_xxxx is for the vendor id (xxxx are hex for the given vendor id),   
  24.   //    pid_xxxx is for the product id (xxxx are hex for the given product id)   
  25.   //    mi_xx is for the interface id  (xx are hex for the given interface id)   
  26.   // EnumerateDeviceInterfaces will guarantee that returned interface names   
  27.   // will have our class id at the end of the name (those last XXXes in the   
  28.   // format). So, we only need to match the beginning of the name   
  29.   wchar_t match_name[64];   
  30.   if (0xFF == interface_id) {   
  31.     // No interface id for the name.   
  32.     swprintf(match_name, L"http:////?//usb#vid_%04x&pid_%04x#",   
  33.              vendor_id, product_id);   
  34.   } else {   
  35.     // With interface id for the name.   
  36.     swprintf(match_name, L"http:////?//usb#vid_%04x&pid_%04x&mi_%02x#",   
  37.              vendor_id, product_id, interface_id);   
  38.   }   
  39.   size_t match_len = wcslen(match_name);  
  40.   for (AdbEnumInterfaceArray::iterator it = interfaces.begin();   
  41.        it != interfaces.end(); it++) {   
  42.     const AdbInstanceEnumEntry& next_interface = *it;   
  43.     if (0 == wcsnicmp(match_name,   
  44.                       next_interface.device_name().c_str(),   
  45.                       match_len)) {   
  46.       // Found requested interface among active interfaces.   
  47.       return AdbCreateInterfaceByName(next_interface.device_name().c_str());   
  48.     }   
  49.   }  
  50.   SetLastError(ERROR_DEVICE_NOT_AVAILABLE);   
  51.   return NULL;   
  52. }  
 

adb是每個1秒沒有所有的usb設(shè)備(classid:{0xf72fe0d4, 0xcbcb, 0x407d, {0x88, 0x14, 0x9e, 0xd6, 0x73, 0xd0, 0xdd, 0x6b}}),所以插上usb后起碼要1秒adb devices才能發(fā)現(xiàn)新設(shè)備。

[cpp] view plaincopy?
  1. //D:/project/android/android-1.5/system/core/adb/usb_windows.c  
  2. void* device_poll_thread(void* unused) {   
  3.   D("Created device thread/n");  
  4.   while(1) {   
  5.     find_devices();   
  6.     adb_sleep_ms(1000);   
  7.   }  
  8.   return NULL;   
  9. }  
 

如果你用windows監(jiān)聽usb設(shè)備的方式去監(jiān)聽adb設(shè)備,你可以在PDEV_BROADCAST_DEVICEINTERFACE結(jié)構(gòu)體的dbcc_name字段獲得GetSerialNumber函數(shù)所使用的interface_name。

分享到:
查看評論
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
USB Isolator: Analog Dialogue: Analog Devices
Android 讓adb logcat打印內(nèi)核調(diào)試信息
Android usb
Windows XP下USB轉(zhuǎn)串口驅(qū)動編碼實現(xiàn)分析
Android之在筆記本電腦adb devices識別不了oppo A9手機(設(shè)備管理器ADB Interface里面有個黃色感嘆號)
python USB訪問模塊
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服