If WiFi is lost raspbian doesn't seem to currently reconnect if an access point is available again.  You need to setup a script to check it and cause it to be reset if it has dropped out.  See here.

C Code To Check Connection Status & Trigger Reconnect Of Dropped WiFi Interface


	
#define TCPIP_INTERFACE_RESET_SECONDS_TIME		(5 * 60)		//If interface is not connected for # seconds cause a reset of the interface to ensure it will reconnect to new connections
#define TCPIP_INTERFACE_CHECK_SECONDS_TIME		15				//Check the conencterion every # seconds (so we can flag to our applicaiton if it is connected or not)

int wlan0_is_connected = 0;
int wlan0_connection_check_state_1sec_timer = 3;			//Initial check delay after startup
int wlan0_connection_do_reset_1sec_timer = TCPIP_INTERFACE_RESET_SECONDS_TIME;

	//##### ADD TO 1 SECOND HEARTBEAT #####
	if (wlan0_connection_check_state_1sec_timer)
		wlan0_connection_check_state_1sec_timer--;

	if (wlan0_connection_do_reset_1sec_timer)
		wlan0_connection_do_reset_1sec_timer--;
	
	
	//----------------------------------
	//----------------------------------
	//----- CHECK WLAN0 CONNECTION -----
	//----------------------------------
	//----------------------------------
	if (wlan0_connection_check_state_1sec_timer == 0)
	{
		//--------------------------------------
		//----- CHECK THE CONNECTION STATE -----
		//--------------------------------------
		wlan0_connection_check_state_1sec_timer = TCPIP_INTERFACE_CHECK_SECONDS_TIME;

		CommandResult = do_console_command_get_result((char*)"cat /sys/class/net/wlan0/operstate");
		if (CommandResult.find("up") == 0)		//If first character is '1' then interface is connected (command returns: '1', '0' or a 'not found' error message)
		{
			if (!wlan0_is_connected)
				std::cout << "wlan0 is now connected" << std::endl;
			
			wlan0_is_connected = 1;
			wlan0_connection_do_reset_1sec_timer = TCPIP_INTERFACE_RESET_SECONDS_TIME;		//We don't want to reset the connection while it is connected
		}
		else
		{
			if (wlan0_is_connected)
			{
				std::cout << "wlan0 is no longer connected" << std::endl;
				wlan0_connection_do_reset_1sec_timer = 20;									//<Do a reset quite quickly after a good connection is lost
			}
			wlan0_is_connected = 0;
		}
	}
	
	if (wlan0_connection_do_reset_1sec_timer == 0)
	{
		//------------------------------------------
		//----- NOT CONNECTED - RESET INTERACE -----
		//------------------------------------------
		wlan0_connection_do_reset_1sec_timer = TCPIP_INTERFACE_RESET_SECONDS_TIME;
		wlan0_connection_check_state_1sec_timer = TCPIP_INTERFACE_CHECK_SECONDS_TIME;
		
		std::cout << "Resetting wlan0 interface (currently not connected, ensure it will re-connect when possible)" << std::endl;
		system("sudo ifdown wlan0 &");			//'&' means do in background
		system("sudo ifup wlan0 &");			//'&' means do in background
		std::cout << "Reset wlan0 was started" << std::endl;

		//The wlan0 will now pick up a new connection when next able to (it tries, then sleeps, but keeps checking for a known WiFi access point).
		//We do this reset every now and then just to be sure it the interface is always trying
	}

 


string do_console_command_get_result (char* command)
{
	FILE* pipe = popen(command, "r");
	if (!pipe)
		return "ERROR";
	
	char buffer[128];
	string result = "";
	while(!feof(pipe))
	{
		if(fgets(buffer, 128, pipe) != NULL)
			result += buffer;
	}
	pclose(pipe);
	return(result);
}

 

USEFUL?
We benefit hugely from resources on the web so we decided we should try and give back some of our knowledge and resources to the community by opening up many of our company’s internal notes and libraries through mini sites like this. We hope you find the site helpful.
Please feel free to comment if you can add help to this page or point out issues and solutions you have found, but please note that we do not provide support on this site. If you need help with a problem please use one of the many online forums.

Comments

Your email address will not be published. Required fields are marked *