Una conexión telnet se lleva a cabo en el puerto 23, por lo tanto debemos configurar a nuestro módulo ethernet a que escuche en dicho puerto. Todo Ethernet Shield posee su propio identificador MAC, se encuentra pegado en el reverso del Shield.
Controlaremos 3 leds mediante el uso de 3 comandos simples enviados a través de una conexión telnet. En mi caso, la dirección IP asignada por mi access point al módulo ethernet es 192.168.0.105. Podemos verificar la dirección asignada al módulo accediendo a la configuración del access point. Para comunicarnos con el módulo mediante algún dispositivo sólo necesitamos saber la dirección IP y el puerto, cómo usaremos Telnet, usaremos el puerto 23. La dirección IP varía de acuerdo al access point que usemos.
En Windows podemos usar HyperTerminal para conectarnos a la dirección IP asignada al módulo ethernet o UTFTeraTerm. En Mac podemos abrir la terminal y escribir "telnet dirección puerto", en mi caso "telnet 192.168.0.105 23". Si usamos un teléfono o dispositivo Android podemos usar la aplicación Socket Widget, y entablar una conexión con el módulo.
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x88, 0x44 }; //se encuentra pegado en una etiqueta al reverso del ethernet shield
/* Si usamos DHCP ya no requerimos establecer ip, gateway y subnet*/
//IPAddress ip(192, 168, 0, 105);
//IPAddress gateway(192,168,0, 1);
//IPAddress subnet(255, 255, 255, 0);
/* Si usamos DHCP ya no requerimos establecer ip, gateway y subnet*/
//IPAddress ip(192, 168, 0, 105);
//IPAddress gateway(192,168,0, 1);
//IPAddress subnet(255, 255, 255, 0);
//el puerto usado para telnet es el 23
EthernetServer server(23);
boolean estadoled1 = false, estadoled2 = false, estadoled3 = false;
void setup() {
//inicializamos pines para controlar leds
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
//inicializar modulo ethernet
//Ethernet.begin(mac, ip, gateway, subnet);
/* Podemos inicializar el módulo Ethernet sin ip, gateway
y subnet, porque a partir de la versión 1.0 de Arduino
ya se soporta DHCP */
Ethernet.begin(mac);
//esperamos clientes
//Ethernet.begin(mac, ip, gateway, subnet);
/* Podemos inicializar el módulo Ethernet sin ip, gateway
y subnet, porque a partir de la versión 1.0 de Arduino
ya se soporta DHCP */
Ethernet.begin(mac);
//esperamos clientes
server.begin();
/* Imprimimos la dirección IP local y
esperamos un tiempo para que el módulo obtenga ip dinámico,
así ya sabemos exactamente dónde queremos comunicarnos */
delay(1000);
Serial.begin(9600);
Serial.print("Mi dirección IP: ");
for (byte i = 0; i < 4; i++) {
Serial.print(Ethernet.localIP()[i], DEC);
Serial.print(".");
}
Serial.println();
/* Imprimimos la dirección IP local y
esperamos un tiempo para que el módulo obtenga ip dinámico,
así ya sabemos exactamente dónde queremos comunicarnos */
delay(1000);
Serial.begin(9600);
Serial.print("Mi dirección IP: ");
for (byte i = 0; i < 4; i++) {
Serial.print(Ethernet.localIP()[i], DEC);
Serial.print(".");
}
Serial.println();
}
void loop() {
//nos mantenemos esperando un cliente nuevo
EthernetClient cliente = server.available();
//si hay un cliente, se imprime mensaje hasta recibir información de él
if (cliente) {
cliente.println("Conectado a TELNET ARDUINO");
while (cliente.connected()) {
//leemos
char data = cliente.read();
//prendemos/apagamos leds
switch(data){
case '1':
digitalWrite(5, estadoled1);
cliente.print("led1 ");
cliente.println(estadoled1 ? "prendido" : "apagado");
//si se vuelve a mandar el char '1' invertimos la operacion anterior
estadoled1 = !estadoled1;
break;
case '2':
digitalWrite(6, estadoled2);
cliente.print("led2 ");
cliente.println(estadoled2 ? "prendido" : "apagado");
estadoled2 = !estadoled2;
break;
case '3':
digitalWrite(7, estadoled3);
cliente.print("led3 ");
cliente.println(estadoled3 ? "prendido" : "apagado");
estadoled3 = !estadoled3;
break;
default:
break;
}
}
}
//nos aseguramos de tener una conexión cerrada
cliente.stop();
}
if (cliente) {
cliente.println("Conectado a TELNET ARDUINO");
while (cliente.connected()) {
//leemos
char data = cliente.read();
//prendemos/apagamos leds
switch(data){
case '1':
digitalWrite(5, estadoled1);
cliente.print("led1 ");
cliente.println(estadoled1 ? "prendido" : "apagado");
//si se vuelve a mandar el char '1' invertimos la operacion anterior
estadoled1 = !estadoled1;
break;
case '2':
digitalWrite(6, estadoled2);
cliente.print("led2 ");
cliente.println(estadoled2 ? "prendido" : "apagado");
estadoled2 = !estadoled2;
break;
case '3':
digitalWrite(7, estadoled3);
cliente.print("led3 ");
cliente.println(estadoled3 ? "prendido" : "apagado");
estadoled3 = !estadoled3;
break;
default:
break;
}
}
}
//nos aseguramos de tener una conexión cerrada
cliente.stop();
}
}