Wifi连接隐藏SSID及wifi主要广播的处理

本文探讨了如何处理隐藏SSID的WiFi连接问题,强调在断开网络时使用WifiManager#disableNetwork而不是disconnect。同时,解释了即使密码错误,connect()方法也会回调onSuccess,因为Open System Authentication允许任何认证。此外,文章指出disableNetwork()断开网络后,连接失败不会自动重连,并提供了连接不同加密类型WiFi的配置方法。最后,讨论了如何在连接失败后重新连接之前断开的网络,并涉及wpa_supplicant配置文件和网络优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

private void confirmToJoin(WifiConfiguration config, WifiManager.ActionListener saveListener,
                               WifiManager.ActionListener connectListener){
        backupId =mWifiManager.getConnectionInfo().getNetworkId();
        mDisableNetWorkId = backupId;
        if(backupId != -1){
            mWifiManager.disableNetwork(backupId);
        }

        if(config.preSharedKey != null){
            Log.e(TAG, "security: PSK  " + "ssid: " + config.SSID +"  config.preSharedKey: " + config.preSharedKey);
        }else if(config.wepKeys[0] != null){
            Log.e(TAG, "security: WEP" + "ssid: " + config.SSID +"  config.wepKeys[0]: " + config.wepKeys[0]);
        }else {
            Log.e(TAG, "security: NONE" + "ssid: " + config.SSID );
        }

        Utils.getInstance().removeWifi(mWifiManager, config.SSID.replace("\"", ""));
        mWifiManager.save(config, saveListener);
        mWifiManager.connect(config, connectListener);
        mAccessPointSecurity = -1;
        handler.sendEmptyMessage(2);
    }

如果当前有已连接的网络,必须先断开,不能使用disconnect(),而要使用WifiManager#disableNetwork(networkId);
否则会自动重连回原来的网络。

使用enableNetwork()的方式去连接隐藏SSID无法成功,即使第二个参数disableOther为true;关于connect(config,connectListener)这个方法中的connectListener是在什么情况下回调onSuccesss的,
不得而知,无论密码是否正确,是否有这个ap,都会回调onSuccess()。估计是代表认证成功吧,因为如果使用WPA/WPA2的话,使用的认证方式是Open System Authentication,这种验证其实等同于没有验证,因为无论谁来验证都会被通过。所以即使密码错误也会回调onSuccess()。

调用disableNetwork()断开网络时,会触发一次CONNECTED的广播。感觉这是个系统bug。

使用disableNetwork()断开网络后,然后去连接另一个网络,如果连接失败后,不会重连会被disable的网络,这个方法
中有关于该特性的注释。

连接隐藏SSID时,在构造这个WifiConfiguration时也是需要小心谨慎,有点不对都会连接失败。
以下是连接NONE,WEP,PSK三种加密方式的WifiConfiguration构造:

private WifiConfiguration createAddNetworkConfig(){
        WifiConfiguration config = new WifiConfiguration();
        config.SSID = AccessPoint.convertToQuotedString(
                mAddNetworkSsidEt.getText().toString());
        config.hiddenSSID = true;
        
        switch (mAccessPointSecurity) {
            case AccessPoint.SECURITY_NONE:
                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                break;

            case AccessPoint.SECURITY_WEP:
                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
                config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
                if (mAddNetworkPasswordEt.length() != 0) {
                    int length = mAddNetworkPasswordEt.length(
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值