This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC3235S: 设置的5Gwifi信道不生效

Part Number: CC3235S

我有一个wifi信号(ssid:NETGEAR47_5G,信道:52)

我将国家码设置成RS,并开启如下信道(36,40,44,48,52,56,60,64),可以正常连接上wifi。

此时我再将国家码设置为CN,并将信道设置为(36,40,44,48,149,153,157,161,165),断开wifi并重新连接,还是会连接上信道为52的wifi。

此时我用以下代码读取的已开启wifi信道参数为0x1f0000f,按道理说并不会连接上52信道的wifi。

并且在此之后,我再将国家码设置为ZA,并开启(36,40,44,48,100,104,108,112,116,120,124,128,132,136,140)信道,还是能连上52信道的wifi。

_u16 Option = SL_WLAN_GENERAL_PARAM_OPT_SCAN_PARAMS_5G;
_u16 OptionLen = sizeof(SlWlanScanParam5GCommand_t);
sl_WlanGet(SL_WLAN_CFG_GENERAL_PARAM_ID, &Option, &OptionLen, (_u8 *)&cur_ScanParamConfig5G);

下面是我的部分代码,主要是test_wifi函数,在获取到ip地址后,会将test_wifi_flag设置为1,使test_wifi可以进入下一步

static int test_wifi_step = 0;
int test_wifi_flag = 1;

void enable_5g(_u8   Enabled5GStatus)// 0 disable 1 enable
{
	    _u16 Option = SL_WLAN_GENERAL_PARAM_OPT_ENABLE_5G;
	    _u16 OptionLen = sizeof(_u8);
	    sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, Option, OptionLen, (_u8 *)&Enabled5GStatus);

}
int set_wifi_country_code(_u8 *str)
{
	int32_t RetVal;
	
	_u8 configOpt = SL_DEVICE_GENERAL_PERSISTENT;
	_u16 plen=1;
	_u8 persistent = 0;

	unsigned char country_code[5];
	unsigned short config_len = 5;
	unsigned short configopt = SL_WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE;

	RetVal = sl_WlanGet(SL_WLAN_CFG_GENERAL_PARAM_ID, &configopt, &config_len, country_code);
	UART_PRINT("sl_WlanGet ret_val:%d config_len:%d country_code:%s\r\n", RetVal, config_len, country_code);
	if (RetVal < 0 || (strcmp((char *)str, (char *)country_code) != 0))
	{
		RetVal  = sl_DeviceGet(SL_DEVICE_GENERAL, &configOpt, &plen, (_u8*)(&persistent));
		if(RetVal < 0)
		{
		    UART_PRINT("sl_DeviceGet failed, RetVal = %d\n\r", RetVal);
		}

		if(persistent != 1)
		{
		    persistent = 1;
		    RetVal = sl_DeviceSet(SL_DEVICE_GENERAL, SL_DEVICE_GENERAL_PERSISTENT, 1, (_u8*)(&persistent));
			if(RetVal < 0)
			{
			     UART_PRINT("sl_DeviceSet failed, RetVal = %d\n\r", RetVal);
			}
		}
        //重点在于这一段,其他的是设置持久化的
        //在这里设置国家码
		RetVal = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE, 2, str);
		if (RetVal < 0)
		{
			UART_PRINT("sl_WlanSet country_code %s failed, RetVal = %d\n\r",str, RetVal);
		}
		else
		{
			UART_PRINT("sl_WlanSet country_code success, RetVal = %d, country code:%s\n\r", RetVal, str);
		}

		RetVal  = sl_DeviceGet(SL_DEVICE_GENERAL, &configOpt, &plen, (_u8*)(&persistent));
		if(RetVal < 0)
		{
		    UART_PRINT("sl_DeviceGet failed, RetVal = %d\n\r", RetVal);
		}

		if(persistent != 0)
		{
		    persistent = 0;
		    RetVal = sl_DeviceSet(SL_DEVICE_GENERAL, SL_DEVICE_GENERAL_PERSISTENT, 1, (_u8*)(&persistent));
			if(RetVal < 0)
			{
			     UART_PRINT("sl_DeviceSet failed, RetVal = %d\n\r", RetVal);
			}
		}
	}
	return 0;

}
void set_scan_param_5g(const char *contrycode)
{
        SlWlanScanParam5GCommand_t ScanParamConfig5G,cur_ScanParamConfig5G;
        _u16 Option = SL_WLAN_GENERAL_PARAM_OPT_SCAN_PARAMS_5G;
        _u16 OptionLen = sizeof(SlWlanScanParam5GCommand_t);
		int ret_val;
		
		_u8 configOpt = SL_DEVICE_GENERAL_PERSISTENT;
		_u16 plen=1;
		_u8 persistent = 0;

        // 5.0G channels bits order: 
        //
        // 0  1   2   3    4  5    6  7    8    9   10   11    12   13  14   15   16
        //36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132,
        //
        //17    18   19   20   21  22   23   24    25  26   27   28   29
        //136, 140, 144, 149, 153, 157, 161, 165, 169, 184, 188, 192, 196 

		if(strcmp(contrycode,"RS")==0)
		{
		    //enable: 36,40,44,48,52,56,60,64
		    ScanParamConfig5G.ChannelsMask = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);
		}else if(strcmp(contrycode,"ZA")==0)
		{
			//disable: 52,56,60,64
			ScanParamConfig5G.ChannelsMask = 0x0007ffff; //禁用140以上的信道,不包括140
			ScanParamConfig5G.ChannelsMask &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8));
		}else if(strcmp(contrycode,"NO")==0)
		{
			//enable: 36, 40, 44, 48
			ScanParamConfig5G.ChannelsMask = (1<<0)|(1<<1)|(1<<2)|(1<<3);
		}else if(strcmp(contrycode,"JP")==0)
		{
			//enable: 36,40,44,48,184,188,192,196
			ScanParamConfig5G.ChannelsMask = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<26)|(1<<27)|(1<<28)|(1<<29);
		}
		else if(strcmp(contrycode,"00")!=0)
		{
			//enable: 36, 40, 44, 48, 149, 153, 157, 161, 165
			ScanParamConfig5G.ChannelsMask = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24);
		}else
		{
			ScanParamConfig5G.ChannelsMask = 0xffffffff;
		}
		
        ScanParamConfig5G.RssiThreshold = -95;

        ret_val = sl_WlanGet(SL_WLAN_CFG_GENERAL_PARAM_ID, &Option, &OptionLen, (_u8 *)&cur_ScanParamConfig5G);
		if(ret_val < 0)
		{
			UART_PRINT("set_scan_param_5g error ret_val = %d\n\r", ret_val);
			return;
		}

		UART_PRINT("cur_ScanParamConfig5G.ChannelsMask = 0x%x, ScanParamConfig5G.ChannelsMask = 0x%x\n\r", cur_ScanParamConfig5G.ChannelsMask, ScanParamConfig5G.ChannelsMask);
		if(cur_ScanParamConfig5G.ChannelsMask != ScanParamConfig5G.ChannelsMask)
		{
			ret_val	= sl_DeviceGet(SL_DEVICE_GENERAL, &configOpt, &plen, (_u8*)(&persistent));
			if(ret_val < 0)
			{
				UART_PRINT("sl_DeviceGet failed, RetVal = %d\n\r", ret_val);
			}
			
			if(persistent != 1)
			{
				persistent = 1;
				ret_val = sl_DeviceSet(SL_DEVICE_GENERAL, SL_DEVICE_GENERAL_PERSISTENT, 1, (_u8*)(&persistent));
				if(ret_val < 0)
				{
					 UART_PRINT("sl_DeviceSet failed, RetVal = %d\n\r", ret_val);
				}
			}
			//重点在于这一段,其他的是设置持久化的
            //在这里设置wifi的扫描信道
	        ret_val = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, Option, OptionLen, (_u8 *)&ScanParamConfig5G);
			if(ret_val < 0)
			{
				UART_PRINT("set_scan_param_5g error ret_val = %d\n\r", ret_val);
			}
			
			ret_val  = sl_DeviceGet(SL_DEVICE_GENERAL, &configOpt, &plen, (_u8*)(&persistent));
			if(ret_val < 0)
			{
			    UART_PRINT("sl_DeviceGet failed, RetVal = %d\n\r", ret_val);
			}

			if(persistent != 0)
			{
			    persistent = 0;
			    ret_val = sl_DeviceSet(SL_DEVICE_GENERAL, SL_DEVICE_GENERAL_PERSISTENT, 1, (_u8*)(&persistent));
				if(ret_val < 0)
				{
				     UART_PRINT("sl_DeviceSet failed, RetVal = %d\n\r", ret_val);
				}
			}
			UART_PRINT("change ChannelsMask success\n\r");
		}
}
int test_wifi()
{
    SlWlanSecParams_t secParams;
	int32_t RetVal;
	_u8 *str;

    unsigned char policy_val = 0;
	unsigned char connect_policy = 0;
	unsigned char connect_policy_len = 1;
	
	static char key[_KEY_LEN_SIZE_];

    char code_1[] = "RS",code_2[] = "CN";
    char ssid[] = "NETGEAR47-5G";
    char passwd[] = "wideteapot110";

	enable_5g(1);

    for(;;){
        check_watchdog();
        
    	if (test_wifi_flag)
    	{
    	    UART_PRINT("[test_wifi] flag = %d,step = %d\r\n",test_wifi_flag,test_wifi_step);
    	    test_wifi_flag = 0;
            if(test_wifi_step == 0){
                str = (_u8 *)code_1;    //第一次设置国家码为RS
                test_wifi_step = 1;
            }else if(test_wifi_step == 1){
                str = (_u8 *)code_2;    //第一次设置国家码为CN
                test_wifi_step = 2;
            }else{
                continue;
            }
            UART_PRINT("[test_wifi] config country code\r\n");
        	if(str[0])
        	{
        		set_wifi_country_code((_u8*)str);   //设置国家码
        		set_scan_param_5g((char*)str);  //设置5Gwifi的扫描信道
            }
            UART_PRINT("[test_wifi] end config country code\r\n");
    		RetVal = sl_WlanProfileDel(SL_WLAN_DEL_ALL_PROFILES);   //删除所有保存过的wifi信号
    		if (RetVal < 0)
    		{
    			UART_PRINT("profiledel failed\n\r");
    		}

			memset(key, 0, _KEY_LEN_SIZE_);
			strncpy(key, passwd, _KEY_MAX_LEN_);
			
            //添加wifi连接
			memset(&secParams, 0, sizeof(SlWlanSecParams_t));
			secParams.Key = (signed char *)key;
			secParams.KeyLen = strlen((char const *)key);
			secParams.Type = SL_WLAN_SEC_TYPE_WPA_WPA2;
			RetVal = sl_WlanProfileAdd((signed char const *)ssid,
									   strlen((char *)ssid), 0, &secParams, 0, 1, 0);
			if (RetVal < 0)
			{
				UART_PRINT("sl_WlanProfileAdd(SL_SEC_TYPE_WPA_WPA2) failed,error code=%d\n\r", RetVal);
			}

            UART_PRINT("[test_wifi] disconnect wifi\r\n");
            //先关闭wifi自动连接、断开wifi
            sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(0, 0, 0, 0),NULL,0); 
            sl_WlanDisconnect();
            for(int i=0;i<5;i++){
                msleep(500);
            }
            sl_Stop(0);
            sl_Start(NULL,NULL,NULL);
            //设置wifi自动连接
            sl_WlanPolicyGet(SL_WLAN_POLICY_CONNECTION,  &connect_policy,NULL, &connect_policy_len);
            UART_PRINT("[test_wifi] get policy:%d\r\n",connect_policy);
            if ((RetVal < 0) || (connect_policy != SL_WLAN_CONNECTION_POLICY(1, 0, 0, 0)))
            {
                UART_PRINT("[test_wifi] set auto connect\r\n");
                    /**/
                connect_policy = SL_WLAN_CONNECTION_POLICY(1, 0, 0, 0);
                if (sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, connect_policy, &policy_val, 1) < 0)
                {
                    UART_PRINT("sl_WlanPolicySet failed\n\r");
                }
            }
            UART_PRINT("[test_wifi] end config\r\n");
        }
    	
    }
	return 0;
}

看着像是曾经开启过的wifi信道会一直开启,但实际上并不是,因为我先将国家码以及信道设置为CN,此时可以连接上149信道的wifi;但我断开wifi并将国家码设置为JP,就连不上149信道的wifi了