0

短い: 特定の USB デバイスで使用されているドライバーを確認する posix の方法はありioctl()ますか?

そして今、私がそれを必要とする理由:

iwlist から派生し、iwlib を使用する wlan スキャン アプリケーション (USB wlan ドングルを使用するデバイス専用) があります。

簡単に言えば、次のようなものでスキャンを初期化することです。

struct iwreq wrq;
ioctl(skfd, SIOCSIWSCAN, &wrq);

に保存された結果を待ってから、検出されたネットワークに関する情報を含むトークンにデータをトークン化してwrq.u.data.pointer解析します。iw_extract_event_streamstruct 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