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