#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#define IF_NAME "wlan0"
#define rcvBufSize 50
#define PING_CMD "/bin/ping -c 1 -W 1 %s > %s"
#define TMP_PING_PATH "/tmp/pingInternet"
#define RECV1ICMPPKT "1 packets received"
#define TMP_WIFI_STA_PATH "/tmp/wifistatus"
char Gateway_Ip[32] = {0};
char wifi_sta_conn_wr_protect = 0;
char wifi_sta_disconn_wr_protect = 0;
/*
get_local_ip:获取本地IP
ifname:WiFi名
IP:IP地址
*/
int get_local_ip(char * ifname, char * ip)
{
char rcvBuf[rcvBufSize] = {0};
char *temp = NULL;
int inet_sock;
struct ifreq ifr;
inet_sock = socket (AF_INET, SOCK_DGRAM, 0);
memset(ifr.ifr_name, 0, sizeof(ifr.ifr_name));
memcpy(ifr.ifr_name, ifname, strlen(ifname));
if(0 != ioctl(inet_sock, SIOCGIFADDR, &ifr))
{
printf("ioctl error\r\n");
return -1;
}
temp = inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr);
memcpy(ip, temp, strlen(temp));
close(inet_sock);
return 0;
}
void Local_Ip_Parsing(void)
{
char Local_Ip[32] = {0};
char *subString;
char *subStringNext;
char seg1[4] = {"0"},seg2[4] = {"0"},seg3[4] = {"0"},seg4[4] = {"0"};
get_local_ip(IF_NAME, Local_Ip);
if(0 != strcmp(Local_Ip, ""))
{
printf("%s ip is %s\n",IF_NAME, Local_Ip);
subString = Local_Ip;
for (char i = 0 ; i < 3 ; i++)
{
if ((subStringNext = strstr(subString, ".")) != NULL)
{
switch(i)
{
case 0:memcpy(seg1, subString, subStringNext - subString);break;
case 1:memcpy(seg2, subString, subStringNext - subString);break;
case 2:memcpy(seg3, subString, subStringNext - subString);break;
}
subString = subStringNext;
}
subString++;
}
snprintf(Gateway_Ip, sizeof(Gateway_Ip), "%s.%s.%s.1",seg1,seg2,seg3);
printf("Gateway_Ip is %s\n", Gateway_Ip);
}
}
/*
ping网关测试
连接成功返回0;连接失败返回-1
*/
static int check_internet_ping(char * gateway_addr)
{
char pingCMD[128]={0};
char tmpBuf[256]={0};
FILE *pfile = NULL;
FILE *pfile_wifista = NULL;
snprintf(pingCMD, sizeof(pingCMD), PING_CMD, gateway_addr, TMP_PING_PATH); /*ping GLOBAL gateway*/
///printf("pingCMD=%s!\n", pingCMD);
system(pingCMD);
if((pfile = fopen(TMP_PING_PATH, "rb")) != NULL)
{
fread(tmpBuf, sizeof(tmpBuf), 1, pfile);
fclose(pfile);
}
else
{
printf("open ping file error!\n");
}
if(strstr(tmpBuf, RECV1ICMPPKT))
{
/*ping success connect*/
printf("connect!\n");
if(!wifi_sta_conn_wr_protect)
{
if((pfile_wifista = fopen(TMP_WIFI_STA_PATH, "wb")) != NULL)
{
fwrite((char *)"1", 1, 1, pfile_wifista);
fclose(pfile_wifista);
wifi_sta_disconn_wr_protect = 0;
wifi_sta_conn_wr_protect =1;
printf("write 1 !\n");
}
}
return 0;
}
else
{
/*ping fail disconnect*/
printf("disconnect !\n");
if(!wifi_sta_disconn_wr_protect)
{
if((pfile_wifista = fopen(TMP_WIFI_STA_PATH, "wb")) != NULL)
{
fwrite((char *)"0", 1, 1, pfile_wifista);
fclose(pfile_wifista);
wifi_sta_conn_wr_protect = 0;
wifi_sta_disconn_wr_protect =1;
printf("write 0 !\n");
}
}
return -1;
}
}
int main(void)
{
Local_Ip_Parsing();//初始化的时候调用一次即可
while(1)
{
check_internet_ping(Gateway_Ip);
sleep(1);
}
return 0;
}