Android 裝置節點查詢及裝置資訊讀取
阿新 • • 發佈:2019-01-25
前幾天,又開了一個新專案,發現讀取一個USB dongle的版本號資訊的時候讀取不出來,最後發現是一個新的dongle
於是需要修改native層的C++應用程式:
1.首先看/dev目錄下的hidraw裝置節點有哪些:
fd = open(DEVICE_NFC_PATH, O_RDWR /*| O_NONBLOCK*/); if (fd < 0){ printf("Maybe the device have been reboot\n"); int i = 0; for ( ;i < 20; i++) { sprintf(filename, "/dev/hidraw%d", i); printf("\n print filename =%s\n",filename); fd = open(filename, O_RDWR /*| O_NONBLOCK*/); if (fd < 0){ printf("can't find the device !!\n"); return 0; } if (freespace_checkDeviceInfo(fd , filename )) { printf("Found Freespace device interface.\n"); return 1; } close(fd); } } else if (freespace_checkDeviceInfo(fd , filename )) { printf("Found Freespace device interface.\n"); return 1; }
2.然後針對每個裝置節點,判斷是否是符合條件的裝置:
int rc = ioctl(hid_device->_fd, HIDIOCGRAWINFO, &info);
if (rc < 0) {
perror("HIDIOCGRAWINFO");
goto fail;
}
printf("HID device info %04x:%04x:%04x is\n", info.bustype,info.vendor, info.product);
後面針對裝置資訊進行檢測的時候,發現是個新的裝置,因為可以獲取到新裝置的節點資訊,所以就在程式中增加了這個dongle的檢測條件使其可以通過檢測。
因為通訊協議是一樣的,所以新增這個裝置後,利用同樣的通訊協議將獲取dongle資訊的命令寫到裝置節點,通過檔案IO便可以得到結果了。
rc=fdp_->waitForReadReady(1000, &readReady);
if(readReady)
rc = read(fd_, ProRdBuf, sizeof(ProRdBuf));
if(rc<0){
printf("can't read dongle's version\n");
return -1;
}
_cmd->_return_value = ProRdBuf;