短い: 特定の USB デバイスで使用されているドライバーを確認する posix の方法はあり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 を使用する必要があるかどうかを確認したいと思います。