Network monitoring

I have several devices and internet site I would like to "ping" and graphically represent the response time. I was planning to do this with an Arduino + ethernet shield. I searched google for similar projects and found several, but they all see to use a computer to do the pinging and the Arduino just turns leds on/off. Is it not possible to do this all from the Arduino?

Given an Ethernet shield and some sort of display device I would have thought that this was perfectly possible. The only down side might be the lack of memory to store the results. While most arduinos have 2K running the Ethernet shield consumes most of that.

I'm thinking about just using Rgb LEDs to represent each host. Other than the opendns.org display going around, are there any similar projects out there (that use only the Arduino)?

I have not seen anything, have you tried searching the the Exhibition Gallery section of this web site?

Yeah. Unfortunately my searched return results on ultrasonic range finding (ping) or projects that involve a computer doing three work.

One last question: with the ethernet shield in use, how many RGB leds will i be able to control with the remaining IO pins? Since i want to control 7 or so LEDs I think I will need a multiplexer.

The OctoBrite DEFILIPPI would meet your needs. You'll notice you can also keep adding on boards to add more LEDs.

You could create your own circuit to handle the multiplexing and have enough pins available to do so but you'd probably be paying $10 just for the parts to do that. It depends on how much you enjoy building circuits vs. getting your project done, I suppose.

Pinging a website requires the ICMP protocol. Some of the minimalistic TCP/IP protocol stacks used in the variuos Arduino ethernet shields does as far as i know not implement ICMP.

MikMo:
Pinging a website requires the ICMP protocol. Some of the minimalistic TCP/IP protocol stacks used in the variuos Arduino ethernet shields does as far as i know not implement ICMP.

Hum, any recommendations as to what hardware to get then?

Someone coded an ICMP (Ping) extension: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1285859555

If I were you, though, I'd perform an actual DNS request from the target and time the response. I assume your purpose is to see the latency in DNS responses from the target so that's what you should actually be testing.

This is what I used to ping from an Ethernet shield:-

#include "etherShield.h"

// please modify the following two lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
static uint8_t mymac[6] = {
  0x54,0x55,0x58,0x10,0x88,0x24}; 
static uint8_t myip[4] = {
  192,168,1,15};
// how did I get the mac addr? Translate the first 3 numbers into ascii is: TUX

#define BUFFER_SIZE 250
unsigned char buf[BUFFER_SIZE+1];

uint16_t plen;

EtherShield es=EtherShield();


void setup(){
 
  /*initialize enc28j60*/
  es.ES_enc28j60Init(mymac);
  es.ES_enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz
 
  delay(10);

  /* Magjack leds configuration, see enc28j60 datasheet, page 11 */
  // LEDA=green LEDB=yellow
  //
  // 0x880 is PHLCON LEDB=on, LEDA=on
  // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
  es.ES_enc28j60PhyWrite(PHLCON,0x880);
  delay(500);
 
  //
  // 0x990 is PHLCON LEDB=off, LEDA=off
  // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
  es.ES_enc28j60PhyWrite(PHLCON,0x990);
  delay(500);
 
  //
  // 0x880 is PHLCON LEDB=on, LEDA=on
  // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
  es.ES_enc28j60PhyWrite(PHLCON,0x880);
  delay(500);
 
  //
  // 0x990 is PHLCON LEDB=off, LEDA=off
  // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
  es.ES_enc28j60PhyWrite(PHLCON,0x990);
  delay(500);
 
  //
  // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit
  // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);
  es.ES_enc28j60PhyWrite(PHLCON,0x476);
  delay(100);
 
  //init the ethernet/ip layer:
  es.ES_init_ip_arp_udp_tcp(mymac,myip,80);
 

}

void loop(){

  plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);

  /*plen will be unequal to zero if there is a valid packet (without crc error) */
  if(plen!=0){
       if(es.ES_eth_type_is_arp_and_my_ip(buf,plen)){
      	es.ES_make_arp_answer_from_request(buf);
      }
      // check if ip packets (icmp or udp) are for us:
      if(es.ES_eth_type_is_ip_and_my_ip(buf,plen)!=0){
         if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){
         		// a ping packet, let's send pong
          
            es.ES_make_echo_reply_from_request(buf,plen);
   		    }
      }
 
  }  
}

I havn't read much on Ardruino coding, so I might be missing something, but the code provided looks like it resonds to a ping, not send one.