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 + -
显示快捷键?