如何连接一个隐藏的wifi?
前言某些情况下我们并不希望自己的wifi被其他人扫描到选择将wifi网络隐藏起来本文将从应用开发角度说明APP应该如何连接这些被隐藏起来的wifi开发实例话不多说直接上代码private void init() { mWifiManager (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); mConnectivityManager (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); mWifiHandler new WifiHandler(); // 自定义的WifiHandler用于处理超时和重连可以自行实现 } public void connect2AccessPoint(String password, String ssid) { try { // 如果没开启wifi先将wifi打开 if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); delay(3 * 1000); // 预留点时间确保wifi已经被打开了 } Log.d(TAG, connect2AccessPoint!!! ); // 可选只是调试日志 // 设置连接超时的时间这里设置15秒有需要的可以自己调整 mWifiHandler.sendEmptyMessageDelayed(MSG_CONNECT_WIFI_TIMEOUT, 15 * 1000); WifiConfiguration config new WifiConfiguration(); // 连接WIFI需要的配置 // 设置 SSID需要用引号括起来 config.SSID \ ssid \; // 连接隐藏wifi的关键必须设置成true指明它是隐藏网络 config.hiddenSSID true; config.allowedKeyManagement.clear(); config.allowedAuthAlgorithms.clear(); // 设置安全策略这里选用较为常用的WPA_PSK策略 config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); // config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); // 可选 // 配置网络密码需要用引号括起来 config.preSharedKey \ password \; // config.status WifiConfiguration.Status.ENABLED; // 可选设置其他策略例如指定为家庭网络 int netId mWifiManager.addNetwork(config); // 网络ID当为-1时代表网络添加失败了有可能是权限不足引起的 mWifiManager.enableNetwork(netId, true); // 启用该网络配置 mWifiManager.saveConfiguration(); // 保存并连接至该网络 // 或者使用下面的方式进行连接 // boolean reconnected mWifiManager.reconnect(); } catch (Exception e) { e.printStackTrace(); } }如果安全策略为EAP企业级网络则需要更多的配置常见的EAP 类型有PEAP、TLS、TTLS、PWD、SIM等。这里以PEAP/MSCHAPv2 为例以上述逻辑为基础增加如下配置config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); // 配置 WifiEnterpriseConfig WifiEnterpriseConfig enterpriseConfig new WifiEnterpriseConfig(); // 设置 EAP 方法此处设置的是PEAP enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PEAP); // 设置阶段2认证此处设置的是MSCHAPV2 enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2); // 设置身份用户名和密码 enterpriseConfig.setIdentity(username); enterpriseConfig.setPassword(password); // 可选设置匿名身份如果服务器要求 // enterpriseConfig.setAnonymousIdentity(anonymous); // 证书验证配置重要根据服务器要求选择 // 使用证书验证需要将CA证书.crt或.der格式放在raw资源目录 InputStream is context.getResources().openRawResource(R.raw.my_ca_cert); CertificateFactory cf CertificateFactory.getInstance(X.509); X509Certificate caCert (X509Certificate) cf.generateCertificate(is); enterpriseConfig.setCaCertificate(caCert); // 如果不验证服务器证书不安全仅用于测试或内部网络 // enterpriseConfig.setCaCertificate(null); // 不指定CA证书 // enterpriseConfig.setCaPath(null); // enterpriseConfig.setDomainSuffixMatch(null); // enterpriseConfig.setCaCertificateAliases(null); // 将企业配置赋值给 WifiConfiguration config.enterpriseConfig enterpriseConfig;不同 EAP 类型的配置要点EAP 类型设置方法阶段2认证必需参数证书要求PEAPEap.PEAPMSCHAPV2,GTC身份、密码通常需要CA证书验证服务器TLSEap.TLS无客户端证书、私钥必须提供客户端证书和私钥TTLSEap.TTLSPAP,MSCHAP,MSCHAPV2,GTC身份、密码通常需要CA证书PWDEap.PWD无身份、密码无证书SIMEap.SIM无SIM卡无使用SIM卡AKAEap.AKA无SIM卡无使用SIM卡企业网络连接问题通常较难排查。可以通过以下方式获取更多信息// 获取连接状态 WifiInfo wifiInfo wifiManager.getConnectionInfo(); SupplicantState state wifiInfo.getSupplicantState();通常情况下需要的权限如下uses-permission android:nameandroid.permission.CHANGE_WIFI_STATE / uses-permission android:nameandroid.permission.CHANGE_NETWORK / uses-permission android:nameandroid.permission.WIFI_SETTINGS / uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE /wifi连接的操作是异步的最终结果需要通过监听网络状态变化如 ConnectivityManager.CONNECTIVITY_ACTION或来确认是否成功。private void registerMyReceiver() { IntentFilter netFilter new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(netReceiver, netFilter); } private BroadcastReceiver netReceiver new BroadcastReceiver() { Override public void onReceive(Context context, Intent intent) { boolean isConnected isNetworkConnected(); } }; private boolean isNetworkConnected() { ConnectivityManager connMan (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo connMan.getActiveNetworkInfo(); if (netInfo null) { if (DEBUG) Log.d(TAG, NetworkInfo is null; network is not connected); return false; } WifiInfo currentConnection mWifiManager.getConnectionInfo(); if (currentConnection ! null currentConnection.getIpAddress() ! 0) { if (currentConnection ! null currentConnection.getSSID().equals(mWifiConfiguration.SSID)) { return true; } } else { Log.d(TAG, Network is not connected); } return false; }注册的监听器在应用销毁的时候要记得取消注册unregisterReceiver(netReceiver);
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433469.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!