[openwrt] 如何sync同步wifi的channel值

说明:

路由器设备(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( &current_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值