1

そこの

C#/mono を使用して、Linux デバイスにワイヤレス アダプターがあるかどうかという結果を取得したいと考えています。

ワイヤレス アダプタが接続されている場合にコマンド「iwconfig」を使用すると、次の結果が得られます。

lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11bg  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated
          Encryption key:off
          Power Management:on

接続されていない場合、結果は次のとおりです。

 lo        no wireless extensions.

 eth0      no wireless extensions.

System.Net.NetworkInformation.NetworkInterface.NetworkInterfaceTypeで取得したいのですが、「eth0」と「wlan0」の場合、戻り値はどちらも「Ethernet」のようです。

私の質問は、ワイヤレス アダプターを区別する他の方法はありますか? ありがとう。

4

2 に答える 2

2

次のいずれかを実行できます。

  1. インターフェイスが に表示されるかどうかを確認します/proc/net/wireless
  2. SIOCGIWNAMEソケットを作成し、インターフェース名を渡して呼び出します。
  3. 必要なワイヤレス固有のタスクを試して、失敗するかどうかを確認します。

#2の可能な解決策は次のとおりです。

using System;
using System.Net.NetworkInformation;
using System.Net.Sockets;

public class App
{
        public static int Main (string[] args)
        {
                NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Unspecified);
                foreach(NetworkInterface nic in nics)
                {
                        byte[] name = System.Text.Encoding.ASCII.GetBytes(nic.Description);
                        byte[] request = new byte[32];
                        Array.Copy(name, request, name.Length);
                        bool wireless;
                        try
                        {
                                // SIOCGIWNAME is 0x8b01
                                socket.IOControl(0x8b01, request, request);
                                wireless = true;
                        } catch (SocketException) {
                                wireless = false;
                        }
                        Console.WriteLine("{0} wireless={1}", nic.Description, wireless);
                }
                return 0;
        }
}
于 2013-10-14T15:10:23.680 に答える
0

公式ではないかもしれませんが、機能します。

    private Process _proCheckWLANInterface;
    private bool CheckWirelessAdapter()
    {
        bool flag = false;
        InitProcess(out _proCheckWLANInterface,"iwconfig","");
        string strResults = executeCmd(_proCheckWLANInterface);
        var datas = strResults.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        foreach (var item in datas)
        {
            if (item.Contains("IEEE 802.11"))
            {
                flag= true;
                break;
            }
            else
            {
                logger.Warn("Does not attached Wi-Fi Radio");
            }
        }
        return flag;

    }
    private void InitProcess(out Process pro,string cmd, string args)
    {
        pro = new Process();
        pro.StartInfo = new ProcessStartInfo();
        pro.StartInfo.FileName = cmd;
        pro.StartInfo.Arguments = args;
        pro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        pro.StartInfo.RedirectStandardOutput = true;
        pro.StartInfo.UseShellExecute = false;
        pro.StartInfo.CreateNoWindow = true;
    }
    private string executeCmd(Process pro)
    {
        try
        {
            pro.Start();
            pro.WaitForExit();
            //logger.Trace(pro.StandardOutput.ReadToEnd());
            return pro.StandardOutput.ReadToEnd();
        }
        catch (Exception ex)
        {
            logger.Debug("Exception in executeCmd method:", ex);
        }
        finally
        {
            pro.Close();
            pro.Dispose();
            pro = null;
        }
        return string.Empty;
    }
于 2013-10-25T01:00:32.943 に答える