简短:是否有一种 posix 方法来检查某些 USB 设备使用什么驱动程序,例如使用ioctl()
?
现在,为什么我需要它:
我有一个从 iwlist 派生并使用 iwlib 的 wlan 扫描应用程序(专用于使用 USB wlan 加密狗的设备)。
简而言之,它所做的是使用以下内容初始化扫描:
struct iwreq wrq;
ioctl(skfd, SIOCSIWSCAN, &wrq);
而不是等待存储的结果,wrq.u.data.pointer
然后使用iw_extract_event_stream
它将数据struct iw_event iwe
标记为包含有关检测到的网络信息的标记进行解析。
这是背景,现在我真正的问题开始了。为了获得信号质量,我们需要找到标记为的标记IWEVQUAL
,然后从中读取值iwe.u.qual.qual
。不幸的是,对于某些驱动程序和系统架构,这个值总是错误的。因为由于某些原因我不能/不想更改驱动程序,所以我不得不实施一些使用信号电平计算信号质量的解决方法:
case IWEVQUAL:
{
const int lvl_max = (0.9) * (range.max_qual.level?range.max_qual.level : 255);
const int lvl_min = lvl_max * 0.6; //we assume that signal below this sevel is not received
int lvl = (iwe.u.qual.level > lvl_min)?iwe.u.qual.level : lvl_min; //however it might happen, since our assumption is very weak
int lvl_scaled;
(lvl > lvl_max)?(lvl=lvl_max):0;//it may also happen that actual level is higher that the max we assumed
lvl_scaled = ((lvl - lvl_min) * lvl_max) / (lvl_max - lvl_min);
if(ap_info == NULL) break;
ap_info->ubRssi = (100 * lvl_scaled) / lvl_max;
}
如您所见,这是一种非常肮脏的方式,基于许多任意假设,因此最好尽可能使用原始值iwe.u.qual.qual
。因此,我想检查当前插入的设备使用的驱动程序是否可以使用标准方式,或者我应该使用上面描述的 hocus pocus。