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

📄 ppp_process.c

📁 Contiki is an open source, highly portable, multi-tasking operating system for memory-constrained n
💻 C
字号:
/* * $Id: ppp_process.c,v 1.1 2006/06/17 22:48:09 adamdunkels Exp $ */#include "contiki.h"#include "contiki-net.h"#include "net/ppp/ppp.h"PROCESS(ppp_process, "PPP");//-----------------------------------------------------------------------------// Note, that the UART RX-FIFO must be polled often enough so we don't get an// overrun at the used baudrate.//-----------------------------------------------------------------------------#define	PPP_POLL_INTERVAL	(CLOCK_SECOND / 256)#define	AT_TIMEOUT		(2 * CLOCK_SECOND / PPP_POLL_INTERVAL)#define	AT_RX_BUF		64enum {  AT_CONNECT_DIRECT,  AT_CONNECT_AUTO,  AT_CONNECT_MANUAL} At_connect;enum {  AT_IDLE,  AT_CONNECT,  AT_CONNECT1,  AT_CONNECT2,  AT_CONNECTED,  AT_RESET,  AT_RESET1,  AT_RESET2,  AT_RESET3,  AT_RESET4,  AT_RESET5};static struct etimer pppTimer;static	u8_t	at_state;static	u8_t	at_connect_mode = AT_CONNECT_MODE;static	int	at_timeout = -1;static	u8_t	at_rxBuf[ AT_RX_BUF ];static voidat_puts(char *s) {  while(*s) {    ppp_arch_putchar(*s);    s++;  }}static u8_t*at_gets() {  static u8_t consumed;  int	len;  int	i;  if (consumed) {    consumed = 0;    at_rxBuf[0] = 0;  }  len = strlen(at_rxBuf);  for (i=len; i<AT_RX_BUF-1; i++) {    if ( ppp_arch_getchar(&at_rxBuf[i])) {      at_rxBuf[i+1] = 0;      if (at_rxBuf[i] == '\n') {//printf("at_gets=(%s)\n", at_rxBuf);	consumed = 1;        return at_rxBuf;      }    } else {      return NULL;    }  }  // overflow -> reset the buf  at_rxBuf[0] = 0;  return NULL;}static voidat_poll() {  static u8_t loopCnt = 0;  u8_t	*s;  if (at_timeout > 0) {    at_timeout--;  }  if (at_state == AT_CONNECTED) {    ppp_poll();    if(uip_len > 0) {      tcpip_input();    }    if (loopCnt++ > 16) {      int	i;      loopCnt = 0;      for (i=0; i<UIP_CONNS; i++) {	uip_periodic(i);	if(uip_len > 0) {	  tcpip_output();	}      }    }  } else {    switch (at_state) {    case AT_IDLE:	switch (at_connect_mode) {	case AT_CONNECT_DIRECT:	  at_state = AT_CONNECTED;	  ppp_connect();	  break;	case AT_CONNECT_AUTO:	  at_state = AT_CONNECT;	  break;	}	break;    case AT_CONNECT:	at_gets();	// make the input buffer empty	at_puts("ATE1\r\n");	at_state = AT_CONNECT1;	at_timeout = AT_TIMEOUT;        break;        case AT_CONNECT1:	if (at_timeout == 0) {	  at_state = AT_RESET;	} else if ((s=at_gets())) {	  if (strcmp(s,"OK\r\n") == 0) {	    at_puts("AT+CGDCONT=1,\"IP\",\"online.telia.se\",\"\",0,0\r\n");	    at_timeout = AT_TIMEOUT;	    at_state = AT_CONNECT2;	  }	}        break;    case AT_CONNECT2:	if (at_timeout == 0) {	  at_state = AT_RESET;	} else if ((s=at_gets())) {	  if (strcmp(s,"OK\r\n") == 0) {	    at_puts("ATD*99***1#\r\n");	    at_state = AT_CONNECTED;	    ppp_connect();	  }	}        break;    case AT_RESET://printf("AT_RESET\n");	at_timeout = AT_TIMEOUT;	at_state = AT_RESET1;        break;    case AT_RESET1:	if (at_timeout == 0) {	  lcp_disconnect(random_rand() & 0xff);	  at_timeout = AT_TIMEOUT;	  at_state = AT_RESET2;	}        break;    case AT_RESET2:	if (at_timeout == 0) {	  lcp_disconnect(random_rand() & 0xff);	  at_timeout = AT_TIMEOUT;	  at_state = AT_RESET3;	}        break;    case AT_RESET3:	if (at_timeout == 0) {	  at_puts("+++");	  at_timeout = AT_TIMEOUT;	  at_state = AT_RESET4;	}        break;    case AT_RESET4:	if (at_timeout == 0) {	  at_puts("ATZ\r\n");	  at_timeout = AT_TIMEOUT;	  at_state = AT_RESET5;	}        break;    case AT_RESET5:	at_gets();	// make the input buffer empty	if (at_timeout == 0) {	  at_state = AT_IDLE;	}        break;    }  }}void ppp_reconnect() {  at_state = AT_RESET;  uip_fw_unregister(&pppif);}PROCESS_THREAD(ppp_process, ev, data){  PROCESS_BEGIN();    at_state = AT_IDLE;  at_rxBuf[0] = 0;  ppp_init();  etimer_set(&pppTimer, PPP_POLL_INTERVAL);  while(1) {    PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);        if(etimer_expired(&pppTimer)) {      etimer_set(&pppTimer, PPP_POLL_INTERVAL);      at_poll();    }  }    PROCESS_END();}

⌨️ 快捷键说明

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