【问题标题】:How do I connect to a WiFi Network with an unknown encryption algorithm in Android?如何在 Android 中使用未知加密算法连接到 WiFi 网络?
【发布时间】:2014-03-03 16:31:04
【问题描述】:

我在 StackOverflow 上研究了这个问题,但所有答案都指定了如何使用已知的加密算法(主要是 WEP)连接到网络。在我的应用程序中,我检索了可用 wifi 网络的列表,并将它们显示在 ListView 中(使用 WifiManager)。当用户单击列表中的一项时,我想连接到网络。

我当前的实现尝试从ScanResult 的功能字符串中获取WifiConfiguration 数据。例如,这些都是检索到的实际能力字符串:

[WPA2-PSK-CCMP][ESS]
[WPA2-PSK-CCMP+TKIP][ESS]
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]

根据一些研究,我假设这些是括号分隔的功能,每个功能的第一项是- 分隔的字符串显示:

[Authentication Algorithm - Key Management Algorithm - Pairwise Cipher]

我解析这些数据,然后创建一个WifiConfiguration 对象,然后尝试连接它,但它总是失败(addNetwork 返回-1)。我究竟做错了什么?这是我的代码:

@Override
public void onItemClick(AdapterView<?> adapter, View parent, int position, long id) {
    ScanResult result = (ScanResult) adapter.getItem(position);
    WifiConfiguration config = new WifiConfiguration();

    String currentNetwork = mWifiManager.getConnectionInfo().getSSID();
    if (currentNetwork != null && currentNetwork.equals(result.SSID))
    {
        Toast.makeText(this, "Already connected", Toast.LENGTH_SHORT).show();
        return;
    }

    config.BSSID = result.BSSID;
    config.SSID = result.SSID;
    String firstCapabilities = result.capabilities.substring(1, result.capabilities.indexOf("]")-1);
    String[] capabilities = firstCapabilities.split("-");
    String auth = capabilities[0];
    String keyMgmt = capabilities[1];
    String pairwiseCipher = capabilities[2];

    int a = 0;
    if (auth.contains("EAP"))
        a |= WifiConfiguration.AuthAlgorithm.LEAP;
    else if (auth.contains("WPA"))
        a |= WifiConfiguration.AuthAlgorithm.OPEN;
    else if (auth.contains("WEP"))
        a |= WifiConfiguration.AuthAlgorithm.SHARED;
    config.allowedAuthAlgorithms.set(a);

    int k = WifiConfiguration.KeyMgmt.NONE;
    if (keyMgmt.contains("IEEE802.1X"))
        k |= WifiConfiguration.KeyMgmt.IEEE8021X;
    else if (auth.contains("WPA") && keyMgmt.contains("EAP"))
        k |= WifiConfiguration.KeyMgmt.WPA_EAP;
    else if (auth.contains("WPA") && keyMgmt.contains("PSK"))
        k |= WifiConfiguration.KeyMgmt.WPA_PSK;
    config.allowedKeyManagement.set(k);

    int c = WifiConfiguration.PairwiseCipher.NONE;
    if (pairwiseCipher.contains("CCMP"))
        c |= WifiConfiguration.PairwiseCipher.CCMP;
    if (pairwiseCipher.contains("TKIP"))
        c |= WifiConfiguration.PairwiseCipher.TKIP;
    config.allowedPairwiseCiphers.set(c);

    int networkId = mWifiManager.addNetwork(config);
    if (networkId == -1)
    {
        //always hits this line!
        Toast.makeText(this, "Failed to create network configuration", Toast.LENGTH_SHORT).show();
    }
    else
    {
        //Never reaches here!
        mWifiManager.disconnect();
        mWifiManager.enableNetwork(networkId, true);
        mWifiManager.reconnect();
    }

}

【问题讨论】:

  • Eric Woodruff 是不是碰巧了,还是其他原因?
  • @leRobot 时间太长了——我不记得了。我确实不得不在另一个项目中做类似的事情,并发现它比使用一些较新的 Android API 的示例要容易得多。
  • 感谢您的反馈。我现在正在研究这个,最近的 API 似乎没有太大变化 - 非常基本的文档,根本没有教程,因为他们喜欢为他们希望 OS UI 处理的事情而不是用户应用程序做:/

标签: android android-wifi wifimanager


【解决方案1】:

对于 WPA*,如果您未将 preSharedKey 设置为 8 个或更多字符,则会失败并显示 -1。我根本看不到你设置它。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多