netdial.c

来自「基于东南大学开发的SEP3203的ARM7中的所有驱动」· C语言 代码 · 共 640 行

C
640
字号
/* Dialing

 * Copyright (C)2002 Jiang Wei and CNASIC Lab.

 */



#include <stdio.h>

#include <string.h>

#include "os.h"

#include <sys\at.h>

#include "devio.h"



#include <asixwin.h>
#include <asixapp.h>
#include <ppsm.h>



#include <asixwin\asix_mn.h>
#include <asixwin\select.h>
#include <asixwin\asix_sb.h>
#include <asixwin\asix_lb.h>
#include <asixwin\disp.h>
#include <sys\flash.h>

#include <..\app\email\email.h>
#include <..\app\email\emlfunc.h>
#include <..\app\email\emldb.h>



#include "netdial.h"
#include "nettimer.h"

extern NET_SERVER_STRU	net_server_stru;


//static const char mOK[] = "OK\r\n";
//static const char mCONNECT[] = "CONNECT";
//static const char mNOTONE[] = "NO";	/* "NO DIALTONE" */
//static const char mBUSY[] = "BUSY";
//static const char mRET[] = "\r\n";
 char mOK[] = "OK\r\n";
 char mCONNECT[] = "CONNECT";
 char mNOTONE[] = "NO";	/* "NO DIALTONE" */
 char mBUSY[] = "BUSY";

//static const char mAT[] = "AT\r\n";
//static const char mATE0[] = "ATE0\r\n";
//static const char mATZ[] = "ATZ\r\n";
//static const char mATH[] = "ATH\r\n";
//static const char mATD[] = "ATD\r\n";
 char mAT[] = "AT\r\n";
 char mATE0[] = "ATE0\r\n";
 char mATZ[] = "ATZ\r\n";
 char mATH[] = "ATH\r\n";
 char mATD[] = "ATD\r\n";


//static const char mDIAL[50] = "ATDT";
char mDIAL[50] = "ATDT";
extern char dialnum[50];

static char ptUsername[] = "USERNAME:";
static char ptPassword[] = "PASSWORD:";
static char ptLogin[] = "LOGIN:";

char username[16];
char password[16];



void DialInit(int fd)
{
//	strcpy(dial_type.phone_number, "0,163");
//	strcpy(dial_type.user_name, "163");
//	strcpy(dial_type.user_password, "163");
}


unsigned char stringbuf[100];

void ModemReturn(int fd, int timeout)
{
	unsigned char c;
	int n = 0;
	int i = 0;
	unsigned char *stringpointer = stringbuf;
	long clockout;
	long time;

	memset(stringbuf, 0, sizeof(stringbuf));



	clockout = readclock()+timeout;

	
	while ((i < 4)&&((time = readclock()) <= clockout)) {
	
	 		if(SysReadDev(fd, &c, 1, timeout)) {

			*stringpointer = c;
			++stringpointer;
			++n;
			if(c=='\n'||c=='\r') ++i;
		}
		

		}



	stringbuf[n] = '\0';

}

// init modem command and get response, 
// return 0 - success, -1 - error occurred

int modem_command(int fd, char *cmd, char *rep, int tmout)
{
	int len, xlen;
	unsigned char c;
	unsigned char *p;

	unsigned char *stringpointer = stringbuf;

	memset(stringbuf, 0, sizeof(stringbuf));
	
	len = strlen(cmd);

	xlen = SysWriteDev(fd, (unsigned char *)cmd, len, -1);

//	if (xlen < len) return DIAL_ERR;

	if (rep == NULL) return 0;

	p = rep;

	while (*p && (SysReadDev(fd, &c, 1, tmout) == 1)) {
			
			*stringpointer = c;
			++stringpointer;

			if (c == *p) 
				++p;
			else 
				p = rep;

			if(strstr(stringbuf,mBUSY)||strstr(stringbuf,mNOTONE))
				break;
		}
	*stringpointer = '\0';

	if (*p) return DIAL_ERR;

	return 0;

}



int NetDial(int fd, int tmout, unsigned long st)
{	
	SetWindowText( st, "正在初始化Modem...   ", NULL );
	delay(1000);

	strcat((char *)mDIAL,(char *)dialnum);
	strcat((char *)mDIAL,"\r\n");


       // detect modem ready
	if (modem_command(fd, mAT, mOK, 3000)) {

		SetWindowText( st, "Modem初始化失败,请重试...   ", NULL );
		delay(1000);
	//	SetWindowText( st, "正在返回邮件主界面...   ", NULL );

		return DIAL_ERR;
			}

	modem_command(fd, "ATL1\r\n", NULL, 3000);
	// set modem initial state

	if (modem_command(fd, mATE0, mOK, 3000))  {

		SetWindowText( st, "Modem初始化失败...   ", NULL );
		delay(1000);
	//	SetWindowText( st, "正在返回邮件主界面...   ", NULL );
		return DIAL_ERR;
			}
	
	SetWindowText( st, "正在进行拨号,请稍等...   ", NULL );
	// dial the number
	if (modem_command(fd, mDIAL,mCONNECT,40000)) {
//		  ModemReturn(fd,tmout/2);
		  if (strstr(stringbuf, mBUSY))  {
		  SetWindowText( st, "服务器忙,请稍后再试...   ", NULL );
		  delay(1000);
		//  SetWindowText( st, "正在返回邮件主界面...   ", NULL );

		  return DIAL_ERR; 
		  }else  {
			  SetWindowText( st, "拨号失败,请检查设备...   ", NULL );
			  delay(1000);
		//	  SetWindowText( st, "正在返回邮件主界面...   ", NULL );
			  return DIAL_ERR;
		  }


		}

	SetWindowText( st, "OK...   ", NULL );

	delay(1000);

	SetWindowText( st, "正在登录服务器...   ", NULL );
	delay(1000);

	memcpy(username,net_server_stru.dial_acnts,strlen(net_server_stru.dial_acnts));
	strcat(username,"\n");

	memcpy(password,net_server_stru.dial_pass,strlen(net_server_stru.dial_pass));
	strcat(password,"\n");

	// get login prompt

	if (modem_command(fd, "\r\n", ":", tmout)) return DIAL_ERR;

	if (modem_command(fd, username, ":", tmout)) return DIAL_ERR;
	
	modem_command(fd, password, NULL, 0);
	SetWindowText( st, "OK...   ", NULL );
	delay(1000);
	

	return 0;

}







#if 0



/*temp buffer for test*/

char temp_bufuser[4096];

char temp_bufpass[4096];

static char *pbuser = temp_bufuser;

static char *pbpass = temp_bufpass;

/*temp buffer cut here*/





DialType dial_type;



int SendAtCmd(int fd, char *at_cmd_str)

{

	int cmd_str_len;

	int sent_char_num;



	cmd_str_len = strlen(at_cmd_str);

	sent_char_num = SysWriteDev(fd, (unsigned char *)at_cmd_str, cmd_str_len,-1);

	

	if(sent_char_num != cmd_str_len)

		return -1;



	return 0;

}





#define MODEMACK_LEN	64

unsigned char rps_buf[MODEMACK_LEN];

int GetModemRps(int fd, int maxlen, int tmout)	/* get modem response, CRLF filtered, if reply OK, return 1 */

{

	//unsigned char c;

	int n;

	//int r;

	//int more_than_one_flg=0;



	n = 0;

	memset(rps_buf, 0, MODEMACK_LEN);	//clear response buf;



	/*

	while((more_than_one_flg == 0) && (n < MODEMACK_LEN-1))

	{

		if ((r = asy_readch(fd, tmout)) == -1) return -1;

		c = (unsigned char)r;

		if(c == 0x0d) {

			if ((r = asy_readch(fd, tmout)) == -1) return -1;

			c = (unsigned char)r;

			if (c == 0x0a)

				more_than_one_flg = 1;

		} else rps_buf[n++] = c;

	}

	*/

	if (maxlen > MODEMACK_LEN) maxlen = MODEMACK_LEN;

	n = SysReadDev(fd, rps_buf, maxlen, tmout);

	rps_buf[n] = '\0';

	

	/*if (more_than_one_flg) {

		if ((n >= 2) && (toupper(rps_buf[n-1]) == 'K') 

			&& (toupper(rps_buf[n-2]) == 'O')) return 0;

		}*/

	if (strstr(rps_buf, "OK") || strstr(rps_buf, "ok")) return 0;

	return -1;

}



int ModemTest(int fd, unsigned char* at_cmd_str)

{

	int tmout = TICKSPERSEC;	/* wait for 1 second for OK from modem */

	int len;



	if ((len = asy_write(fd, mAT, strlen(mAT))) != strlen(mAT)) return -1;/*******/

	if (SendAtCmd(fd, (char *)at_cmd_str) != 0) return -1;

	if (GetModemRps(fd, 4, tmout) != 0) return -1;

	return 0;

}



int NetDial(int fd, int tmout)

{

	static char ptUsername[] = "USERNAME:";

	static char ptPassword[] = "PASSWORD:";

	static char ptLogin[] = "LOGIN:";

	//int len;                                                                                 

	char *p0, *p1;

	int c;

	//int i = 0;                                                                                 

	//int ret = 0;                                                                              



	//if ((len = asy_write(fd, mATZ, strlen(mATZ))) != strlen(mATZ)) return DIAL_ERR;

	//if (SendAtCmd(fd,"ATH\r\n") != 0) return DIAL_ERR;

	if (SendAtCmd(fd, "ATZ\r\n") != 0) return DIAL_ERR;

	if (GetModemRps(fd, 12, tmout/5) != 0) 

		return DIAL_ERR;

	//delay(200);







//	p0 = &buf[0]; 

//	p1 = &mATD[0];

//	while (*p1) *p0++ = *p1++;

//	p1 = dial_type.phone_number;

//	while (*p1) *p0++ = *p1++;	/* XXX possible buf overflow */

//	*p0++ = '\n';

//	*p0++ = '\r';

//	*p0++ = '\0';

//	if ((len = asy_write(fd, buf, strlen(buf))) != strlen(buf)) return DIAL_ERR;	/* dial */



	SendAtCmd(fd, "ATD8502\r\n");

	//SendAtCmd(fd, "ATDT0,163\r\n");

	GetModemRps(fd,64, tmout);	/* expect connect */

	if (!strstr(rps_buf, mCONNECT)) return DIAL_ERR_NOTONE;

	

	//delay(200);





	SendAtCmd(fd, "\n\r");

	delay(200);



	/* connected, expect login */

	p0 = ptUsername; p1 = ptLogin;

	while (*p0 && *p1 && (c = toupper(asy_readch(fd, 0))) > 0) {

		if (c == *p0) ++p0;

		else p0 = ptUsername;

		if (c == *p1) ++p1;

		else p1 = ptLogin;

		*pbuser++ = c;

	}

	if (*p0 && *p1) return DIAL_ERR;

	



//	memset(buf, 0, sizeof(buf));

//	p0 = buf; p1 = dial_type.user_name;

//	while (*p1) *p0++ = *p1++;	/* XXX possible buf overflow */

//	*p0++ = '\n';

//	*p0++ = '\r';

//	*p0++ = '\0';

//	if ((len = asy_write(fd, buf, strlen(buf))) != strlen(buf)) return DIAL_ERR;	/* output username */





	SendAtCmd(fd, "ppp\n");

	delay(200);

	

	/* expect password prompt */

	p0 = ptPassword;

	while (*p0 && (c = toupper(asy_readch(fd, 0))) > 0) {

		if (c == *p0) ++p0;

		else p0 = ptPassword; 

		*pbpass++ = c;

	}

	if (*p0) return DIAL_ERR;

	

	

//	p0 = buf; p1 = dial_type.user_password;

//	while (*p1) *p0++ = *p1++;	/* XXX possible buf overflow */

//	*p0++ = '\n';

//	*p0++ = '\r';

//	*p0++ = '\0';

//	if ((len = asy_write(fd, buf, strlen(buf))) != strlen(buf)) return DIAL_ERR;	/* output password */





	SendAtCmd(fd, "163\n");

       delay(200);



	return 0;

}



int PhoneDial(int fd, unsigned char* phone_num_str, int tmout)

{

	int len;



	if (SendAtCmd(fd, "ATZ\r\n") != 0) return DIAL_ERR;

	if (GetModemRps(fd,4, tmout) != 0) return DIAL_ERR;

	delay(200);



	memset(buf, 0, sizeof(buf));

	strcpy(buf, "ATD");

	strcat(buf, phone_num_str);

	strcat(buf, ";\n\r");

	

	if ((len = asy_write(fd, buf, strlen(buf))) != strlen(buf)) return DIAL_ERR;



	SendAtCmd(fd, buf);



	GetModemRps(fd,9, tmout);

	

	if (!strstr(rps_buf, mCONNECT)) {

		if (strstr(rps_buf, mNOTONE)) return DIAL_ERR_NOTONE;

		if (strstr(rps_buf, mBUSY)) return DIAL_ERR_BUSY;

		return DIAL_ERR;

	}



	return 0;

}

#endif

⌨️ 快捷键说明

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