web-dev-qa-db-ja.com

Linuxで利用可能なワイヤレスネットワークのリストを取得するにはどうすればよいですか?

利用可能な無線ネットワークのリストを取得したいと思います。理想的には、これはC呼び出しを介して行われますが、システムコールで処理する必要があるかどうかは気にしません。必要なC呼び出しまたはプログラムが、エキゾチックなサードパーティのパッケージを必要としない場合はさらに良いでしょう。

インターネットでは、Sudo iwlist <interface> scanこれはコマンドラインからのトリックを行うようですが、ルート権限は必要ありません。何も変えないで、基本だけを見たい。

33
richq

ワイヤレスツール パッケージ- iwlist の一部-には、ワイヤレスツールヘルパーライブラリも含まれています。 iwlib.hをインクルードし、libiw.a(すなわち、-liwを追加します)。次に、iw_set_ext関数のドキュメントを検索します。 [〜#〜] siocsiwscan [〜#〜]パラメーターが最も有用です。このインターフェイスの使用例については、KDEライブラリのKWifiManagerソースをご覧ください( Interface_wireless_wirelessextensions :: get_available_networks メソッドを参照)。または、 ワイヤレスツールのソースコード をダウンロードして、iwlib iw_set_ext関数がiwlist.cでのスキャンにどのように使用されるかを確認することもできます。

特権に関しては、スキャンを実行するにはプロセスをrootとして実行する必要があると思います。これが他の方法でも可能かどうかを知りたいです。

Ubuntu 8.04を使用しているため、 libiw-dev パッケージを使用する必要があります。

26
Judge Maygarden

コマンドラインでスキャンを実行するのは非常に簡単です。マニュアルページはここであなたの友達です(iwconfigおよびiwlistをチェックアウト) 。しかし、Cインターフェースの使用はもう少し難しいので、それに焦点を合わせます。

まず第一に、他の人が言ったように、間違いなく 無線ツールのソースコード をダウンロードしてください。プログラミングインターフェイスのすべてのドキュメントは、。cファイルにあります。私が知る限り、APIのWebドキュメントはありません。ただし、ソースコードは読みやすくなっています。このために必要なのはiwlib.hiwlib.cだけです。質問。

iw_set_extiw_get_extを使用できますが、libiwは基本的なスキャン関数iw_scanを実装します。必要な情報のほとんどを抽出できます。

以下は、利用可能なすべてのワイヤレスネットワークのESSIDを取得する簡単なプログラムです。 -liwでコンパイルし、Sudoで実行します。

#include <stdio.h>
#include <time.h>
#include <iwlib.h>

int main(void) {
  wireless_scan_head head;
  wireless_scan *result;
  iwrange range;
  int sock;

  /* Open socket to kernel */
  sock = iw_sockets_open();

  /* Get some metadata to use for scanning */
  if (iw_get_range_info(sock, "wlan0", &range) < 0) {
    printf("Error during iw_get_range_info. Aborting.\n");
    exit(2);
  }

  /* Perform the scan */
  if (iw_scan(sock, "wlan0", range.we_version_compiled, &head) < 0) {
    printf("Error during iw_scan. Aborting.\n");
    exit(2);
  }

  /* Traverse the results */
  result = head.result;
  while (NULL != result) {
    printf("%s\n", result->b.essid);
    result = result->next;
  }

  exit(0);
}

免責事項:これは単なるデモプログラムです。一部の結果には、essidがない場合があります。さらに、これは、ワイヤレスインターフェイスが「wlan0」であることを前提としています。あなたはアイデアを得る。

iwlibソースコードを読んでください!

35
David Matlack