【问题标题】:How to first connect to a specific SSID programmatically in Xamarin.Android?如何首先在 Xamarin.Android 中以编程方式连接到特定的 SSID?
【发布时间】:2021-01-28 18:02:51
【问题描述】:

我在以编程方式将我的设备连接到特定 SSID 时遇到问题。 我特别注意到: 如果我手动将设备连接到 SSID(用我的小指向下滑动,胆怯地点击 SSID),那么我连接到该 SSID 的代码就可以工作了。 如果 SSID 是我的设备以前从未连接过的新 SSID,则代码不起作用,但如果手动连接有效。 这太奇怪了,我不知道如何解决。

我正在使用 Xamarin.Forms 和 Xamarin.Android,以及 Android 9.0 API 28 - Pie。

有我用来(尝试)连接的代码:

public int ConnectToSSID(string SSID, string password)
    {
        var wifiConfiguration = new WifiConfiguration();
        wifiConfiguration.Ssid = '"' + SSID + '"';
        if (password.Length > 0)
        {
            wifiConfiguration.PreSharedKey = '"' + password + '"';
        }
        
        if (wifiManager == null)
        {
            wifiManager = (WifiManager)context.GetSystemService(Context.WifiService);
        }

        wifiManager.AddNetwork(wifiConfiguration);

        IList<WifiConfiguration> list = wifiManager.ConfiguredNetworks;
        foreach (WifiConfiguration conf in list)
        {
            if (conf.Ssid.Equals('"' + SSID +'"'))
            {
                wifiManager.Disconnect();
                wifiManager.EnableNetwork(conf.NetworkId, true);
                wifiManager.Reconnect();
                return 1;
            }
        }
        return 0;
    }

【问题讨论】:

    标签: c# android visual-studio xamarin.android


    【解决方案1】:

    要以编程方式连接到特定 SSID,请尝试使用以下代码。

    string ssid = "\"" + _ssid + "\"";
    string password = "\"" + _password + "\"";
    
    var wifiConfig = new WifiConfiguration
    {
        Ssid = ssid,
        PreSharedKey = password
    };
    
    var wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(WifiService);
    var addNetwork = wifiManager.AddNetwork(wifiConfig);
    
    var list = wifiManager.ConfiguredNetworks;
    foreach (var wifiConfiguration in list)
    {
        if (wifiConfiguration.Ssid != null && WifiConfiguration.Ssid.Equals("\"" + _ssid + "\""))
        {
            wifiManager.Disconnect();
            wifiManager.EnableNetwork(WifiConfiguration.NetworkId, true);
            wifiManager.Reconnect();
            break;
        }
    }
    

    【讨论】:

    • 不,它不起作用,除非我通过设置 > Wi-Fi > mySSID 进行第一次连接。然后,在与网络第一次关联后,它就可以工作了。
    • 确保您已添加所需的权限,例如:&lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&gt; &lt;uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /&gt; &lt;uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /&gt;。我测试了我这边的代码,它工作正常。
    • 是的,我添加了所需的权限。但是我刚才注意到一件事,在调用 wifiManager.addNetwork(wifiConfig); 之后我想用记录器亲自检查列表 ConfiguredNetwork,但未添加网络。为什么?
    • 你之前初始化了吗? if (wifiManager == null) 检查wifiManager 实例是否正确。尝试使用以下代码获取 WifiManager。 var wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(WifiService);
    • 我根据您的建议更改了代码并添加了一个日志,现在代码是:'wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Context.WifiService); Debug.WriteLine(wifiManager.ToString()); var addNetwork = wifiManager.AddNetwork(wifiConfiguration); Debug.WriteLine("ID == " + addNetwork);'.结果是'[0:] android.net.wifi.WifiManager@18f0dca8 [0:] ID == -1'。所以我认为 AddNetwork 方法失败了。不过非常感谢您的宝贵时间。
    【解决方案2】:

    好的,我知道真正的问题是什么:WifiManager 类无法添加新的 WifiConfiguration。 然后配置从未从 ConfiguredNetworks 列表中选择,也从未连接到它。

    要解决这个问题,必须指定我们要连接的 WifiConfiguration 的安全性。

    请注意对 API 所做的更改,因为文档建议使用:

    WifiConfiguration conf = new WifiConfiguration();
    conf.AllowedKeyManagement.Set(WifiConfiguration.[KEY_MANAGEMENT_CONST]);
    

    但这不再起作用了,你必须使用:

    WifiConfiguration conf = new WifiConfiguration();
    conf.AllowedKeyManagement.Set((int)KeyManagementType.[KEY_MANAGEMENT_CONST]);
    

    现在我的连接方法是:

    public int ConnectToSSID(string SSID, string password)
        { 
            WifiConfiguration wifiConfiguration = new WifiConfiguration();
            wifiConfiguration.Ssid =  '"' + SSID + '"';
            wifiConfiguration.AllowedKeyManagement.Set((int)KeyManagementType.None);
            
            wifiManager = (WifiManager)context.GetSystemService(Context.WifiService);
    
            var addNet = wifiManager.AddNetwork(wifiConfiguration);
            if (addNet == -1)
            {
                addNet = wifiManager.UpdateNetwork(wifiConfiguration);
            }
            if (addNet == -1)
            {
                return 0; //Error!
            }
            var list = wifiManager.ConfiguredNetworks;
            foreach (WifiConfiguration conf in list)
            {
                if (conf.Ssid.Equals('"' + SSID + '"'))
                {
                    wifiManager.Disconnect();
                    wifiManager.EnableNetwork(conf.NetworkId, true);
                    wifiManager.Reconnect();
                    return 1;
                }
            }
            return 0;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-22
      • 2014-05-02
      • 2016-07-18
      • 1970-01-01
      • 2012-02-07
      • 2016-05-10
      相关资源
      最近更新 更多