0

简短:是否有一种 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。

4

0 回答 0