⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vxworks-ppp.c

📁 完成的PPP协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
	for(i=0;i<50;i++)
	{
	ppp_if[0]->ipcp_wantoptions.ouraddr=0;
	ppp_if[0]->ipcp_gotoptions.ouraddr=0;
	taskDelay(10);
	}

}


int find(int b)
{
	int i;
	int j;
	char *temp;
	j=0;
	b=(int)ppp_if[0];
	temp=(char *)b;
	for(i=b;i<b+5916;i++)
	{
		if(temp[0]==88 && temp[1]==88 && temp[2]==88 && temp[3]==88)
		{
			printf("%08x\n\r",i);
			temp[0]=0;
			temp[1]=0;
			temp[2]=0;
			temp[3]=0;
		}
		temp++;	
	}
	return -1;
	
	
}


STATUS pppConnect(void)					
{
	unsigned char atCmdSendString[50];
	unsigned char atCmdRecvString[100];
	unsigned int  waitTime=0;
	int readBytes=0;
	unsigned char addressInc=0;
	unsigned char EnableCheck=1;
	unsigned char i;
	BOOL haveData=FALSE;
	struct in_addr iaddr;



	controlLed(1,0);
	taskDelay(1000);
	controlLed(1,1);
	taskDelay(sysClkRateGet()*20);
	memset(atCmdSendString,0,50);
	memset(atCmdRecvString,0,100);
	memset(remoteIpAddress,0,20);
	memset(localIpAddress,0,20);
	GPRS_Init();
	atCmdSend((unsigned char *)"ATZ",(unsigned char *)atCmdRecvString);
	printf("**%s\n",atCmdRecvString);
	atCmdSend((unsigned char *)"ATE0",atCmdRecvString);
	printf("**%s\n",atCmdRecvString);
/*	atCmdSend("ATV0",atCmdRecvString);*/
	printf("**%s\n",atCmdRecvString);
	strcpy((char *)atCmdSendString,"ATD ");
	strcat((char *)atCmdSendString,ISPnumber);
	if(atCmdSend(atCmdSendString,atCmdRecvString)==ERROR||
			strstr((char *)atCmdRecvString,"CONNECT")==NULL)
	{
		printf("%s",atCmdRecvString);
		return ERROR;
	}
	ioctl(fdModem,FIOFLUSH,0);
/*	write(fdModem,"CLIENT",6);
	taskDelay(60);
	write(fdModem,"CLIENT",6);
	printf("Connect %s successful!!!\n",ISPnumber);
	taskDelay(60);
*/
	memset(atCmdRecvString,0,50);

	taskDelay(20);
//	close(fdModem);
	pppInit(pppUnit,NetCom,"88.88.88.88",NULL,19200,&ippp_options,NULL);
	sp((FUNCPTR)pppttt,0,0,0,0,0,0,0,0,0);
//	find(0);
//	pppttt();

//	sp((FUNCPTR)ppp_task,pppUnit,(int)NetCom,(int)"0.0.0.0",(int)"0.0.0.0",38400,(int)&ippp_options,NULL,0,0);


	for(waitTime=0;waitTime<150;waitTime++)
	{
		taskDelay(10);
		if(pppInfoGet(pppUnit,&ippp_info)==ERROR) return ERROR;
		else
		{
			if(ippp_info.ipcp_fsm.state==OPENED) break;
		}	
		 	
	}
	taskDelay(100);
	if(waitTime==300) return ERROR;	
	iaddr.s_addr =ippp_info.ipcp_hisoptions.hisaddr;
	inet_ntoa_b(iaddr,(char *)remoteIpAddress);
	iaddr.s_addr =ippp_info.ipcp_gotoptions.ouraddr;
	inet_ntoa_b(iaddr,(char *)localIpAddress);
	printf("The remote host ip address is:%s\n",remoteIpAddress);
	printf("The locate host ip address is:%s\n",localIpAddress);

	if(mRouteAdd("0.0.0.0",(char *)localIpAddress,0,0,0)==ERROR)
		printf("Add 0.0.0.0 route failture!\n");

	mRouteAdd((char *)localIpAddress,"127.0.0.1",0xffffffff,0,0);
/*	mRouteAdd("211.83.109.195",localIpAddress,0xffffffff,0,0);*/


	pppHookAdd(pppUnit,(FUNCPTR)pppRetry,PPP_HOOK_DISCONNECT);	
	return OK;
}


extern PPP_TASK_VARS *ppp_if[];

void plk(void)
{

printf("ppp_if   0x%x  l=%d\n",ppp_if[0],sizeof(PPP_TASK_VARS));
printf("usename:%s   password:%s  \r\n",ppp_if[0]->user,ppp_if[0]->passwd);


}





























STATUS pppVpdn()
{

	char buf[100];
	unsigned char atCmdRecvString[1000];
	int readBytes=0;
	unsigned char addressInc=0;
	unsigned char EnableCheck=1;
	unsigned char i;
	BOOL haveData=FALSE;

	unsigned int  waitTime=0;
	struct in_addr iaddr;
	unsigned char remoteIpAddress[20]; 

	/*char ISPnumber[100];		用户所拨电话号码*/
	/*char username[100];		验证的用户名*/
	/*char password[100];		验证的密码*/


	VPDN_Init();


/*	atCmdSend("AT",atCmdRecvString);
	printf("**%s\n",atCmdRecvString);
	atCmdSend("ATE0V0",atCmdRecvString);
	printf("**%s\n",atCmdRecvString);
*/

	write(fdModem,"+++",3);
	taskDelay(200);
	write(fdModem,"ath0\r\n",6);
	taskDelay(200);
	write(fdModem,"ATE0\r\n",6);
	taskDelay(50);
	write(fdModem,"at\r\n",4);
	taskDelay(50);
	write(fdModem,"at\r\n",4);
	taskDelay(50);
	write(fdModem,"at\r\n",4);
	taskDelay(50);
	strcpy(buf,"atdt");
	strcat(buf,ISPnumber);
	strcat(buf,"\r\n");
	printf("进行拨号连接:%s\n",buf);
	write(fdModem,buf,11);
	taskDelay(100);	
	ioctl(fdModem,FIOFLUSH,0);

	/*等待接收到数据CONNECT*/
	for(waitTime=0;waitTime<100*60;waitTime++)
	{
		ioctl(fdModem,FIONREAD,(int)&readBytes);
		if(readBytes>0) break;
		taskDelay(1);
	}
	if(readBytes<=0)
	{
		printf("atdt16300 没有收到任何数据\r\n");
		return ERROR;
	}
	taskDelay(50);
	readBytes=read(fdModem,(char *)(atCmdRecvString),100);
	printf("rec:%s\r\n",atCmdRecvString);
	if(strstr((char *)atCmdRecvString,"CONNECT")==0)
		return ERROR;

	/*等待询问用户名密码*/
	for(waitTime=0;waitTime<100*60;waitTime++)
	{
		taskDelay(1);
/*		if(waitTime%200==199)
			write(fdModem,"16300\r\n",7);*/

		ioctl(fdModem,FIONREAD,(int)&readBytes);
		if(readBytes>0)
		{
			readBytes=read(fdModem,(char *)(atCmdRecvString+addressInc),100);
			addressInc+=readBytes;
		}
		if(addressInc>0)
		{
			if(strstr((char *)atCmdRecvString,"user")!=0)
			{
				addressInc=0;
				strcpy(buf,username);
				strcat(buf,"\r\n");
				write(fdModem,buf,strlen(buf));
			}
			if(strstr((char *)atCmdRecvString,"pass")!=0)
			{
				addressInc=0;
				strcpy(buf,password);
				strcat(buf,"\r\n");
				write(fdModem,buf,strlen(buf));
				break;
			}
		}
	}
	if(waitTime>=100*60)
	{
		printf("没收到用户名和密码\n");
		return ERROR;
	}

	/*等待接收到PPP命令*/
	for(waitTime=0;waitTime<100*60;waitTime++)
	{
		taskDelay(1);
/*		if(waitTime%200==199)
			write(fdModem,"16300\r\n",7);
*/
		ioctl(fdModem,FIONREAD,(int)&readBytes);
		if(readBytes>0)
		{
			readBytes=read(fdModem,(char *)(atCmdRecvString),100);
			for(i=0;i<readBytes;i++)
			{
				if(atCmdRecvString[i]==0x7e) 
				{
					printf("It is connecting now!\n");
					break;
				}	
			}
			if(i<readBytes)
				break;	
		}
	}
	if(waitTime>=100*60)
	{
		printf("对方无PPP应答\n");
		return ERROR;
	}
/*	ioctl(fdModem,FIOFLUSH,0);*/
	close(fdModem);


	printf("pppInit now !!!\n");
//	pppInit(pppUnit,NetCom,NULL,NULL,38400,&ippp_options,NULL);

	for(waitTime=0;waitTime<100*90;waitTime++)
	{
		taskDelay(1);
		if(pppInfoGet(pppUnit,&ippp_info)==ERROR) return ERROR;
		else
		{
			if(ippp_info.ipcp_fsm.state==OPENED) break;
		}
		
	}
	taskDelay(100);
	if(waitTime==100*90) return ERROR;	
	iaddr.s_addr =ippp_info.ipcp_hisoptions.hisaddr;
	inet_ntoa_b(iaddr,(char *)remoteIpAddress);
	iaddr.s_addr =ippp_info.ipcp_gotoptions.ouraddr;
	inet_ntoa_b(iaddr,(char *)localIpAddress);
	printf("The remote host ip address is:%s\n",remoteIpAddress);
	printf("The locate host ip address is:%s\n",localIpAddress);

	if(mRouteAdd("0.0.0.0",(char *)localIpAddress,0,0,0)==ERROR)
		printf("Add 0.0.0.0 route failture!\n");

	mRouteAdd((char *)localIpAddress,"127.0.0.1",0xffffffff,0,0);


	pppHookAdd(pppUnit,(FUNCPTR)pppRetry,PPP_HOOK_DISCONNECT);	


	return OK;

}
void whReadppp()
{
	printf("The remote host ip address is:%s\n",remoteIpAddress);
	printf("The locate host ip address is:%s\n",localIpAddress);
}
void pppKill()
{
	mRouteDelete("0.0.0.0",0,0,0);
	mRouteDelete((char *)localIpAddress,0xffffffff,0,0);
	pppDelete(pppUnit);
}
void pppRetry()
{
	int errn=0;
	char retString[20];
	pppDelete(pppUnit);
/*	close(fdModem);*/

/*	if(mRouteAdd("0.0.0.0",localIpAddress,0,0,0)==ERROR)
		printf("Add 0.0.0.0 route failture!\n");
	mRouteAdd(localIpAddress,"127.0.0.1",0xffffffff,0,0);
	mRouteAdd("211.83.109.195",localIpAddress,0xffffffff,0,0);
*/
	mRouteDelete("0.0.0.0",0,0,0);
	mRouteDelete((char *)localIpAddress,0xffffffff,0,0);
/*	mRouteDelete("211.83.109.195",0xffffffff,0,0);*/

/*	atCmdSend("+++",retString);
	atCmdSend("ATH0",retString);*/

	FOREVER
	{
		if((errn++)>5)/*如果连续5次连接不上服务器,则复位终端*/
		{
			printf("5次连不上GPRS服务器引起复位!\n");
/*
			SafeQuit();/ *安全退出并保存相关文件!2004-10-3 by zhoujun* /			
*/
		}
		printf("ppp reconnect\n");
		if(pppConnect()==ERROR)
		{	
			pppDelete(pppUnit);
		/*	close(fdModem);*/
			mRouteDelete("0.0.0.0",0,0,0);
			mRouteDelete((char *)localIpAddress,0xffffffff,0,0);
	/*		mRouteDelete("211.83.109.195",0xffffffff,0,0);*/
	/*		atCmdSend("+++",retString);
			atCmdSend("ATH0",retString);*/
			taskDelay(sysClkRateGet()*60);
		}
		else
			return;
		
	}
}	

void controlLed(char ledNum,int ledStatus)
{
	if(ledNum==0)				/*run led*/
	{
		IOMOD|=0x02;
		IOCTL&=(~0x02);	
		if(ledStatus)
			IODATA|=0x02;
		else
			IODATA&=(~0x02);		
	}
	if(ledNum==1)				/*communication led */
	{
		IOMOD|=0x08;
		IOCTL&=(~0x08);	
		if(ledStatus)
			IODATA|=0x08;
		else
			IODATA&=(~0x08);		
	}

}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -