我有一个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了