#include "etherShield.h"
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {192,168,1,77};
static uint16_t my_port = 1200; // client port
int ledPin = 13;
int x = 0;
static char client_ip[] = "192.168.1.77";
static uint8_t dest_ip[4]={192,168,1,2};
static uint8_t dest_mac[6];
enum CLIENT_STATE
{
IDLE, ARP_SENT, ARP_REPLY, SYNC_SENT
};
static CLIENT_STATE client_state;
static uint8_t client_data_ready;
static uint8_t syn_ack_timeout = 0;
#define BUFFER_SIZE 500
static uint8_t buf[BUFFER_SIZE+1];
char sensorData[10];
EtherShield es=EtherShield();
uint16_t print_webpage(uint8_t *buf);
int8_t analyse_cmd(char *str);
// get current temperature
#define TEMP_PIN 3
void getCurrentTemp( char *temperature);
void client_process(void);
void setup(){
Serial.begin(9600);
Serial.println("setup") ;
/*initialize enc28j60*/
es.ES_enc28j60Init(mymac);
es.ES_enc28j60clkout(2);
delay(10);
es.ES_enc28j60PhyWrite(PHLCON,0x880);
delay(500);
es.ES_enc28j60PhyWrite(PHLCON,0x990);
delay(500);
es.ES_enc28j60PhyWrite(PHLCON,0x880);
delay(500);
es.ES_enc28j60PhyWrite(PHLCON,0x990);
delay(500);
es.ES_enc28j60PhyWrite(PHLCON,0x476);
delay(100);
es.ES_init_ip_arp_udp_tcp(mymac,myip,80);
syn_ack_timeout =0;
client_data_ready = 0;
client_state = IDLE;
digitalWrite(TEMP_PIN, LOW);
pinMode(TEMP_PIN, INPUT);
}
void loop(){
if(client_data_ready==0){
digitalWrite(ledPin,HIGH);
delay(1000UL);
//getCurrentTemp(sensorData);
digitalWrite(ledPin,LOW);
client_data_ready = 1;
}
client_process();
}
uint16_t gen_client_request(uint8_t *buf )
{
uint16_t plen;
byte i;
plen= es.ES_fill_tcp_data_p(buf,0, PSTR ( "GET /home?sensor=1" ) );
plen= es.ES_fill_tcp_data_p(buf,plen, PSTR ( "&valor=0" ) );
plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( " HTTP/1.0\r\n" ));
plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Host: 192.168.1.2\r\n" ));
plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "User-Agent: AVR ethernet\r\n" ));
plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Accept: text/html\r\n" ));
plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Keep-Alive: 300\r\n" ));
plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Connection: keep-alive\r\n\r\n" ));
return plen;
}
void client_process ( void )
{
uint16_t plen;
uint8_t i;
if (client_data_ready == 0) return;
if(client_state == IDLE){ // initialize ARP
es.ES_make_arp_request(buf, dest_ip);
client_state = ARP_SENT;
return;
}
if(client_state == ARP_SENT){
plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);
if ( plen!=0 )
{
if ( es.ES_arp_packet_is_myreply_arp ( buf ) ){
client_state = ARP_REPLY;
syn_ack_timeout=0;
return;
}
}
delay(10);
syn_ack_timeout++;
if(syn_ack_timeout== 100) {
client_state = IDLE;
client_data_ready =0;
syn_ack_timeout=0;
return;
}
}
if(client_state == ARP_REPLY){
// save dest mac
for(i=0; i<6; i++){
dest_mac[i] = buf[ETH_SRC_MAC+i];
}
es.ES_tcp_client_send_packet (
buf,
80,
1200,
TCP_FLAG_SYN_V,
1,
1,
0,
0,
dest_mac,
dest_ip
);
client_state = SYNC_SENT;
}
if(client_state == SYNC_SENT){
plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);
// no new packet incoming
if ( plen == 0 )
{
return;
}
if ( es.ES_eth_type_is_ip_and_my_ip(buf,plen)==0){
return;
}
//if ( buf [ TCP_FLAGS_P ] == ( TCP_FLAG_SYN_V | TCP_FLAG_ACK_V ) )
{
// send ACK to answer SYNACK
Serial.println("entrou1");
es.ES_tcp_client_send_packet (
buf,
80,
1200,
TCP_FLAG_ACK_V,
0,
0,
1,
0,
dest_mac,
dest_ip
);
plen = gen_client_request( buf );
// send http request packet
// send packet with PSHACK
es.ES_tcp_client_send_packet (
buf,
80,
1200,
TCP_FLAG_ACK_V | TCP_FLAG_PUSH_V,
0,
0,
0,
plen,
dest_mac,
dest_ip
);
return;
}
if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_PUSH_V) )
{
Serial.println("entrou2");
plen = es.ES_tcp_get_dlength( (uint8_t*)&buf );
// send ACK to answer PSHACK from server
es.ES_tcp_client_send_packet (
buf,
80,
TCP_FLAG_ACK_V,
0,
0,
plen,
0,
dest_mac,
dest_ip
);;
// send finack to disconnect from web server
es.ES_tcp_client_send_packet (
buf,
80,
1200,
TCP_FLAG_FIN_V|TCP_FLAG_ACK_V,
0,
0,
0,
0,
dest_mac,
dest_ip
);
return;
}
// answer FINACK from web server by send ACK to web server
if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_FIN_V) )
{
Serial.println("entrou3");
// send ACK with seqack = 1
es.ES_tcp_client_send_packet(
buf,
80,
1200,
TCP_FLAG_ACK_V,
0,
0,
1,
0,
dest_mac,
dest_ip
);
client_state = IDLE;
client_data_ready =0;
}
}
}
Moderator edit: [code] ... [/code] tags added. (Nick Gammon)