Comunicar Arduino con Mikrotik

Hola, estoy realizando un proyecto desde donde intento conectarme a un AP mikrotik desde arduino.
Os cuento lo que tengo:
Arduino Uno.
Shield ethernet ENC28J60 http://www.nuelectronics.com/estore/index.php?main_page=product_info&cPath=1&products_id=4

he conseguido las librerias correctas para este shield.
de este sitio GitHub - turicas/Ethernet_ENC28J60: [NOT MAINTAINED, NOT COMPLETED] Implementation of an Arduino-compatible socket layer library that uses Microchip ENC28J60 Ethernet controller.

he cargado el ejemplo de telnetest y tengo ping a la ip que pongo pero no se que hace..

#include <Server.h>
#include <Ethernet.h>
#include <Client.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 123 };

Server server(80);

#ifdef ETHERSHIELD_DEBUG
#include <inttypes.h>
uint8_t *debugCodes;

void printSocketDebug() {
  debugCodes = Ethernet.returnDebug();
  if (debugCodes[0] != 255) {
    Serial.println("DEBUG:");
    for (int i = 0; debugCodes[i] != 255; i++) {
      Serial.print("  ");
      Serial.println(debug2str(debugCodes[i]));
    }
    Ethernet.clearDebug();
  }
}
#endif

void setup() {
  Serial.begin(9600);
  Serial.println("*** Init");
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  Client client = server.available();

#ifdef ETHERSHIELD_DEBUG
  printSocketDebug();
#endif

  if (client) {
#ifdef ETHERSHIELD_DEBUG
  Serial.println("*** New client!");
#endif

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.println(c);
        client.write(c);
      }
    }
#ifdef ETHERSHIELD_DEBUG
  Serial.println("*** Client disconnected.");
#endif

  }
}

en la consola serial, solo me aparece ***init

intento conectarme desde el pc al arduino y no se conecta.
( entro en cmd, y pongo telnet, después pongo o y la ip del arduino pero no tengo respuesta )

Mi consulta es que necesito conectarme mediante telnet pero estoy un poco perdido, ya he estado leyendo en los foros pero no me aclaro...

Alguna ayudita???

Os cuento a groso modo lo que necesito hacer.

Por un lado tengo un AP mikrotik que supuesta-mente es el server telnet, ( desde un pc me conecto a su telnet y me pide usuario y clave lo pongo y accedo a su consola para poder configurarlo )
por otro lado tengo arduino con el shield ethernet, que se configuraría como cliente telnet, ( si pulso un botón me manda una serie de comando a la consola para re-programarla )
:grin: :grin: :grin: :grin: :grin: :grin: :grin: :grin: :grin:

joooo, estoy buscando y buscando y nada de nada, he encontrado varias paginas con codigos y de mas y no me funciona, he puesto el codigo de la shield que funciona y no me funciona, ejemplo:

utilizo el codigo web server:

/*
 * Web Server
 *
 * A simple web server that shows the value of the analog input pins.
 */

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 30};

Server server(80);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  Client client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if we've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so we can send a reply
        if (c == '\n' && current_line_is_blank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          
          // output the value of each analog input pin
          for (int i = 0; i < 6; i++) {
            client.print("analog input ");
            client.print(i);
            client.print(" is ");
            client.print(analogRead(i));
            client.println("
");
          }
          break;
        }
        if (c == '\n') {
          // we're starting a new line
          current_line_is_blank = true;
        } else if (c != '\r') {
          // we've gotten a character on the current line
          current_line_is_blank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
}

cuando le hago pin a la ip 192.168.0.30 funciona perfectamente.
intento acceder a http://192.168.0.30 - no obtengo nada y a demás el pin se pierde..

aqui os dejo un video de lo que me pasa.. alguna idea??????????????????????

La librería de turicas está en desarrollo, por lo que no es muy buena idea usarla.
El sketch deja de funcionar porque almacena la página en memoria y al no tener suficiente, pues stackoverflow y adios.
Tampoco está preparada para tener 2 sockets abiertos, por lo que si haces un ping y entras a la vez también se vuelve loco.

Un saludo

gracias chiva, me lo imaginaba pero como estoy un poco verde en esto.. pido opinión a los profesionales..

alguien ha utilizado o ha creado algo con este shield ?????????? no creo que sea muy difícil, pero no encuentro ningún tutorial de las funciones de las librerías de para este shield.

¿¿alguien sabe cual son las funciones y como funcionan??

Este hilo que acaban de hacer creo que te viene que ni pintado
http://arduino.cc/forum/index.php/topic,77292.0.html

gracias de nuevo chiva, este post tambien lo he visto y todas la paginas las he visitado, pero casi todas las librerias estan a medio hacer y muy limitadas..

aqui pongo webs que he visitado con los temas relacionados para adaptar este shield a las librerias de arduino.

http://openenergymonitor.org/emon/node/80

http://jeelabs.net/projects/cafe/wiki/EtherCard

las he instaldo y probados y consigu server web pero no tienen implementado el cliente telnet.. que es lo que busco..

Estoy por comprar el shield de arduino y olvidarme del 28j60

La verdad que el ENC28J60 es un poco dolor de cabeza

gracias chiva, cuando tenga el otro shield si consigo lo que quiero lo colocare aquí, para que todos dispongamos de la información. con el 28j60 le daré otra utilidad.

Un salu2 y gracias a todos...

bueno después de la espera ya tengo el nuevo shield ethernet basado en w5100.
Os comento mas o menos lo que he echo.
una vez conectado y configurado, cargo el sketch de telnet client. y este es el resultado que me da

me salen caracteres raros y supuesta-mente me deberia de pedir el usuario y la clave.. ¿no?

bueno os subo unas fotos para que veáis como me conecto al mikrotik con telnet.

abro el telnet de windows desde cmd.

Despues introduzco usuario = admin

Despues introduzco la clave = (pulso intro por que no tiene)

y por ultimo le paso parámetros para configurarlo.

bueno os dejo el código de arduino pero es el mismo que el que trae las libreria..

/*
  Telnet client
 
 This sketch connects to a a telnet server (http://www.google.com)
 using an Arduino Wiznet Ethernet shield.  You'll need a telnet server 
 to test this with.
 Processing's ChatServer example (part of the network library) works well, 
 running on port 10002. It can be found as part of the examples
 in the Processing application, available at 
 http://processing.org/
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 14 Sep 2010
 by Tom Igoe
 
 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 
  192,168,0,2 };

// Enter the IP address of the server you're connecting to:
byte server[] = { 
  192,168,0,1 }; 

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 23 is default for telnet;
// if you're using Processing's ChatServer, use  port 10002):
Client client(server, 23);

void setup() {
  // start the Ethernet connection:
  Ethernet.begin(mac, ip);
  // start the serial library:
  Serial.begin(9600);
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect()) {
    Serial.println("connected");
  } 
  else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // as long as there are bytes in the serial queue,
  // read them and send them out the socket if it's open:
  while (Serial.available() > 0) {
    char inChar = Serial.read();
    if (client.connected()) {
      client.print(inChar); 
    }
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    // do nothing:
    while(true);
  }
}

Espero que este todo claro y que si se os ocurre el porque me ayudéis...

serialarduino.jpg

Cuando haces client.read(), mándalo por serial con Serial.write(c), y lo mismo con client.print,() estás leyendo bytes.

aero_yo, he echo lo que me dices pero no hace nada. sigue igual.

También he cambiado el valor de la variable c, y le he puesto en byte. pero nada de nada.. alguna idea???

¿nadie se ha conectado por telnet con estas tarjetas????

hola amigos, estoy buscando información y me he encontrado unas API de mikrotik en c para conectarse a el y pasarles los comandos.
la cuestión es como se le agrega esto al arduino??? alguien ha echo algo parecido??? o conoce algún método para este tipo de conversión.

os pongo el enlace para que veáis el código en c

http://wiki.mikrotik.com/wiki/API_in_C

También existen API para otros lenguajes como c++, c# , php etc.... si alguien sabe como agregar alguno de estos códigos al arduino , porfavor ayuden me...

Me voy contestando.

¿Puedo programar Arduino en C?
De hecho, ya lo estás haciendo; el lenguaje de Arduino es meramente un grupo de funciones C/C++ que pueden ser llamadas desde tu código. Tu sketch pasa por cambios menores (generación automática de prototipos, etc.) y luego es enviado directamente al compilador C/C++ (avr-g++). Todas las construcciones C y C++ soportadas por avr-g++ debiesen funcionar con Arduino. Para más detalles, consulta la página sobre [Hacking/BuildProcess | el proceso de construcción de Arduino]].

También existe una API para C++ aquí os dejo el enlace.

http://wiki.mikrotik.com/wiki/API_In_CPP

Estoy desesperadisimo,, lo estoy intentando hacer insertando las api de mikrotik, pero me peta por todos lados, me pide librerias y no las encuentro, ¿¿todas las librerias de c se pueden añadir al arduino?????

No, cualquier librería de c no es directamente transferible a arduino. Mirate en el playground algún ejemplo sobre la creación de una librería, hay uno sobre código morse muy sencillo e ilustrativo, quizá te sirva.

por otros foros me han dado una pista sobre lo que puede pasar, me han comentado que si veo caracteres raros es por el tema de la velocidad del puerto, lo he probado con todas la velocidades aguantadas por el monitor serial de arduino, desde 4600 -115200 y nada, todo sigue igual.

Alguien tiene alguna pista mas....

Es grato encontrar personas con la misma idea que tengo y con los mismos problemas, encontré que los caracteres raros son debido a la negociación inicial que hace el protocolo telnet y encontré un ejemplo que debería funcionar pero con el mikrotik no me funciono mi correo es dryber@hotmail.com y si quieres te puedo enviar el archivo por que no se como pegarlo aca en el foro