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