繁体   English   中英

Android连接到托管网络

[英]Android connecting to hosted network

我正在一个项目中尝试将移动设备连接到Windows托管网络。 android设备扫描主机Windows系统上的QR码以获取网络SSID和密钥,进行连接,然后与Windows系统上的服务器软件进行通信以完成其他有趣的工作。 我遇到的问题是,应用程序在连接到托管网络时行为异常。 它在很多时间(甚至在大多数时间)都可以正常连接。 有时,我最终会连接到另一个不同的Wifi配置文件。 其他时候,我的代码失败时addNetwork -ing的WifiConfigurationWifiManager ,有时候我看到一些连接,但随后获得创建套接字时抛出超时异常。

抱歉,下面是我要连接的代码。 Windows托管的网络是WPA2,绝对不是由不正确的SSID和/或密钥引起的。 在此先感谢您的帮助,这让我发疯了!

String contSSID = "SomeSSID";
String contKEY = "SomePassword";

WifiManager wifiManager = (WifiManager) (ontext.getSystemService(Context.WIFI_SERVICE);
boolean addNetwork = true;
int netId = -1;

for (WifiConfiguration tmp : wifiManager.getConfiguredNetworks()) {
    if (tmp.SSID.equals( "\""+contSSID+"\"")) {
        addNetwork = false;
        netId = tmp.networkId;
    }
}
if (addNetwork) {
    WifiConfiguration conf = new WifiConfiguration();
    conf.SSID = "\"".concat(contSSID).concat("\"");
    conf.preSharedKey = "\"".concat(contKEY).concat("\"");
    conf.priority = 40;
    conf.hiddenSSID = false;
    conf.status = WifiConfiguration.Status.ENABLED;
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    for (int i=0; i<10; i++) {
        netId = wifiManager.addNetwork(conf);
        if (netId != -1) {
            Log.d("CAT", "Added network configuration to WifiManager");
            break;
        } else if (i==9) {
            Log.e("CAT", "Error adding network configuration!");
            return "NETCONFIGERROR";
        }
    }
} else {
    Log.d("CAT", "Hosted network has existing profile");
    if (netId == -1) {
        Log.e("CAT", "Existing profile is invalid!");
        return "NETCONFIGERROR2";
    }
}
for (int i=0; i<10; i++) {
    if (wifiManager.setWifiEnabled(true)) {
        Log.d("CAT", "Successfully enabled WiFi");
        break;
    } else if (i==9) {
        Log.e("CAT","Could not enable WiFi!");
        return "WIFIERROR";
    }
}
for (int i=0; i<10; i++) {
    if (wifiManager.disconnect()) {
        Log.d("CAT", "Successfully disconnected from existing networks");
        break;
    } else if (i==9) {
        Log.e("CAT", "Could not disconnect from current WiFi!");
        return "DISCONNECTERROR";
    }
}
boolean enabled = wifiManager.enableNetwork(netId, true);;
for (int i=0; i<10; i++) {
    if (enabled = true) {
        Log.d("CAT", "Network Enabled");
        break;
    }
    enabled = wifiManager.enableNetwork(netId, true);
}
if (!enabled) {
    Log.e("CAT","Could not enable network!");
    return "ENABLEERROR";
}
int j = 0;
while (wifiManager.reconnect() == false) {
    j++;
    if (j>10) {
        Log.e("CAT","Could not reconnect network!");
        return "RECONNECTERROR";
    }
}

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
long startTime = System.currentTimeMillis();
while (networkInfo == null || (networkInfo.isConnected()==false) || networkInfo.getType() != ConnectivityManager.TYPE_WIFI ) {
    networkInfo = connectivityManager.getActiveNetworkInfo();
    if ((System.currentTimeMillis() - startTime) > (30 * 1000)) {
        Log.e("CAT","Error confirming network connection!");
        return "DETECTCONNECTERROR";
    }
            try {
        Thread.sleep(200);
    } catch (InterruptedException e) {
        Log.d("CAT", e.getLocalizedMessage());
        Thread.currentThread().interrupt();
    }
}
// Now would come creating the socket and all that.

我还删除了其他一些睡眠,以尝试管理代码的丑陋性,但是我敢肯定,这不是问题所在。 另外,这是通过AsyncTask在后台运行的。 我认为涵盖所有内容,我们将不胜感激!

所以看起来我的问题一直存在

conf.status = WifiConfiguration.Status.ENABLED;

完全省略之后,我的代码似乎没有问题。 我认为此值不是要手动设置的,但我并不肯定。 对于遇到类似问题的任何人,我发现如果发生错误,则打印conf.toString()非常有用; 在WifiConfiguration的源代码中,有一个漂亮的公共int,称为disableReason ,我无法访问,但是当您使用toString()时,除非您当前已连接到网络,否则它将包含在内。 来源是这样的:

if (this.status == WifiConfiguration.Status.CURRENT) {
    sbuf.append("* ");
} else if (this.status == WifiConfiguration.Status.DISABLED) {
    sbuf.append("- DSBLE: ").append(this.disableReason).append(" ");
}

这实际上是打印的第一行,并提供了许多其他有用的信息。 如果您首先手动连接到网络(使用android创建网络配置文件),然后使用toString()获取配置的所有详细信息,这也将很有帮助; 这样一来,您可以确认自己在WifiConfiguration中的操作是否正确。

希望对您有所帮助,请发表任何评论/更正!

编辑:我意识到这可能还不清楚。 如果您有WifiConfiguration对象,例如,在我的情况下为WifiConfiguration conf ,则只需使用conf.toString()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM