Proyecto Web server con envio de mail incorporado

#1
Ultimamente no he visto gran desarrollo sobre este tipo de aplicaciones en Microchip (ENC28J60), no se si estoy este fuera de moda o existan otro tipo de implementaciones mas efectivas, economicas y faciles....

Este proyecto que se encuentra en una etapa inicial comprende el control y verificacion de equipos por medio de un web server asi como el envio de un correo en caso de presentarse una alarma en el equipo, envio de una posible base de datos de X parametro, corriente, velocidad...etc al mismo correo como un archivo adjunto. Sobre esto escucho ideas para mejoraro.....

La etapa inicial V1.0 contempla las siguientes posibilidades.

- Envio de mail a correo SMTP, que no requiere el protocolo SSL.....ejemplo yahoo.com
- Acceso a web server de no mas 1500 Bytes, esta web server cuenta con diferentes paginas web X cantidad definida por el programador.

En general no creo que sea mas caracteristicas.....la verdad me a tomado mucho tiempo la depuracion del codigo.....


Considero que es hora de pasar a una version 2.0 con la libreria HTTP.C que nos entrega CCS y mas adelante a una version 3.0 con la libreria HTTP2.C de CCS.

Actualmente tengo algunas dudas que si es posible me gustaria compartir con ustedes:

Existe alguna forma de aumentar el tamaño de la pagina web a mas de 1500 bytes???
Que me recomiendan para aplicar como mejoras a mi aplicacion???
Como se realiza el manejo del protoclo SSL para correos con esta necesidad???

Adjunto codigo de aplicacion (Algunas variables no se aplican, no hay paginas web cargadas...eso lo dejo a ustedes para que ensaye sus web).

PHP:
#include <18F4620.h>
#FUSES  NOWDT, WDT128, HS, NOFCMEN, NOIESO, NOPUT, NOBROWNOUT, BORV20,  NOPBADEN, NOLPT1OSC, MCLR, STVREN, NOLVP, NOXINST, NODEBUG, NOPROTECT,  NOCPB, NOCPD, NOWRT, NOWRTC, NOWRTB, NOWRTD, NOEBTR, NOEBTRB
#use delay(clock=20000000)


#define  PIN_ENC_MAC_SO    PIN_D4   // Conectar con PIN MISO del ENC28J60.1
#define  PIN_ENC_MAC_SI    PIN_D3   // Conectar con PIN MOSI del ENC28J60. 0
#define  PIN_ENC_MAC_CLK   PIN_D2   // Conectar con PIN SCK del ENC28J60. 0
#define  PIN_ENC_MAC_CS    PIN_D5   // Conectar con PIN CS del ENC28J60. 0
#define  PIN_ENC_MAC_RST   PIN_D6   // Conectar con PIN RST del ENC28J60. 0
#define  PIN_ENC_MAC_INT   PIN_D1   // Conectar con PIN INT del ENC28J60. 1
#define  PIN_ENC_MAC_WOL   PIN_D7   // Conectar con PIN WOL del ENC28J60. 1

//Protocolos a utilizar.

#define  STACK_USE_MCPENC  TRUE
#define  STACK_USE_ARP     TRUE
#define  STACK_USE_ICMP    TRUE
#define  STACK_USE_TCP     TRUE
#define  __ESMTP          
#define  STACK_USE_BASE64  TRUE
#define  STACK_USE_DNS     TRUE
#define  STACK_USE_UDP     TRUE

#include "tcpip/stacktsk.c"
#include "tcpip/smtp.c"

#define MY_HTTP_SOCKET  80 //puerto

void paginaweb();//CARGA LA PAGINA WEB QUE SOLICITEMOS

//variables usadas en el correo
int8 state1=0;
int8 timeoutEthernet = 0;
int1 tick =FALSE, flag_sendinMailEth =FALSE, flag_emailSent =FALSE, flag_sendmail =FALSE, flag_pass=FALSE; //banderas de email
int16 port;
char hostname[40];
char username[40];
char pwd[15];
char from[40];
char to[40];
char subject[20];
char body[70];
IP_ADDR smtpserver;

//variables usadas en funcionamiento general
int8 puerto=INVALID_SOCKET;
int16 valor=0;

//variables usadas en control de paginas
static char pagina[20],pagcons[20];
static int dirpag=0;

//variable de almaceniamiento de pagina
char content0[1500];

//variables de paginas
char mamo[30],tr[3],volt[3],kwat[4],user[10],pass[10];
float amp[20],temp[20];
int1 sta,aut,must;

// Microchip VendorID, MAC: 00-04-A3-00-00-01
void MACAddrInit(void)
{
   MY_MAC_BYTE1=0x00; MY_MAC_BYTE2=0x04; MY_MAC_BYTE3=0xA3; MY_MAC_BYTE4=0x00; MY_MAC_BYTE5=0x00; MY_MAC_BYTE6=0x01;
}
void IPAddrInit(void)
{
   //Direccion IP
   MY_IP_BYTE1=192; MY_IP_BYTE2=168; MY_IP_BYTE3=1; MY_IP_BYTE4=20;
   //Puerta de Enlace
   MY_GATE_BYTE1=192; MY_GATE_BYTE2=168; MY_GATE_BYTE3=1; MY_GATE_BYTE4=1;
   //Mascara de Subred
   MY_MASK_BYTE1=255; MY_MASK_BYTE2=255; MY_MASK_BYTE3=255; MY_MASK_BYTE4=0;
   //DNS
   MY_DNS_BYTE1=8;MY_DNS_BYTE2=8;MY_DNS_BYTE3=8;MY_DNS_BYTE4=8; // DNS Necesario para determinar la ip del servidor de correo
}

void HTTPPut(char c)
{
   TCPPut(puerto, c);
}

void HTTPTask(void)
{
   static enum {HTTP_ST_CONNECT=0, HTTP_ST_WAIT_CONNECT=1, HTTP_ST_GET=2, HTTP_ST_PUT=3, HTTP_ST_DISCONNECT=4} state=0;
   static TICKTYPE timeout_counter;
   static char lc, lc2;
   char c,leng[4],*ptr;

   if (puerto==INVALID_SOCKET)
      state=HTTP_ST_CONNECT;
   else if (!TCPIsConnected(puerto))
      state=HTTP_ST_WAIT_CONNECT;
   else if (TickGetDiff(TickGet(), timeout_counter) > TICKS_PER_SECOND*60)
      state=HTTP_ST_DISCONNECT;

   switch(state) {
      case HTTP_ST_CONNECT:
         puerto=TCPListen(MY_HTTP_SOCKET);
         if (puerto!=INVALID_SOCKET) 
         {
          state=HTTP_ST_WAIT_CONNECT;
          timeout_counter=TickGet();
         }
         break;

      case HTTP_ST_WAIT_CONNECT:
         timeout_counter=TickGet();
         if (TCPIsConnected(puerto)) {
            state=HTTP_ST_GET;
         }
         break;

      case HTTP_ST_GET: 
         if (TCPIsGetReady(puerto)) 
         {
          dirpag=0;
          while (TCPGet(puerto, &c)) 
          {           
           pagina[valor]=c; //SE IDENTIFICA LA TERMINACION DE LA SOLICITUD ENVIADA DESDE EL CLIENTE
           valor++;
           sprintf(pagcons,"GET /");
           if(strncmp(pagina,pagcons,5)==0)
           {
            valor=0;
           }
           //se define la pagina web a mostrar dependiendo de la solicitud enviada...abajo unos ejemplos de nombre
           sprintf(pagcons,"index.html");
           if(strncmp(pagina,pagcons,10)==0)dirpag=1;
           sprintf(pagcons,"eventos.html");
           if(strncmp(pagina,pagcons,12)==0)dirpag=2;
           sprintf(pagcons,"configuracion.html");
           if(strncmp(pagina,pagcons,18)==0)dirpag=3;
           sprintf(pagcons,"reportes.html");
           if(strncmp(pagina,pagcons,13)==0)dirpag=4;
           sprintf(pagcons,"conectividad.html");
           if(strncmp(pagina,pagcons,10)==0)dirpag=5;
           sprintf(pagcons,"ingreso.html");
           if(strncmp(pagina,pagcons,10)==0)dirpag=6;
           if((c=='\n')&&(lc2=='\n')) 
           {
            state=HTTP_ST_PUT;
           }
            lc2=lc;
            lc=c;           
          }
         }
         break;

      case HTTP_ST_PUT:
         if (TCPIsPutReady(puerto)) 
         {
          paginaweb();
          for(valor=0;content0!='\0';valor++);//se determina el tamaño de la pagina web. No mayor a 1500 Bytes
          itoa(valor,10,leng);
          //se almacena el texto entre comillas en la variable de tipo char contentX
          printf(HTTPPut, "HTTP/1.1 200 OK\r\n"); 
          printf(HTTPPut, "Content-Type: text/html\r\n");
          printf(HTTPPut, "Content-Length: %s\r\n",leng);
           //esta es la respuesta inicial que se debe enviar en una  conversacion del protocolo HTTP contet-length indica la dimension del  mensaje a enviar 
          printf(HTTPPut, "\r\n");
          printf(HTTPPut, "%s", content0);
          TCPFlush(puerto);
          state=HTTP_ST_GET;
          }         
      break;

      case HTTP_ST_DISCONNECT:
         if (TCPIsPutReady(puerto)) 
         {
            TCPDisconnect(puerto);
            state=HTTP_ST_WAIT_CONNECT;
         }
         break;
   }
}
void paginaweb()
{
switch(dirpag)
{
 case 1:
  sprintf(content0, ""); 
 break;
 case 2:
  sprintf(content0, ""); 
 break; 
 case 3:
  sprintf(content0, ""); 
 break;
 case 4:
  sprintf(content0, ""); 
 break; 
 case 5:
  sprintf(content0, ""); 
 break; 
 case 6:
  sprintf(content0, ""); 
 break; 
}
}
void SendMailConfig(void)
{
 port = 25;
 sprintf(hostname, "smtp.mail.yahoo.com");
 sprintf(username, "[EMAIL="xxxx@yahoo.com.co"]xxxx@yahoo.com.co[/EMAIL]");
 sprintf(pwd, "xxxx");
 sprintf(from, "xxxx");
 sprintf(to, "[EMAIL="xxxx@gmail.com"]xxxx@gmail.com[/EMAIL]");
 sprintf(subject, "xxxx");
 sprintf(body, "xxxxxx");
}

void envio_mail(void)
{
 StackTask();
 if(flag_sendinMailEth) SMTPTask();
 switch(state1)
 {
  case 0:
  if(!MACIsLinked())
  {
   if(!tick)
   {
    tick = TRUE;
   }
  }
  else
  {
   state1++;
   tick = FALSE;
   
  }
  break;
  
  case 1:
  if(!tick)
  {
    DNSResolve(hostname);
    tick = TRUE;
    
  }
  else
  {   
   state1++;
   tick = FALSE;
  }
  timeoutEthernet = 0;
  break;
  
  case 2:
  if(DNSIsResolved(&smtpserver))
  {   
   timeoutEthernet = 0;
   state1++;
   
  }
  else if(timeoutEthernet > 1)
  {   
   timeoutEthernet = 0;
   state1=0;
  }
  break;
  
  case 3:
  if(SMTPConnectAndStart(&smtpserver, port, username, pwd, from, to, subject))
  {
   output_high(PIN_B4);
   flag_sendinMailEth=1;
   state1++;
  }
  else
  {
   state1=0;
  }
  break;
  
  case 4:
  if (SMTPLastError())
  {
   
   state1 = 0;
  }
  else if (SMTPIsPutReady())
  {
   output_high(PIN_B5);
   printf(SMTPPut, "%s", body);
   SMTPDisconnect();
   state1++;
  }
  break;
  
  case 5:
  if (SMTPIsFree())
  {
   if (!SMTPLastError())
   {
    flag_emailSent = TRUE;
    flag_sendmail = FALSE;
   }
   else
   output_high(PIN_B4);
   state1=0;
  }
  break;
 }
}

void main(void)
{
   MACAddrInit();
   IPAddrInit();
   StackInit();
   SendMailConfig();
   SMTPInit();
   while(TRUE)
   {      
      StackTask();
      HTTPTask();
      if(flag_sendmail) envio_mail();
      else if(input(PIN_D0)) //si se preciona el swicht se envia un correo a la direccion definida
      {
       while(input(PIN_D0));
       flag_sendmail = TRUE;       
      }
   }
}
Agradezco su apoyo y si desean que siga compartiendo mis adelantos me avisan.....

PD: Alguien sabe como evolucionar a redes wireless....con enc28j60....o con el modulo wirelles de microchip....en lenguaje ccs??? gracias.
 
Última edición por un moderador:
#4
si

lo que te quiero decir es que tengo un modulo de enc28j60 de sure electronic
y ese programa que tu tienes es creado en ccs?

por que yo tengo uno en ccs y no me funciono en el modulo que tengo

y las especificaciones del modulo dice que soporta el stack de microchip
pero no he podido encontra un ejemplo.
 
#5
EL ENC28j60 es un controlador autonomo ethernet manejado por SPI... mientras tengas un micro que soporte SPI puedes conectarle ese modulo...

Ese codigo es un enlace entre un PIC18 y el ENC, y no sirve para arduino... pero si puedes exportar algunas partes siempre y cuando sepas programacion C...
 
Arriba