API MIKROTIK Segunda parte – Usando el API con PHP

En la primera parte, explicamos cual podría ser su uso y para que sirve.
Ahora vamos a explicar como se configura el API en pocos pasos, con un poco de PHP y usando las clases creadas por Denis Basta. (version 1.3 o 1.4), con apenas un minimo cambio hecho para que la clase «connect» permita pasar ademas el numero de puerto del RouterOS como parametro.

Yo estoy familiarizado con programar en PHP pero para el que no, pueden hacerlo con el lenguaje que desee. En la Wiki de Mikrotik podran encontrar ejemplos para:

Paso 1: Configura tu RouterOS

a) Habilitar el servicio API.
desde IP > Services. Seleccionas la fila que dice «api» y la habilitas, luego doble click sobre ella para editar. Puedes asignarle el puerto que quieras, pero por defecto usa el 8728 tcp. Si te gusta tener todo ecualizado podrías agregarlo en los mangles para darle QoS. Finalmente donde dice «Avaliable From» es la direccion IP desde donde estara el API corriendo. En nuestro caso, como usaremos PHP puede ser el servidor Apache.  (sigue los pasos de la imagen).
ip-services-api

 

b) Crear un grupo
Para darle seguridad necesitamos crear un usuario y un grupo nuevo dentro del RouterOS donde queremos ordenar nuestras tareas diarias. Para ello vamos a «System > Users > Groups» y presionamos en el icono «+». En esta ventana simplemente escribimos el nombre del grupo, (para este ejemplo yo le puse «tugrupoapi») y elegi las politicas «read, write, api». Damos click en OK
user_api_group

c) Crear un usuario
Luego de crear el Grupo, nos movemos a la pestaña Users como esta en la imagen a continuacion. Presionamos el icono «+» para crear un usuario nuevo.
Name: aqui escribiremos nuestro nuevo nombre de usuario: Ejemplo blog.tech-nico.com, (puedes crear el tuyo).
Group: elegimos el grupo «tugrupoapi» (ver el punto «b»),
Address allowed:  Es la IP que tiene permitido acceder a nuestro RouterOS a través del API. «El apache server en nuestro caso»,
Password: tipeamos nuestro password, asegurate que sea fuerte.
Finalmente click en el boton «OK».

user_api_user_add

Paso 2: Crear un script para testear el acceso: conectar_test_api.php

<?php require_once(‘api_mt_include2.php’); ?>
<?php
$ipRouteros=»200.20.30.40″; // tu RouterOS.
$Username=»blog.tech-nico.com»;
$Pass=»tupassword»;
$api_puerto=8728;

$API = new routeros_api();
$API->debug = false;
if ($API->connect($ipRouteros , $Username , $Pass, $api_puerto)) {
$API->write(«/system/ident/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$name = $ARRAY[0][«name»];
if(count($ARRAY)>0){ // si esta conectado
$API->write(«/system/licen/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$nlevel = $ARRAY[0][«nlevel»];
$API->write(«/system/reso/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$cpu = $ARRAY[0][«cpu»];
$cpu_frequency = $ARRAY[0][«cpu-frequency»];
$arquitectura = $ARRAY[0][«board-name»];
$API->write(«/system/pack/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$version = $ARRAY[0][«version»];

echo ‘<img src=»icon_led_green.png» />&nbsp;’;
echo «<strong>».$name.»(» .$arquitectura. «)</strong>&nbsp;&nbsp;»;
echo «v:» . $version. «&nbsp;&nbsp;»;
echo «level:» . $nlevel . «&nbsp;&nbsp;»;
echo $cpu.»(«.$cpu_frequency.» Mhz.)»;
}else{ //el usuario esta of line
echo ‘<img src=»icon_led_grey.png» />&nbsp;’.$ARRAY[‘!trap’][0][‘message’];
}

}else{
echo «<font color=’#ff0000′>La conexion ha fallado. Verifique si el Api esta activo.</font>»;
}
$API->disconnect();
?>

Paso 3: Editamos las lineas que dicen:

$ipRouteros=»200.20.30.40″; // tu RouterOS.
$Username=»blog.tech-nico.com»;
$Pass=»tupassword»
$api_puerto=8728;

Paso 4: Finalmente subimos por FTP los archivos a nuestro servidor Web y ejecutamos en el navegador el archivo conectar_test_api.php;
test_php_navegador
Si todo salio bien, vamos a ver una pantalla parecida a la de arriba. Lo que hicimos fue loguearnos mediante el API a nuestro servidor, y luego traer el nombre «Identity», la plataforma, la version del ROS, que licencia tiene instalada, etc.

Descarga aqui todos los archivos de este ejemplo.

Como veran, este seria el primer paso para comenzar a programar tus scripts. Ya teniendo esto funcionando vamos a poder realizar varios ejemplos que voy ir posteando en mi tiempo libre.

Cualquier cosa comenten que les respondo enseguida.

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

API MIKROTIK – Crear queues simples con PHP (con validacion)

_______________
Nicolas tech-nico.com/blog

123 Comentarios

  1. Excelente amigo, espero con ancias los siguientes aportes que pudieras postear, por lo general uso mi iPhone (con una app llamada tiktool) para activar mis clientes y asi no encender el laptop, pero en esta app los comentarios de las ip-binding no se muestran y asi es q identifico mis clientes, mi modalidad es:
    -Hotspot + amarre de mac del nanostation.
    -DHCP de la mac del computador del cliente.
    -Activo/Desactivo mis clientes activando o desactivando el ip-binding del cliente en cuestion.
    -No uso login, en lugar de el login lo edite para que mostrara la pagina de suspencion del servicio. Porque si esta desactivado el ip-binding del cliente lo pasa de una vez a la pagina de login.

    Gracias espero tomes en cuenta esta modalidad a ver si comienzas aportando ideas en este tema.

  2. Nemox, muy bueno lo tuyo; estuve instalando el hotspot en un router que uso en el laboratorio y voy a comenzar a hacer algun ejemplo con lo tuyo. Asi que alegrate porque el proximo tutorial va dedicado a tu modalidad. Un saludo.

  3. Hola amigo muy bueno tu aporte sobre todo muy gentil de tu parte. Como puedo hacer un control para mis clientes. Lo tengo de desta manera hotspot y dhcp . No amarro ips ni nada solo el login me gustaria hacer lo siguiente administrar los clientes agregar eliminar clientes y user profiles activar y desactivar al momento de capturar su pago. Espero haberme explicado saludos cordiales desde campeche mexico

  4. Intente e intente mil veces y no me funciono para desabilitar un usuario
    pero nada de nada
    $ipRouteros=»192.168.1.1″; // tu RouterOS.
    $Username=»api»;
    $Pass=»api»;
    $api_puerto=8728;
    $API = new routeros_api();
    $API->debug = false;
    $API->connect($ipRouteros , $Username , $Pass, $api_puerto);
    $API->write(«ip/hotspot/user/set/disable»,false);

    de aqui en adelante probe las dos siguientes opciones:
    $API->write(«=name=admin»,true);
    $READ = $API->read(false);
    $API->parse_response($READ);
    print_r ($API);

    Tambien probe
    $API->write(«=.id=».$id,true);
    $READ = $API->read(false);
    $API->parse_response($READ);
    print_r ($API);
    Y solo me muestra en el log del mikroitk el inicio de sesion y el cierre mas no ejecuta ninguna accion
    Agradeceria tu ayuda ya que lo que estoy haciendo es un programa que se auxilia con la base de datos para que en la fecha de corte lo corte automaticamente sin mi ayuda muchas gracias de antemano

  5. saludos amigo eh intentado varias veces y nada no activo el Api tengo mikrotik 5.20 siempre me dice

    La conexion ha fallado. Verifique si el Api esta activo.
    Warning: fclose() expects parameter 1 to be resource, boolean given in /home/soportem/public_html/test api/api_mt_include2.php on line 121
    espero que me heches una manito

  6. Manuel, al parecer el error que te arroja es de un comando que yo no escribi. Fijate que el error te esta diciendo que en la linea 121 tenes un problema con el fclose() ese comando sirve para cerrar un archivo de texto por ejemplo. No se que estas queriendo hacer pero ese comando no estaba entre mi codigo. Saludos.

  7. saludos consegi un codigo en wifi mikrotik y haora me dices esto…..
    Connection attempt #1 to 200.20.30.40:8728… Connection attempt #2 to 200.20.30.40:8728… Connection attempt #3 to 200.20.30.40:8728… Connection attempt #4 to 200.20.30.40:8728… Connection attempt #5 to 200.20.30.40:8728… Error…
    que podria ser tengo bloqueado el puerto 8728 o q ? y si es asi como lo desbloqueo

  8. Manuel, la IP: 200.20.30.40 la puse como ejemplo, y de hecho no existe.. la invente para el post.
    Por favor, volve a leer y mas precisamente en el paso 3 te explica que tenes que modificar los datos para poder conectar con tu routerOS. dale?

  9. Hola tambien me sale ese error, no modifique nada en el codigo de la api esta tal cual lo descargue de tu web, sin embargo me aparece en el siguiente caso de ir de una pagina a otra, en resumen lo que tengo es: index.php menu.php info.php, cuando en el index.php logueo el router entra bien a menu.php, de ahi voy a info.php y sigue bien, pero cuando vuelvo a menu.php me sale ese error=Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/api/api_mt_include2.php on line 121

  10. /**
    * Disconnect from RouterOS
    *
    * @return void
    */
    function disconnect()
    {
    fclose($this->socket);
    $this->connected = false;
    $this->debug(‘Disconnected…’);
    }
    AHI ESTA FCLOSE

  11. saludos amigo nada Connection attempt #1 to 192.168.1.83:8728… Connection attempt #2 to 192.168.1.83:8728… Connection attempt #3 to 192.168.1.83:8728… Connection attempt #4 to 192.168.1.83:8728… Connection attempt #5 to 192.168.1.83:8728… Error… tengo la versiones mikrotik 3.30 instale la 5.20 y nada no es la versiones entonces que cual es el truco

  12. Manuel, Conection attempt lo pone cuando no esta pudiendo entrar al servidor por esa IP y Puerto que le diste por varias razones:

    • 1) IP o Puerto incorrecto (tenes ping desde donde probas el PHP hasta el IP del RouterOS?)
    • 2) RouterOS: API no Habilitado o en otro puerto.
    • 3) RouterOS: API configurada con IP de acceso.
    • 4) En el firewall no estas dejando entrar las conecciones al puerto 8728
    • 5) No tenes creado el usuario con permiso API, read, write.

    Nico

  13. Gracias Por tu aporte. tengo un problema . cuando quiero crear el grupo, no encuentro la opcion api, en la lista. termina en snif y sensitive… utilizo rb 433 con winbox v.4.11.
    Trato de correr el test, pero no me devuelve nada de nada. instale apache2 y php5. No se si se deba a eso el error.

    Saludos
    Enrique

  14. Hola Enrique, si mal no recuerdo, en la version 4.11 funciona igual. Aunque la opcion API no aparece en grupo, igualmente te deberia funcionar sin problemas. cambia la linea.

    $API->debug = false;
    

    por

    $API->debug = true;
    

    y te fijas que error arroja.!!
    Luego tambien mira el log de tu RouterOS para ver si esta intentado acceder.

    Un gran saludo.
    Nico!

  15. Hola estoy desarrollando una web para controlar el router ya logre hacer las conexiones sin problema insertar y eliminar usuarios y perfiles de hostpot tengo una duda muy particular espero me pueda ayuda…
    de que manera mediante una pagina se puede enviar el usuario y password de hotspot al router y que me lo auntentifique para evitar que el usuario final no ingrese … ya intente modificar las paginas html del router pero no logro poder hacerlo … saludos…

  16. Tengo un routeador mikrotik mediante la API de .net desarrolle una pagina para crear usuarios dinamicamente haciendo una validacion previa en una base de datos como parte de una regla de negocio. una vez hecha la validacion escribo en el mikrotik el usuario y password mediante la API la dudo es como envio estas credenciales nuevas al hotspot de mikrotik … lo intente mediante las html que estan en el ftp pero no me funciona no se si exista una manera de hacerlo mediante la api tambien o algo asi … saludos

  17. Hola!
    Muchas gracias por el aporte! resulta muy util y no hay mucho en la web en español!
    Tengo una consulta yo lo estoy realizando desde xampp la prueba asique como servidor apache puse «127.0.0.1» y lluego la pc tiene la ip 192.168.1.10 y el mk 192.168.1.1 colocando en el script la ip del mk y en el mk las ips de apache local no me funciona me da error 404. Si alguien tiene idea como se hace en xampp agradesco mucho sus aportes!
    Gracias de antemano!

  18. Laura, me alegra que te sirva. Error 404 significa «pagina no encontrada». Revisa la URL, aparentemente, no existe o bien esta mal escrita. Lo he probado con xampp y funciona perfecto. Levanta el apache?. Saludos.

  19. Me arroja el mismo error que a Juan(13/09/2013) FClose, he activado todo como comentas, y me devuelve este error:

    «[21-Jan-2014 16:33:03 UTC] PHP Warning: fclose() expects parameter 1 to be resource, boolean given in /home/sistma/public_html/apimt/api_mt_include2.php on line 121»

    Alguna idea?

    Gracias por los aportes

  20. que tal soy novato en php y he probado la api con tu codigo…por favor podrias decirme en que estoy mal…. me sale una lista de errores:::Notice: Undefined variable: _ in C:\wamp\www\test_api\api_mt_include2.php on line 296

    Notice: Undefined offset: 0 in C:\wamp\www\test_api\api_mt_include2.php on line 88

    Notice: Undefined variable: _ in C:\wamp\www\test_api\api_mt_include2.php on line 296

    Notice: Undefined offset: 0 in C:\wamp\www\test_api\api_mt_include2.php on line 88

    Notice: Undefined variable: _ in C:\wamp\www\test_api\api_mt_include2.php on line 296

    Notice: Undefined offset: 0 in C:\wamp\www\test_api\api_mt_include2.php on line 88

    Notice: Undefined variable: _ in C:\wamp\www\test_api\api_mt_include2.php on line 296

    Notice: Undefined offset: 0 in C:\wamp\www\test_api\api_mt_include2.php on line 88

    Notice: Undefined variable: _ in C:\wamp\www\test_api\api_mt_include2.php on line 296

    Notice: Undefined offset: 0 in C:\wamp\www\test_api\api_mt_include2.php on line 88
    La conexion ha fallado. Verifique si el Api esta activo.
    Warning: fclose(): 7 is not a valid stream resource in C:\wamp\www\test_api\api_mt_include2.php on line 121

  21. Lenin, has modificado algo del ejemplo que descargaste?. El codigo esta en pleno funcionamiento.
    Definiste bien las variables de Usuario, Contraseña…. etc?.

  22. estoy tratando de hacer funcional este codigo pero no he podido…no tengo experiencia ni con apache ni con php…instale el wanpserver pero no se cual es la ip del apache para ponersela en el mikrotik..lo demas creo lo poder entender…espero alguin pueda darme una pista desde cero….por sus respuestas gracias…

  23. Lenin, Cuando instalas WampServer la IP que se usa en su propia maquina es la del localhost: 127.0.0.1. (pero esa solo la vas a usar para probar tu aplicacion en el navegador). En este caso, hay que ver donde esta ubicado tu RouterOS, si estan en la misma subnet o si tu RouterOS esta en el lado WAN de tu red, entonces la IP de acceso es la IP que te asigna el ISP para navegar en internet. Ahora bien, podrias NO PONER LA IP, y te va a funcionar perfecto, PERO SIN SEGURIDAD SOBRE EL USUARIO.

  24. ya funciona perfecto…
    ahora voy a probar algunos codigos que pone a disposicion y a tratar de adecuarlo a mi router…gracias excelente ayuda…

  25. Hola, quisiera que me ayudaras, tengo un pequeño inconveniente. Ya hice lo del sitio, me funciona muy bien de forma local, ahora lo he subido en un servidor aparte, el Mikrotik tiene una IP pública para el puerto WAN, pero me aparece este error «La conexion ha fallado. Verifique si el Api esta activo.» Estoy seguro que debe ser algún problema del firewall pero no se como resolverlo, creo que está bloqueado el acceso al puerto WAN.

  26. Hola, le pusiste Direccion IP a Services – API ?. Al usuario que accede al API tambien le pusiste IP?.
    Si es asi… quitalas… y prueba de nuevo. Verifica que el puerto del API sea el mismo que esta configurado en ambos lados.. PHP y ROUTEROS. Y tambien verifica que el puerto este abierto en el ROUTEROS.
    Saludos. Nicolas.

  27. Si, en IP-Firewall agregas la siguiente regla:

    Chain: input
    Protocol: tcp
    Dst-port: NROpuertoAPI
    Action: accept

    Y luego arrastras la regla hasta el inicio del firewall.

  28. Hola nuevamente he tratado de resolver el problema que tengo con la conexión entre mi sitio y routeros, hice que me mostrara los mensajes de error y obtengo esto.

    Connection attempt #1 to 190.152.76.254:8728… – – –
    Connection attempt #2 to 190.152.76.254:8728… – – 110 – Connection timed out
    Connection attempt #3 to 190.152.76.254:8728… – – 110 – Connection timed out
    Connection attempt #4 to 190.152.76.254:8728… – – 110 – Connection timed out
    Connection attempt #5 to 190.152.76.254:8728… – – 110 – Connection timed out

    Lo que comprendo de este mensaje es que la conexión al servidor es muy lenta.
    Alguien me podría ayudar con esto por favor, alguna sugerencia.

  29. El RouterOS esta accesible al menos el puerto me da abierto. Donde tenes alojados los archivos? en un hosting?. Espero que no esten cerrando las peticiones salientes desde el hosting. Puedo ver el codigo que estas usando?.. pasalo al formulario de contacto. Slds.

  30. Los tengo alojados en un hosting, El código es el mismo que publicaste solo he cambiado los datos de conexión. Otra cosa, de forma local si funciona perfectamente el código, cuando lo subo al hosting me da ese problema.
    También he modificado estas dos variables en el API que publicaste pero sigue sin funcionar.
    var $delay = 10; // Delay between connection attempts in seconds
    var $timeout = 10; // Connection attempt timeout and data read timeout

  31. Stalin, las variables no las tenes que modificar. Si no conecta es porque no esta saliendo del hosting. Revisa en el log del RouterOS si te tira algun error. Si no.. creo que no esta saliendo la peticion desde el hosting como si estarian filtrando el trafico saliente hacia el puerto del API.
    Tenes la posibilidad de subirlo a otro hosting para testear?. Slds

  32. Bueno yo las modifiqué porque creí que el tiempo de espera era muy corto considerando que el error es por la espera y a su vez por el ancho de banda, pero voy a hacer lo que me sugieres y subir el sitio a otro hosting.

  33. Amigo disculpa, ando buscando una solución, pensé que el balanceo de carga mejorado a través de múltiples gateway me iba a ayudar pero no me resulta, El problema que quiero solucionar es que tengo dos lineas de Internet a un RB, pero cuando desconecto la wan 1 que es la principal y wan 2sigue conectada que es la segundaría, se me va el Internet a todos los usuarios conectados. Ayuda …

  34. Walter, Eso significa que esta mal configurado. Este post no tiene mucho que ver con el tema, pero te aconsejo que busques en la wiki y otros foros donde hay bastante documentacion y tutoriales paso a paso de como hacerlo de diferentes maneras. En principio, tu problema puede estar en la parte de routeo.
    Saludos.

  35. Gracias por una pronta respuesta, estoy usando mi no-ip pero me dice que fallo la conexion «La conexion ha fallado. Verifique si el Api esta activo.» creo que el problema ya seria porque uso un host free lo cual bloquea algo, un amigo que posteo su problema igual al mio lo soluciono creo que cambiando de hosting, ya voy probando con 3 hosting free y todos me salen el mismo mensaje, es necesario crear el grupo para el API y el user ahhh me olvidaba es necesario asociar una ip para el puerto del api 8728 ?

  36. Hola amigo, tengo una duda.

    Mi mikrotik está conectado después de mi modem (donde tengo una antena ubiquiti airgrid que me lleva el internet a otra antena airgrid) entonces, la ip que le asigné a mi mikrotik es 192.168.88.1, la pregunta es ¿Debo poner esa ip en el archivo de configuración? ¿Como averiguo que ip debo poner o de que manera tengo que configurar mi mikrotik para que me lo reconozca?, ya seguí tu tutorial al pie de la letra y me sale la leyenda:

    «La conexion ha fallado. Verifique si el Api esta activo.
    Warning: fclose() expects parameter 1 to be resource, boolean given in /home/content/75/4816275/html/zonawifi/web/api_mt_include2.php on line 121»

    ¿Qué debo hacer?, agradezco tu ayuda.
    Saludos desde México 🙂

  37. Hola Adriana, desconozco la topologia de tu red, pero supongo que si vas a acceder desde afuera de tu red, el API del routeros (donde estas queriendo acceder) deberia recibir la direccion del apache. Mas bien la direccion IP publica de tu apache.
    Si no sabes cual es la direccion… o tenes una topologia distinta a la que imagine, podes probar conectar sin ninguna IP. Pero solo para testear si ingresa. Dejarlo sin IP es un horrible problema de seguridad. Saludos. Mira el log para ver si arroja algun error y ademas… podes setear debug a true para debugear errores y ver que sucede. Saludos.

  38. Hola amigo.

    Te comento como tengo mi red.

    Recibo el internet de un modem Arris (no sé si tenga que abrir algún puerto o algo en especial), al modem está conectada una antena airgrid que me lleva el internet a otra rejilla, luego de ahí tomo el internet y lo paso al mikrotik.

    Mi modem tiene la ip 192.168.0.1
    La primer antena 192.168.1.20
    La antena que recibe 192.168.1.21
    Mi mikrotik tiene la ip 192.168.88.1 (y entrega direcciones en DHCP bajo ese mismo rango).

    Ya intenté quitar la ip y me sigue arrojando el mismo problema, alojé mi archivo en un servidor compartido que tengo rentado en Godaddy.com, intenté desde otro que tengo y en ambos me manda el mismo error.

    Ya probé cambiando de puerto y tampoco llego a nada, espero me puedas echar una mano, estoy vuelta loca desde la mañana, gracias por la respuesta, no la vi hasta ahorita que le di en «ver comentarios recientes», un abrazo a la distancia. 🙂

  39. He puesto el debugger en True y me manda esto:

    Connection attempt #1 to 192.168.88.1:4370… Connection attempt #2 to 192.168.88.1:4370… Connection attempt #3 to 192.168.88.1:4370… Connection attempt #4 to 192.168.88.1:4370… Connection attempt #5 to 192.168.88.1:4370… Error… La conexion ha fallado. Verifique si el Api esta activo.
    Warning: fclose() expects parameter 1 to be resource, boolean given in /home/content/75/4816275/html/zonawifi/web/api_mt_include2.php on line 121
    Disconnected…

    Al parecer no hay comunicación entre el mikrotik y mi servidor :'(

  40. Adriana, Creo que estas intentando acceder desde un Hosting publico a una Ip privada que esta dentro de tu red. Si el Modem Harris tambien hace de router.. seguro esta asignando una direccion PUBLICA. Tenes que entrar al panel de administracion y chequearlo. Esa direccion es la que tenes que usar en el PHP. Ademas, si la direccion es dinamica, vas a tener que utilizar Dyn-DNS, o Duckdns, etc porque si no cuando cambie de IP el router, Te dejara de funcionar el script php. Por ultimo, desde el router Arris hasta el mikrotik.. tenes que tener ping. Si el Mikrotik tiene la IP 192.168.88.1, el Arris la tiene que poder «ver».
    IMPORTANTE:
    Si podes administrar la configuracion del Arris, tenes que hacer un port-Forwarding (reenvio de puertos o dst-nat) desde el port 8728 a la ip 192.168.88.1. Esta es la parte mas importante. Si no el servidor donde tenes alojado el sitio web, no va a llegar nunca a tu mikrotik «que esta dentro de una red lan privada».
    Saludos

  41. Adriana, el puerto esta mal. Es 8728 y dentro del mikrotik tenes que tener configurado el mismo dentro de IP-Services-API. Y fijate mi respuessta anterior porque te esta faltando hacer un port-forwarding en el modem/router Arris

  42. Eso justamente estaba pensando, de hecho intenté en mi modem Arris crear un servidor virtual, pero no me acepta la dirección de mi mikrotik, me dice que está fuera de rango, también donde dice «Port Triggers» abrí el puerto, de hecho ya probé con el puerto que pusiste, sólo que estuve probando con varios por eso es que sale esa ip diferente.

    Si me parece que el problema está en mi modem/router, pero la verdad no tengo idea de como hacer para que me deje el paso libre a lo que necesito hacer, estoy vuelta loca. 🙁

  43. Encontré en mi modem lo siguiente:

    DDNS
    DDNS (Dynamic DNS) allows you to provide Internet users with a fixed domain name (instead of an IP address which may periodically change), allowing your router and applications set up in your router’s virtual servers to be accessed from various locations on the Internet without knowing your current IP address. You must create an account with the DDNS service in order to use DDNS.
    DDNS Setting
    DDNS Enable
    DDNS Service
    User Name
    Password Key
    Domain Name

    Creo que ahí podría volverlo público y luego proseguir con lo otro, cierto?

  44. Hola me parece interesante este desarrollo, me podrian ayudar desarrollando un aplicativo para el uso en mi empresa?

  45. Hola Eduardo, Si, si no es demasiado complicado te podríamos dar una mano y si te parece bien, publicarlo en el blog para que los demás puedan descargarlo. De que se trata?. Saludos

  46. Buenos dias, soy nuevo en PHP y no se donde se puede copiar todos los archivos descargados para ver si tengo conexion desde mi servidor de apache con php hacia el MKT , me pueden especificar la ruta completa (path completo); en donde van cada archivo.
    Gracias de antemano

  47. Necesito ayuda con su ejemplo! no se donde se debe poner los archivos de configuración soy novato en php y apache; ya los tengo instalados. Para la prueba de APi con el servidor de apache , tengo conectado un mikrotik directamente conectado a la PC en una red 10.0.0.0/24. Pero me aparece que el Api no esta Activo. y e seguido todos sus pasos anteriormente mencionados. QUE DEBERIA HACER?

  48. Mauricio, yo no estoy enseñando nada de PHP y Apache.. mira, para hacerla mas facil.. instala el WAMP (Apache Mysql PHP) en tu windows y luego busca un tutorial en youtube. slds

  49. Javier, yo no estoy enseñando nada de PHP y Apache.. mira, para hacerla mas facil.. instala el WAMP (Apache Mysql PHP) en tu windows y luego busca un tutorial en youtube.

  50. buenas tardes amigo, primero lo felicito por su gran aporte, que de gran ayuda para las personas como nosotros que somos novato en el tema de MKT, y que deseamos aprender algo mas sobre ellas. Estoy trabajando sobre el desarrollo de esta aplicación para la empresa donde trabajo, y me pidieron una interfaz como la que muestras al principio, donde todo o su gran mayoría pueda ser maneja do por hay donde hasta secretaria lo pueda hacer. Soy ing. de Sistemas y he trabajado con php, y mi servidor local es WAMP, ahora mi pregunta y disculpa todos los archivos lo alojo en la carpeta WWW del WAMP, y este servidor local (WAMP) lo instalo en cualquier pc que este conectado a la red o simplemente por la dirección ip del MKT se conecta y realiza su trabajo desde cualquier pc que este dentro de la red.

    De antemanos muchas gracias y espero gran ayuda y asi también poder ayudar a alguien mas sobre este tema.

  51. Enrique, Asi es!!. Tu razonamiento es correcto. El WAMP lo usas en cualquier PC y tiene que conectarse sin problemas al Mikrotik (IP Publica) y con el API habilitado.. y por supuesto usuario y contraseña con permisos para read write y API. Y tambien te funcionaria subiendolo a un shared hosting. Saludos.

  52. buenas noche amigo estoy realizando una prueba con tu codigo y al correr el script me aaroja esta advertencia «Warning: fclose(): 7 is not a valid stream resource in C:\wamp\www\prueba\api_mt_include2.php on line 121» si me podrias ayudar o alguno que sepa sobre esta advertancia, muchas gracias…

  53. buenos días amigo como estas, disculpa estoy desarrollando el software y me ha ido funcionando, sera que tu me podrías ir orientando en algunas dudas, estoy por ingresar un nuevo usuario hotspot user add pero no me da el código para conectarme al mikrotik, crees que podrías ayudarme, muchas gracia…

  54. hermano debo de hacerle algunos ajustes al archivo API.php, la pregunta es porque e tratado de mostrar por pantalla en mi tabla los datos de «ip/hotspot/users» y me muestra solo errores, necesito su ayuda si podría o si tiene algún script ya funcionando me lo podrías facilitar al correo para irme guiando por ese, es que ya no se que hacer de verdad, muchas gracias

  55. buena tardes amigo disculpa podrías ayudarme a como insertar un nuevo usuario ya logre comunicarme al mikrotik a través de API gracias a su ayuda en este blog, pero estoy tratando de crear un nuevo usuario y pues en realidad se me ha complicado, o si alguno del foro me podría ayudar, este es mi correo eriking125@gmail.com..
    Gracias de antemanos

  56. Enrique, hay un ejemplo de como agregar un usuario por hotspot. si miras el codigo.. cambiando pocas cosas podes hacer lo mismo con PPPoE.
    Saludos.

  57. gracias hermano voy a revisar detenidamente y al tenerlo listo lo publico para que sirva de ayuda a alguien mas; y disculpa amigo se puedo conectar con una base de datos, es para que me muestre los datos adicionales junto con los del mikrotik o si algún miembro del blog lo a realizado me podrían ayudar mi correo es eriking125@gmail.com

  58. Estoy intentando hacer esta conexion y me sale esto me podrías ayudar??

    Connection attemp #1 todo 192.168.42.1:8728… <<<[6]/login
    NOTICE: Undefined variable: _ un C:\ xampp\htdocs\testapi\api_mt_include2.php con línea 286
    NOTICE: undefined offset:0 unC:\ xampp\htdocs\testapi\api_mt_include2.php con línea 88. Me podrías ayudar no se que hacer

  59. buenas compañero,

    lo primero felicitarte por el blog, una pasada!, estoy mirando la solución del api de mkt y quiero realizar un proceso y como veo que tienes bastante experiencia te quería consultar si crees que es viable antes de ponerme con el, el tema es que tengo una red con 1 mikrotik como hotspot y XX ap nanostation, hay todo perfecto el tema viene cuando quiero conocer la potencia de señal que tienen los clientes del ap, para esto ejecuto un comando por ssh desde un servidor y recojo la información a un archivo de texto el cual después importo, el tema es que esta peticion ssh al AP me gustaria realizarla desde el mkt, el problema es que no quiero tener que importar y exportar claves ssh por lo que cuando realizo la conexión me pide la contraseña. Desde el servidor tengo un script en bat que introduzco la contraseña, el tema es mirar de hacer esto via api. Seria realizar la conexión ssh para ejecutar el comando, y lo mas importante saber si con el api cuando el equipo me solicite la contraseña yo se la puedo enviar realizando algun tipo de «type» o «write» sobre la consola con la variable del password para despues poder recoger la info.
    Gracias y felicidades por el blog!!

  60. Hola Indio, en principio me alegra que te sirvan mis artículos. Con respecto a tus dudas, lo veo muy complicado a lo que queres realizar, quizas con un script de mikrotik se pueda realizar pero yo no se como hacerlo. El API de mikrotik puede ingresar a un Mikrotik a leer informacion pero no a un Ubiquiti. Y por lo que lei vos estas ingresando a un Nanostation. Verdad?. En todo caso lo que te convendria hacer es, desde PHP ingresar directamente al Ubiquiti, algo como lo que hacen aca. http://community.ubnt.com/t5/airOS-Software-Configuration/Integrating-PHP-ubiquiti-AirOS/td-p/476269. Saludos.

  61. Hola Nico, mi nombre, veo que manejas muy bien el tema y te quería consultar por algo que necesito hacer y no se ni por donde empezar, tengo una rb450g, con una red con hotspot cuya única finalidad es entregar internet gratis a la gente, para esto habilite el un perfil tree o perfil libre por una cantidad de tiempo prudente aproximado de 2 horas, todo funciona perfecto pero necesito reunir estadísticas de cada una de las personas que se conectan, mi idea es que cada cliente que se conecte pueda entrar a una base de datos con la hora de la conexión y el día. así podre obtener datos reales de cuanta gente se conecta en cada punto y seguir replicando este proyecto, agradecería si me pudieras ayudar…

  62. Hola Edgardo, coméntame un poco, como te imaginas el formulario de ingreso?. Que datos ademas de la hora de ingreso quieres reunir? Saludos.

  63. Gracias por tu tiempo Nico, idealmente seria bueno que al acceder el cliente a internet saliera un mini formulario donde el cliente pudiera poner su nombre y correo electronico con el objetivo de fidelizar un poco este servicio gratuito, poder enviarle al cliente mail informativos de nuevos puntos gratis que se vayan habilitando en distinto sectores. seria algo así como un formulario con nombre y mail y que la base de dato contenga datos como el nombre, correo y hora y fecha en que se conecto…

    Nico no me gusta abusar de nadie y realmente se que es tiempo valioso el que inviertes en esto, si me pudieras ayudar en este proyecto novedoso para mi, podrías también decirme como te puedo ayudar yo a modo de devolverte la mano.

    Saludos.

  64. mi pregunta es si para editar el api y ir dessarrolando los codigos al que tener un servidor para ir alojando lo que se valla editandon saludos

  65. Jose, Si. Necesitas un servidor Apache que pueda ejecutar codigo PHP. Si tenes windows podes instalar WAMP. Si tenes MAC OSx podes instalar XAMP. Y si tenes linux podes instalar MAMP. Esto te instalaria Apache Mysql y PHP. Saludos

  66. Hola, he aprendido bastante con tu blog, pero tengo un inconvenente, en mi pc con Zend server, donde me ejecutan los scripts desde cualquier lugar por internet a mi mikrotik el cual tiene una ip publica, pero cuando los script los alojo en mi pagina web con hosting en godaddy o hostgator y nunca se conecta.

  67. Hola Hugo. Revisa en 2 lugares.
    1) en IP – Services, si en API le pusiste alguna direccion IP.
    2) en System – Users, si en el usuario que creaste con permisos read, write, api, le asignaste alguna direccion IP.

    Proba quitarlas y testea nuevamente. Luego, cuando sepas que funciona, podes poner la IP del hosting y volver a testear.
    Saludos desde Argentina.

  68. Hola que tal amigo he realizado la conexion correctamente pero lo que necesito hacer en el mk es desabilitar una ip en este caso los tengo como estatica, cuando quiero cortar el servicio de un cliente voy a /ip/addresses/ y me muestra la lista de todas las ip que tengo en mi mk uso subredes ejemplo 10.0.1.1/30, 10.0.2.1/30, 10.0.3.1/30 cuando voy a cortarle el servicio a un cliente lo que hago es seleccionar el numero de ip que le corresponde al cliente y seleccionar la opcion Disable

    Lo que quiero hacer tener mi lista de clientes en mi sistema echo en php y desde ahi cortar el servicio de acuerda a los dias que le halla asignado, ya he realizado correctamente la conexion pero no se como ni que metodos del archivo utilizar me gustaria que me orientaras o me ayudaras mi correo es joelrg10@gmail.com

  69. buenas eh estado probando desde hace unos dias tus tutoriales gracias de ante manos. me aroja este error

    Notice: Undefined variable: receiveddone in C:\xampp\htdocs\phpapimk\test api\api_mt_include2.php on line 301

    mi versión de mk os es la 6.33.3

  70. Hola.. tendrias que implementarlo usando address-lists y luego en el firewall aceptar el address list y otra regla por debajo que dropee todo el bloquee de ip. Asi tendrás seguridad en tu red. Con tu manera si el cliente se pone una direccion ip al azar, va a terminar navegando y/o generando conflicto de ip a otro cliente que piede quedar sin servicio.

  71. Qué tal, tengo varios servidores pero en el que estoy tratando de poner los scripts (uno de hostgator) no se contecta y en otros servidores sí…cuál podría ser el problema? Saludos.

  72. Puede qie hostgator tenga un firewall que no permita la conexion saliente al puerto que usa el api. Cambiale el puerto por algun otro. Proba con 81… 8080. Nunca me paso, pero yo imtentaria eso.

  73. Yo lo tengo corriendo en hosting compartido y va bien. Pone el debug en true para ver cual es el error. Tambien proba cambiando el puerto del api por otro.

  74. Para ejecutar la API desde un hosting, hay que poner la ip publica???

    $ipRouteros=$IP_PUBLICA; // tu RouterOS.
    $Username=»apiuser»;
    $Pass=»123456″;
    $api_puerto=8728;
    $API = new routeros_api();
    $API->debug = false;

    puse la ip del hosting en la configuración del api para permitirle acceso, y nada

  75. el debug a true me da esto

    Connection attempt #1 to :8728…
    Connection attempt #2 to :8728…
    Connection attempt #3 to :8728…
    Connection attempt #4 to :8728…
    Connection attempt #5 to :8728.

  76. Es logico, tenes que tener una Ip Publica!! El equipo mikrotik al que queres acceder tiene una IP Publica puesta en la interfaz WAN?. Si podes navegar en internet a travez de el entra en cualesmiip.com y revisa que esa sea la direccion IP que estas usando en tu configuracion del API. Saludos.

  77. estaba haciendo un telnet a mi hosting para ver si el puerto 8728 esta abierto, y resulta que esta cerrado, tengo q tener este puerto abierto????

    Sorry, Soy nuevo en este mundo de mikrotik, solo llevo una semana

  78. mmm NO.. porque no te interesa que ese puerto este abierto en el servidor. Ese puerto es el que tiene que tener abierto tu Router (el que tiene el API activado). Imaginate lo siguiente: El servidor de hosting esta en la nube y este ultimo, ejecuta el codigo PHP que descargas de tech-nico.com el cual tiene que poder llegar a tu router a consultar o ejecutar comandos. Para que comprendas que tambien podria ser que tu hosting tenga cerrado el puerto de salida 8728 (Output). Mira, para sacarte la duda, podes probar el mismo codigo en tu localhost. Y ademas tenes como segunda opcion, modificar tanto en el PHP como en tu Router el numero de puerto por el que vos quieras. Uno que no genere confusion para tu hosting o tu router. (Ejemplo el 3128: web-proxy; o el 81, 8080, etc) proba con puertos mas comunes que puedan estar abiertos.

  79. Gerardo: Eso se lo vas a tener que consultar a tu hosting. Pediles acceso FTP a la carpeta que necesites y te tienen que pasar un usuario y contraseña. Luego podes descargar el FileZilla, (busca un tutorial en internet para configurarlo, no vas a tener ninguna dificultad para lograrlo)

  80. Como sería en PHP para asignar ancho de banda de subida y bajada para un usuario?, y como asignar el tiempo de uso del internet?

    Gracias

  81. Buenas, estoy trabajando buscando algo de ayuda, trabajo en una api en Visual Basic, he podido hacer la conexión, agrego usuarios y perfiles a mi rb mikrotik, sim embargo, hay algo que me causa algo de inquietud, después de establecer la conexión, obtengo la fecha y hora del rb sin problema y posteriormente quiero obtener los usuarios que tengo pero al obtenerlos, solo obtengo «!done=ret=*0» en lugar de obtener los usuarios, cómo puedo resolver ese inconveniente?

  82. Hola, como estas..
    1ro. Muy bueno tu Post.
    2do. Tengo el problema que anunciaste al principio. Necesito graficar (onda MRTG) la conectividad (ancho de banda Up/Down) de mis clientes y no se como hacerlo. No utilizo SIMPLE QUEUE utilizo PCQ . Queue Tree. Mis clientes subneteados w.x.y.z/30. Que forma hay de generar los graficos similares a los de Mikrotik?
    Desde ya muchas gracias…

  83. saludos hermano muy bueno tu aporte, espero que no te canses de tanto respondernos inquietudes, corri el scrip y logro conectarme solo que me sale un error, podrias ayudarme? gracias
    Esto es lo que obtengo en el explorador:
    Notice: Undefined variable: receiveddone in C:\xampp\htdocs\api_mt_include2.php on line 301
    MikroTik(hEX lite) v:6.38.5 level:4 MIPS 24Kc V7.4(850 Mhz.)

  84. Hola Franco, eso es una configuracion de tu Apache en «xampp» que por defecto muestra «warnings». No es considerado un error, solo una advertencia de que una variable no fue definida. El sistema te va a funcionar igual sin problemas. Tenes 2 maneras de resolverlo; la primera, ocultando los warnings:

    Podes definir estas 2 lineas al principio de la pagina,

    error_reporting(0);
    ini_set('display_errors', 0);

    2) Buscar cual variable no esta definida, dentro de la libreria, y definirla.

    Yo optaria por la opcion 1.

    Saludos

  85. de verdad muchas gracias por responderme hermano, he tenido poca suerte en otros foros, gracias por la solución, quería comentarte que el scrip me anda bien pero al momento de incluir un usuario en el hotspot no lo hace, puse al final del mismo un read para ver que mensaje me esta devolviendo el rb y esto es lo que me sale:

    [«message»]=> string(30) «failure: user name is required»

    sin embargo yo estoy mandando a ejecutar el comando con este scrip:

    $API->write(«/ip/hotspot/user/add», false);
    $API->write(«disabled=no», false);
    $API->write(«name=franco», false);
    $API->write(«password=1234», false);
    $API->write(«profile=default», true);

    ya intente de todo ponerlo en una sola linea, ponerle al nombre comillas, etc

  86. Esta bien lo que estas haciendo. El codigo esta funcionando correctamente. RouterOS te esta diciendo que hay algo que falta.. algun dato es requerido y por alguna razon no lo tiene. Vas a tener que debuggear.. proba primero agregar el usuario desde la consola del winbox para ver si te arroja tambien el error:
    /ip hotspot user add disabled=no name=franco password=1234 profile=default
    Luego habilita la linea debug=false como debug=true, para ver un log mas detallado.
    Con eso te vas a arrimar al problema. Suerte.

  87. Saludos amigo, cambie el codigo por este que sigue:

    require_once(‘api_mt_include2.php’);
    $ipRouteros=»10.1.8.51″; // tu RouterOS.
    $Username=»admin»;
    $Pass=»winetsl17*»;
    $api_puerto=8728;

    $clave=$values[‘clave_contrato’];
    $nombre=$values[‘usuario_contrato’];
    $plan=»default»;

    $API = new routeros_api();
    $API->debug = false;
    if ($API->connect($ipRouteros , $Username , $Pass, $api_puerto)) {
    $API->write(«/ip/hotspot/user/add», false);
    $API->write(«=name=».$nombre, false);
    $API->write(«=password=».$clave, false);
    $API->write(«=profile=».$plan, true);
    echo «ENTRO Y EJECUTO……»;
    echo $nombre;
    echo $clave;
    }

    $READ = $API->read(false);
    $ARRAY = $API->parse_response($READ);
    echo «»;
    var_dump($ARRAY);
    echo «»;

    $API->disconnect();

    ahora uso variables dentro del codigo API, ya este codigo me funciono pero en un archivo solo, es decir un archivo que ejecuto desde el explorador, efectivamente me agrega el usuario al rb PERO con la diferencia que cuando lo ejecuto solo le pongo valores a la variables yo mismo, en este caso uso un valor que tomo de otro lado para asignarla a la variable, no se si me entiendes, y al final coloco un READ para ver que me devuelve el RB y me sale lo siguiente:

    array(1) { [«!trap»]=> array(1) { [0]=> array(1) { [«message»]=> string(30) «failure: user name is required» } } }

    segun lo que entiendo al parcer no me toma el usuario, pero es que mando a imprimir la variable y tiene el nombre de usuario, Toda una cosa loca esto. habra algo que me sugieras hacer en el codigo de arriba para que la variable tome su valor? gracias

  88. Saludos hermano ya logre resolver el problema era un error en la sintaxis, ya puedo agregar perfectamente un usuario, lo otro que queria preguntarte es a la hora de modificarle un dato al usuario, uso este codigo pero falta la parte que es la que te señalo con unos ????? que no se que va ahi para asignarle a la variable $id el ID que me hace falta para cambiar en ese caso el nombre de usuario, aparte que no se si tengo algun error en el scrip, pido nuevamente tu valiosa ayuda para seguir adelante con mi proyecto, gracias.
    Aqui el codigo:
    $API->write(«/ip/hotspot/user/print», false);
    $API->write(«?address=».$nroip, true); //la variable $nroip trae ya el ip del usuario que voy a modificar.

    $id=??????;

    $API->write(«/ip/hotspot/user/set», false);
    $API->write(«=.id=».$id, false);
    $API->write(«=name=».$nombre, true);

  89. En $id tenes que asignarle el valor del resultado de /ip/hotspot/user/print… Tenes que volcar esa consulta dentro de la variable $read; Luego Hace un print_r($read); para ver lo que te trae el print…
    Si no me equivoco te va a quedar algo asi:
    $id=$read[".id"];
    Suerte con eso.

  90. saludos disculpa hermano como seria ese vuelco o esa vaciado de lo que arroja el print en la variable read para luego asignarla? graciaas

  91. Franco, tus preguntas ya no refieren a la nota, si queres arender PHP tendrias que recurrir a un foro especializado o bien te invito a descargarte otros ejemplos de mi blog donde lo vas a encontrar en alguno de ellos.

  92. Amigo le escribo desde Venezuela
    Tengo una grande duda

    Y son con las IP

    Tengo solo el aparato mikrotik con el cable de red en el puerto wan
    A mi pc

    Ejecutó el programa winbox v3

    En la pestaña Neighbors

    Me muestra el Mac addres
    Y la IP está 0.0.0.0

    Para iniciar sesión ingreso con la Mac

    Porque con la IP me sale error

    Después de haber iniciado sesión
    Configuró la api colocando en Available from la IP local xampp 127.0.0.1

    Después en user list configure todo cómo tú explicaste
    Y en usuario coloque la misma dirección de xampp

    Y en el archivo PHP
    Ya he incluido la api
    Con el código

    requiere (‘Modelo/apimikrotik.php’);
    $api=new routeros_api();

    $api->debug(true);

    $api->connect(‘0.0.0.0′,’api’,1234,8728);
    $api->write(‘/interface/getall’);

    $read=$api->read(false);
    $array=$api->parseResponse($read);

    print_r($array);

    $api->disconnect();

    Y me da error o sea no se conecta al mikrotik
    Estoy usando un PC dónde está sólo conectado al aparato mikrotik

  93. La ip 0.0.0.0 «No existe», Tenes que asignarle una IP valida a tu RouterOS, de lo contrario no vas a poder conectarte con el API.

  94. buenas tarde; tendra el codigo para que automaticamente si doy un cliente por ejemplo el dia 15 de nov me los suspenda auotmaticamente el dia 15 de dic a un mes exacto;
    gracias y que par activarlo solo le agrego un mes mas y ya pueda navegar?

  95. @emael No hay mucho codigo para eso. Si das servicio con IP privada y NAT, es facil, creas un address list con los clientes que deben, luego en firewall NAT haces un forwarding de los puertos 80 y 443 de ese address-list a un linux puerto XX donde tengas la pagina indicando la razon del corte.
    Luego si queres, podes utilizar el API para agregar o quietar una IP del address list.

2 Trackbacks / Pingbacks

  1. API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto) | Blog tech-nico.com
  2. API MIKROTIK – (con php) – Indice general | Blog tech-nico.com

Deja un comentario