router_os_client 1.0.8 copy "router_os_client: ^1.0.8" to clipboard
router_os_client: ^1.0.8 copied to clipboard

RouterOSClient is a Dart/Flutter package that provides an easy-to-use interface for connecting and interacting with Mikrotik's RouterOS devices via a socket connection.

example/lib/main.dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:router_os_client/router_os_client.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'RouterOS Connect',
      home: RouterOSWidget(),
    );
  }
}

class RouterOSWidget extends StatefulWidget {
  const RouterOSWidget({super.key});

  @override
  RouterOSWidgetState createState() => RouterOSWidgetState();
}

class RouterOSWidgetState extends State<RouterOSWidget> {
  late RouterOSClient client;
  String status = 'Not Connected';
  List<String> connectedDevices = [];
  TextEditingController addressController = TextEditingController();
  TextEditingController userController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  TextEditingController portController = TextEditingController();
  TextEditingController commandController = TextEditingController();
  String commandOutput = '';
  bool useStream = false;

  @override
  void initState() {
    super.initState();
    addressController.text = ''; // Default value
    userController.text = ''; // Default value
    passwordController.text = ''; // Default value
    portController.text = ''; // Default value
  }

  Future<void> _connectToRouter() async {
    try {
      client = RouterOSClient(
        address: addressController.text,
        user: userController.text,
        password: passwordController.text,
        port: int.parse(portController.text),
        useSsl: false,
        timeout: const Duration(seconds: 10),
        verbose: true,
      );

      bool loginSuccess = await client.login();
      if (loginSuccess) {
        setState(() {
          status = 'Connected to RouterOS';
        });
      } else {
        setState(() {
          status = 'Login failed';
        });
      }
    } catch (e) {
      setState(() {
        status = 'Connection failed: $e';
      });
    }
  }

  Future<void> _executeCommand() async {
    String command = commandController.text;
    try {
      if (useStream) {
        await startTorchStream(command);
      } else {
        var result = await client.talk(command);
        setState(() {
          commandOutput = result.toString();
        });
      }
    } catch (e) {
      setState(() {
        commandOutput = 'Failed to execute command: $e';
      });
    }
  }

  Future<void> startTorchStream(String command) async {
    try {
      var stream = client.streamData(command);

      await for (var sentence in stream) {
        setState(() {
          commandOutput = sentence.toString();
        });
      }
    } catch (e) {
      if (kDebugMode) {
        print('Error while streaming data: $e');
      }
      setState(() {
        commandOutput = 'Error while streaming data: $e';
      });
    }
  }

  @override
  void dispose() {
    client.close();
    addressController.dispose();
    userController.dispose();
    passwordController.dispose();
    portController.dispose();
    commandController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('RouterOS Connection'),
      ),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            TextField(
              controller: addressController,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'RouterOS Address',
              ),
            ),
            const SizedBox(height: 10),
            TextField(
              controller: userController,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Username',
              ),
            ),
            const SizedBox(height: 10),
            TextField(
              controller: passwordController,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Password',
              ),
            ),
            const SizedBox(height: 10),
            TextField(
              controller: portController,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Port',
              ),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                if (addressController.text.isNotEmpty &&
                    userController.text.isNotEmpty &&
                    passwordController.text.isNotEmpty &&
                    portController.text.isNotEmpty) {
                  await _connectToRouter();
                } else {
                  setState(() {
                    status = 'Please fill all fields';
                  });
                }
              },
              child: const Text('Connect'),
            ),
            const SizedBox(height: 20),
            Text('Connection Status: $status'),
            const SizedBox(height: 20),
            ListView.builder(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(),
              // Disable internal scrolling
              itemCount: connectedDevices.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(connectedDevices[index]),
                );
              },
            ),
            TextField(
              controller: commandController,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Enter Command',
              ),
            ),
            const SizedBox(height: 10),
            CheckboxListTile(
              title: const Text('Use Stream'),
              value: useStream,
              onChanged: (bool? value) {
                setState(() {
                  useStream = value ?? false;
                });
              },
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () async {
                await _executeCommand();
              },
              child: const Text('Execute Command'),
            ),
            const SizedBox(height: 20),
            const Text('Command Output:'),
            SingleChildScrollView(
              scrollDirection: Axis.vertical,
              child: Text(commandOutput),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                client.close();
                setState(() {
                  status = 'Disconnected';
                  connectedDevices.clear();
                });
              },
              child: const Text('Disconnect'),
            ),
          ],
        ),
      ),
    );
  }
}
3
likes
0
pub points
62%
popularity

Publisher

verified publisheranaab.tech

RouterOSClient is a Dart/Flutter package that provides an easy-to-use interface for connecting and interacting with Mikrotik's RouterOS devices via a socket connection.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

convert, flutter, logger

More

Packages that depend on router_os_client