1. 程式人生 > >Android 裝置節點查詢及裝置資訊讀取

Android 裝置節點查詢及裝置資訊讀取

前幾天,又開了一個新專案,發現讀取一個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;