说明:
路由器设备(MIFI)在通过STA模式(类似于wifi桥接,信号放大器),MIFI里面有一个5G,一个2.4G。2.4G下连,5G用于上连到别的wifi。
原因:
无线路由器channel与相近其他无线信号频段相同(或十分接近接近)会互相干扰,导致wifi使用异常。
保证channel不相同。
做法:
起一个线程,每隔一段时间,去check一下,去检测channel是否接近。
void start_sync_channel_thread(void) // 创建线程
task_sync_wifi_channel_thread(void) //真正sync channel的
stop_sync_channel_thread(void) //销毁进程
设置channel
#ifdef SYNC_WIFI_CHANNEL
#define IP_SIZE 64
int get_interface_ip(const char *eth_inf, char *ip)
{
int sd;
struct sockaddr_in sin;
struct ifreq ifr;
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sd)
{
printf("socket error: %s\n", strerror(errno));
return -1;
}
strncpy(ifr.ifr_name, eth_inf, IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0;
if (ioctl(sd, SIOCGIFADDR, &ifr) < 0)
{
printf("ioctl error: %s\n", strerror(errno));
close(sd);
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
snprintf(ip, IP_SIZE, "%s", inet_ntoa(sin.sin_addr));
close(sd);
return 0;
}
pthread_t sync_channel_thread;
pthread_attr_t sync_channel_attr;
void* task_sync_wifi_channel_thread()
{
char cmd[128] = {0};
char sta_ssid[128] = {0};
char out_buf[512] = {0};
char tempstr[256]={0};
char lan_wifi_channel[32]={0};
char wan_wifi_channel[32]={0};
char current_mode[BUF_SIZE_128] = {0};
char *p=NULL;
int i=0;
int lan_channel=0;
int wan_channel=0;
int range_channel=0;
PCONFAPP pApp = GetConfAppPointer();
char ip[IP_SIZE] = {0};
while(1)
{
sleep(60*10);//10 minutes
memset( &cmd, 0x0, sizeof(cmd));
memset( &sta_ssid, 0x0, sizeof(sta_ssid));
memset( &out_buf, 0x0, sizeof(out_buf));
memset( ¤t_mode, 0x0, sizeof(current_mode));
memset( &ip,0,sizeof(ip));
lan_channel=0;
wan_channel=0;
// my_printf(LOG_MODE_LEVEL_3, " %s(%d) sleep i:%d \n",__FUNCTION__,__LINE__,i++);
GetNVRamData("/etc/config/CusCMCfg.Mode.APMode",current_mode,BUF_SIZE_128);
if(openUtil_strcasecmp(current_mode,"sta") == 0)
{
get_interface_ip("wlan0",ip);// get wlan0 ip
}
if( (openUtil_strcasecmp(current_mode,"sta") == 0) && (ip[0] != '\0')) //wifi, should judge ip address
{
//get STA WIFI channel(wan side)
GetNVRamData("/etc/config/CusCMCfg.local_param.ssid",sta_ssid,BUF_SIZE_128);// if sta ssid
snprintf(cmd, sizeof(cmd), "iwlist wlan0 scan | grep -w -A 5 \"%s\" | grep \"Frequency\" ", sta_ssid);//iwlist wlan0 scan | grep -w -A 5 "HUAWEI-BEVAQ8"
get_system_output(cmd, out_buf, sizeof(out_buf));
my_printf(LOG_MODE_LEVEL_5, " %s(%d)cmd:%s out_buf:%s\n",__FUNCTION__,__LINE__, cmd, out_buf);
if( (p=openUtil_strstr(out_buf, "Frequency:")) != NULL)
{
sscanf(p,"%*[^l]l %[^)]\n",wan_wifi_channel);
my_printf(LOG_MODE_LEVEL_3, " %s(%d) STA channel:%s \n",__FUNCTION__,__LINE__,wan_wifi_channel);
}
//get LAN WIFI channel(lan side)
memset( &out_buf, 0x0, sizeof(out_buf));
get_system_output("iwconfig ra0|grep \"Channel\"", out_buf, sizeof(out_buf));
my_printf(LOG_MODE_LEVEL_5, "%s(%d) out_buf:%s\n",__FUNCTION__,__LINE__, out_buf);
if( (p=openUtil_strstr(out_buf, "Mode:")) != NULL)
{
sscanf(p,"%*[^=]=%[^A]\n",lan_wifi_channel);
my_printf(LOG_MODE_LEVEL_3, "%s(%d)LAN WIFI channel:%s \n",__FUNCTION__,__LINE__,lan_wifi_channel);
}
//If range <=5 , set LAN WIFI channel's value = WAN WIFI channel+5
lan_channel = atoi(lan_wifi_channel);
wan_channel = atoi(wan_wifi_channel);
range_channel = lan_channel > wan_channel ? lan_channel - wan_channel : wan_channel - lan_channel;
my_printf(LOG_MODE_LEVEL_3, "%s(%d) lan_channel:%d wan_channel:%d range_channel:%d\n",__FUNCTION__,__LINE__,lan_channel, wan_channel,range_channel);
if(range_channel <= 5)
{
if (wan_channel >=lan_channel)
{
if((wan_channel+5) > MAX_CHANNEL)
{
wan_channel = (wan_channel+5)-MAX_CHANNEL;// wan channel > lan channel should set range to 5
}
else
{
wan_channel = (wan_channel+5);
}
}
else if (wan_channel <=lan_channel)
{
if((lan_channel+5) > MAX_CHANNEL)
{
wan_channel = (lan_channel+5)-MAX_CHANNEL;//should set range to 5
}
else
{
wan_channel = (lan_channel+5);
}
}
snprintf(cmd, sizeof(cmd), "iwpriv ra0 set Channel=%d", wan_channel);
my_printf(LOG_MODE_LEVEL_3, "%s(%d)cmd:%s\n",__FUNCTION__,__LINE__, cmd);
pthread_mutex_lock(&pApp->confmutex);
system(cmd);
pthread_mutex_unlock(&pApp->confmutex);
}
}
}
return NULL;
}
void start_sync_channel_thread(void)
{
my_printf(LOG_MODE_LEVEL_3, " %s(%d) start_sync_channel_thread\n",__FUNCTION__,__LINE__);
int sync_channel_thread_ret;
pthread_attr_init(&sync_channel_attr);
pthread_attr_setdetachstate(&sync_channel_attr, PTHREAD_CREATE_DETACHED);
sync_channel_thread_ret = pthread_create(&sync_channel_thread, &sync_channel_attr, task_sync_wifi_channel_thread, NULL);
if (sync_channel_thread_ret != 0)
{
my_printf(LOG_MODE_LEVEL_1, " %s(%d) task_sync_wifi_channel_thread pthread_create error!!\n",__FUNCTION__,__LINE__);
}
}
void stop_sync_channel_thread(void)
{
pthread_attr_destroy(&sync_channel_attr);
}
#endif