Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

13/05/2012 #1


Proyecto Web server con envio de mail incorporado
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).

Código 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 =FALSEflag_sendinMailEth =FALSEflag_emailSent =FALSEflag_sendmail =FALSEflag_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=0x00MY_MAC_BYTE2=0x04MY_MAC_BYTE3=0xA3MY_MAC_BYTE4=0x00MY_MAC_BYTE5=0x00MY_MAC_BYTE6=0x01;
}
void IPAddrInit(void)
{
   
//Direccion IP
   
MY_IP_BYTE1=192MY_IP_BYTE2=168MY_IP_BYTE3=1MY_IP_BYTE4=20;
   
//Puerta de Enlace
   
MY_GATE_BYTE1=192MY_GATE_BYTE2=168MY_GATE_BYTE3=1MY_GATE_BYTE4=1;
   
//Mascara de Subred
   
MY_MASK_BYTE1=255MY_MASK_BYTE2=255MY_MASK_BYTE3=255MY_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(puertoc);
}

void HTTPTask(void)
{
   static 
enum {HTTP_ST_CONNECT=0HTTP_ST_WAIT_CONNECT=1HTTP_ST_GET=2HTTP_ST_PUT=3HTTP_ST_DISCONNECT=4state=0;
   static 
TICKTYPE timeout_counter;
   static 
char lclc2;
   
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_sendinMailEthSMTPTask();
 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(&smtpserverportusernamepwdfromtosubject))
  {
   
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_sendmailenvio_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.
09/06/2012 #2


el codigo que tienes sirve para el kit de arduino??
10/06/2012 #3
Moderador

Avatar de Chico3001

No... ese codigo es para Microchip
10/06/2012 #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.
10/06/2012 #5
Moderador

Avatar de Chico3001

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...
10/06/2012 #6


Pero tienes el es quema
por que en el codigo que muestran

ccs
el pin wol se conecta al pic
mientras en arduino no se conecta

tienes el esquema para ccs?
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.