mivodev/mikrotik-api-ros6

Complete, universal PHP client for Mikrotik RouterOS v6 API (Socket Protocol Port 8728). Framework-agnostic, zero-dependency.

Maintainers

Package info

github.com/mivodev/mikrotik-api-ros6

pkg:composer/mivodev/mikrotik-api-ros6

Statistics

Installs: 2

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

v0.1.0 2026-05-27 18:56 UTC

This package is auto-updated.

Last update: 2026-05-27 18:56:36 UTC


README

Mikrotik API ROS6

Mikrotik API ROS6

PHP Version License

Complete, universal PHP client for Mikrotik RouterOS v6 API via Socket Protocol (Port 8728). Framework-agnostic with zero external dependencies.

Features

  • Universal API Client — Execute ANY RouterOS command, not just a pre-defined subset
  • Dual-Mode Login — Auto-detects MD5 Challenge (pre-v6.43) and Plaintext (post-v6.43)
  • Zero Dependencies — Only built-in PHP functions (stream_socket_client, md5, chr, ord)
  • Framework-Agnostic — Works with PHP Native, Laravel, CodeIgniter, Symfony, or any PHP framework
  • SSL Support — Connect via port 8729 with SSL encryption
  • Auto-Retry — Configurable connection retry attempts with delay
  • Auto-Parsing — Raw Mikrotik responses converted to structured PHP arrays

Requirements

  • PHP >= 8.2
  • Network access to Mikrotik router on port 8728 (or 8729 for SSL)

Installation

Via Composer (Recommended)

composer require mivodev/mikrotik-api-ros6

For Laravel Projects

Use the Laravel wrapper instead, which provides ServiceProvider, Facade, and .env configuration:

composer require mivodev/laravel-mikrotik-api-ros6

Quick Start

<?php

use Mivo\MikrotikRos6\Client;

$api = new Client();
$api->connect('192.168.1.1', 'admin', 'password');

// Get router identity
$identity = $api->comm('/system/identity/print');
print_r($identity);

$api->disconnect();

Usage

Connecting to a Router

use Mivo\MikrotikRos6\Client;

$api = new Client();

// Basic connection
$api->connect('192.168.1.1', 'admin', 'password');

// Custom port
$api->connect('192.168.1.1', 'admin', 'password', 8728);

// SSL connection (port 8729)
$api->ssl = true;
$api->connect('192.168.1.1', 'admin', 'password', 8729);

Configuration Options

$api = new Client();

$api->timeout  = 3;     // Connection timeout in seconds (default: 3)
$api->attempts = 5;     // Number of retry attempts (default: 5)
$api->delay    = 3;     // Delay between retries in seconds (default: 3)
$api->ssl      = false; // Use SSL connection (default: false)
$api->debug    = false; // Enable debug output (default: false)

Executing Commands

The comm() method is the universal entry-point. It can execute any RouterOS command:

// ─── READ (print) ───────────────────────────────────
$users    = $api->comm('/ip/hotspot/user/print');
$queues   = $api->comm('/queue/simple/print');
$addrs    = $api->comm('/ip/address/print');
$secrets  = $api->comm('/ppp/secret/print');
$ifaces   = $api->comm('/interface/print');
$firewall = $api->comm('/ip/firewall/filter/print');
$dns      = $api->comm('/ip/dns/print');
$routes   = $api->comm('/ip/route/print');
$resource = $api->comm('/system/resource/print');

// ─── CREATE (add) ───────────────────────────────────
$api->comm('/ip/hotspot/user/add', [
    'name'     => 'pelanggan-baru',
    'password' => 'rahasia123',
    'profile'  => 'paket-50mbps',
]);

$api->comm('/ppp/secret/add', [
    'name'     => 'pppoe-user1',
    'password' => 'secret',
    'service'  => 'pppoe',
    'profile'  => 'default',
]);

$api->comm('/queue/simple/add', [
    'name'       => 'queue-pelanggan',
    'target'     => '192.168.1.100/32',
    'max-limit'  => '10M/10M',
]);

// ─── UPDATE (set) ───────────────────────────────────
$api->comm('/ip/hotspot/user/set', [
    '.id'      => '*1',
    'password' => 'password-baru',
]);

// ─── DELETE (remove) ────────────────────────────────
$api->comm('/ip/hotspot/user/remove', [
    '.id' => '*1',
]);

// ─── SYSTEM OPERATIONS ─────────────────────────────
$api->comm('/system/reboot');
$api->comm('/system/identity/set', [
    'name' => 'Router-Mivo',
]);

Filtering & Queries

Use the ? prefix on keys to filter results:

// Filter by exact value
$activeUsers = $api->comm('/ip/hotspot/active/print', [
    '?user' => 'pelanggan-baru',
]);

// Filter PPPoE secrets by service type
$pppoeOnly = $api->comm('/ppp/secret/print', [
    '?service' => 'pppoe',
]);

// Filter by profile
$premium = $api->comm('/ip/hotspot/user/print', [
    '?profile' => 'paket-premium',
]);

Regex Filtering

Use the ~ prefix for regex-based filtering:

// Find users whose name matches a pattern
$matched = $api->comm('/ip/hotspot/user/print', [
    '~name' => 'pelanggan-.*',
]);

Response Format

All responses are returned as structured PHP arrays:

$users = $api->comm('/ip/hotspot/user/print');

// Returns:
// [
//     ['.id' => '*1', 'name' => 'admin', 'profile' => 'default'],
//     ['.id' => '*2', 'name' => 'pelanggan1', 'profile' => 'paket-50mbps'],
// ]

foreach ($users as $user) {
    echo $user['name'] . '' . $user['profile'] . "\n";
}

Error Handling

use Mivo\MikrotikRos6\Client;
use Mivo\MikrotikRos6\Exceptions\MikrotikException;

$api = new Client();

try {
    $api->connect('192.168.1.1', 'admin', 'wrong-password');
} catch (MikrotikException $e) {
    echo "Connection failed: " . $e->getMessage();
}

try {
    $result = $api->comm('/nonexistent/command');
} catch (MikrotikException $e) {
    echo "Command failed: " . $e->getMessage();
}

Debug Mode

Enable debug mode to see all sent and received words:

$api = new Client();
$api->debug = true;
$api->connect('192.168.1.1', 'admin', 'password');

// Output:
// Connection attempt #1 to 192.168.1.1:8728...
// <<< [/login]
// <<< [=name=admin]
// <<< [=password=password]
// >>> [!done]
// Connected and authenticated.

Architecture

src/
├── Client.php                   # Main client — connect, disconnect, comm
├── Contracts/
│   └── ClientInterface.php      # Universal interface (shared with ROS7)
├── Protocol/
│   ├── WordEncoder.php          # Encode word length → binary prefix
│   ├── WordDecoder.php          # Decode binary prefix → word from socket
│   └── Authenticator.php        # Dual-mode login (MD5 + plaintext)
├── Parser/
│   └── ResponseParser.php       # Raw socket words → PHP arrays
└── Exceptions/
    └── MikrotikException.php    # Structured error handling

References

This package was built using the following references:

License

MIT License. See LICENSE for details.