The question of how to do GET requests with the ENC28J60 arose recently so here is an example.
This is using the etherShield from Nuelectronics and @andrewdlindsay‘s etherShield library.
The code assumes some familiarity with the ethershield examples.
#include <etherShield.h>
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x28};
static uint8_t myip[4] = {192,168,1,25};
// Default gateway. The ip address of your DSL router. It can be set to the same as
// websrvip the case where there is no default GW to access the
// web server (=web server is on the same lan as this host)
static uint8_t gwip[4] = {192,168,1,1};
//============================================================================================================
// Pachube declarations
//============================================================================================================
#define PORT 80 // HTTP
// the etherShield library does not really support sending additional info in a get request
// here we fudge it in the host field to add the API key
// Http header is
// Host: <HOSTNAME>
// X-PachubeApiKey: xxxxxxxx
// User-Agent: Arduino/1.0
// Accept: text/html
#define HOSTNAME "www.pachube.com\r\nX-PachubeApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxx" // my API key
static uint8_t websrvip[4] = {173,203,98,29}; // www.pachube.com
#define HTTPPATH "/api/9999.csv" // The feed
EtherShield es=EtherShield();
#define BUFFER_SIZE 500
static uint8_t buf[BUFFER_SIZE+1];
void browserresult_callback(uint8_t statuscode,uint16_t datapos){
Serial.print("Received data, status:"); Serial.println(statuscode,DEC);
if (datapos != 0)
{
Serial.println((char*)&buf[datapos]);
// now search for the csv data - it follows the first blank line
// I'm sure that there is an easier way to search for a blank line - but I threw this together quickly
// and it works for me.
uint16_t pos = datapos;
while (buf[pos]) // loop until end of buffer (or we break out having found what we wanted)
{
while (buf[pos]) if (buf[pos++] == '\n') break; // find the first line feed
if (buf[pos] == 0) break; // run out of buffer
if (buf[pos++] == '\r') break; // if it is followed by a carriage return then it is a blank line (\r\n\r\n)
}
if (buf[pos]) // we didn't run out of buffer
{
pos++; //skip over the '\n' remaining
Serial.print("CSV line is:");
Serial.println((char*)&buf[pos]);
}
}
}
void setup(){
Serial.begin(9600);
Serial.println("Ethershield Get example");
/*initialize enc28j60*/
es.ES_enc28j60Init(mymac);
//init the ethernet/ip layer:
es.ES_init_ip_arp_udp_tcp(mymac, myip, PORT);
// init the web client:
es.ES_client_set_gwip(gwip); // e.g internal IP of dsl router
es.ES_client_set_wwwip(websrvip); // target web server
}
void loop()
{
static uint32_t timetosend;
uint16_t dat_p;
while(1){
// handle ping and wait for a tcp packet - calling this routine powers the sending and receiving of data
dat_p=es.ES_packetloop_icmp_tcp(buf,es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf));
if (dat_p == 0)
{
if (millis() - timetosend > 10000) // every 10 seconds
{
timetosend = millis();
Serial.println("Sending request");
// note the use of PSTR - this puts the string into code space and is compulsory in this call
// second parameter is a variable string to append to HTTPPATH, this string is NOT a PSTR
es.ES_client_browse_url(PSTR(HTTPPATH), NULL, PSTR(HOSTNAME), &browserresult_callback);
}
}
}
}







Interesting IDEA.
I took the approach that the Arduino should just publish xAP packets which contain the data of thing being monitored, and I have an xAP PACHUBE service that published that data to Pachube.
http://www.dbzoo.com/livebox/hah_arduino
http://www.dbzoo.com/livebox/hah#xap_pachube
I modified the ENC28J60 library from jeenode so that UDP broadcast packets could be sent. This is what xAP uses.