Коротко: есть ли способ posix, чтобы проверить, какой драйвер используется определенным устройством USB, например, с помощью ioctl()
?
А теперь, зачем мне это нужно:
У меня есть приложение для сканирования WLAN (предназначенное для устройств, использующих USB-адаптеры Wlan), которое получено из iwlist и использует iwlib.
Я коротко, что делает, инициализирует сканирование примерно так:
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
, когда это возможно. Поэтому я хотел бы проверить, может ли драйвер, используемый подключенным в данный момент устройством, стандартным способом, или мне следует использовать фокус-фокус, описанный выше.