Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Вопрос по API.

    Вопрос по API.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Вопрос по API., RouterOS
     
    ekkas
    Guest
    #1
    0
    07.02.2008 09:21:00
    Управлял своими MT через софт, который сам написал на Telnet и FTP, но хотелось бы начать использовать ROS3 API, так как Telnet не всегда возвращает стабильные результаты с ROS3, да и функциональности было бы больше. Есть вопрос по отправке/получению команд. Чтобы отправить '/login', нужно отправить (hex): 07 2F 6C 6F 67 69 6E 00 length  /    l   o   g    i   n  Это верно? Я использую Delphi и не очень понимаю пример на Python…
     
     
     
    blt
    Guest
    #2
    0
    30.04.2008 22:08:00
    Привет, не мог бы кто-нибудь прислать пример на Delphi 7? Спасибо.
     
     
     
    ekkas
    Guest
    #3
    0
    30.04.2008 23:18:00
    Вам нужно использовать Indy 10, вставьте следующее содержимое как модуль. Внизу приведен пример, показывающий пакеты на RB. Этого должно быть достаточно, чтобы вы могли начать работу. Если вы уточните/улучшите его, пожалуйста, сообщите об этом здесь, чтобы все могли поделиться «весельем». Возможно, я опубликую это в ВИКИ, но если вам захочется, сделайте это, просто упомяните меня там.

    ```pascal
    unit MikrotikAPI;
    interface
    uses Classes,IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls, Buttons, IdAntiFreezeBase, IdAntiFreeze, IdIOHandlerStream;
    type
     TMikrotikAPI = class(TComponent)
       Client : TidTCPClient;
       Log, Response: TStringList;
       constructor Create;
       destructor Destroy;
       function Connect(TCPClient: TidTCPClient; Host: String; Port: Integer): Boolean;
       procedure Disconnect;
       function LogOn(Username, Password: String): Boolean;
       procedure Write(S: String);
       function Read: String;
       function ReadStr: String;
       procedure WriteStr(S: String);
     private
     end;
    implementation
    { TMikrotikAPI }
    uses IdOTPCalculator, idHashMessageDigest, SysUtils;

    function StrToHex(O: String): String;
    var i : Integer;
    begin
     Result:= '';
     for i:=1 to Length(O) do
     begin
       Result:=Result+Lowercase(IntToHex(Integer(O_),2));
     end;
    end;

    Function GetMD5(Source:String):String;
    var MD5:TIdHashMessageDigest5;
    begin
     MD5:=TIdHashMessageDigest5.Create;
     try
       Result:=MD5.AsHex(MD5.HashValue(Source));
     finally
       MD5.Free;
     end;
    end;

    function TMikrotikAPI.Connect(TCPClient: TidTCPClient; Host: String; Port: Integer): Boolean;
    begin
     try
       Response.Clear;
       Log.Clear;
       Client:=TCPClient;
       Client.Host:=Host;
       Client.Port:=Port;
       Client.Connect;
       Result:=True
     except
       Result:=False;
     end;
    end;

    procedure TMikrotikAPI.Disconnect;
    begin
     Client.Disconnect;
    end;

    function TMikrotikAPI.LogOn(Username, Password: String): Boolean;
    var S : String; IC: TIdOTPCalculator;
    begin
     Write(‘/login’);
     S:=ReadStr;
     ( !done )
     S:=ReadStr;
     ( =ret )
     ReadStr;
       ( 0 )
     S:=Copy(S,6,Length(S));
     S:=HexToAscii(S);
     S:=‘=response=00’+GetMD5(#0+password+S);
     Write(‘/login’ #13 #10’=name=‘+username+#13#10+S); {  chal=MessageDigestHelper.myHexStrToStr(“00”) + password + MessageDigestHelper.myHexStrToStr(transition); chal = MessageDigestHelper.myMD5Helper(chal);  }
     Read;
     Result:=Response[0]=’!done’;
    end;

    function TMikrotikAPI.ReadStr:String;
    var LN1    : Byte; LN,I   : Integer; TS     : String;
    begin
     Result:=‘’;
     LN1:=Ord(Client.IOHandler.ReadChar);
     LN :=LN1;
     if LN1=0 then exit;
     if LN1>128 then
     begin
       LN1:=Ord(Client.IOHandler.ReadChar);
       if LN1>128 then
       begin
         LN:=LN+LN1 shl 8;
         LN1:=Ord(Client.IOHandler.ReadChar);
         if LN1>128 then
         begin
           LN:=LN+LN1 shl 16;
         end;
       end;
     end;
     SetLength(TS,LN);
     for I:=0 to LN-1 do TS[i+1]:=Client.IOHandler.ReadChar;
     Result:=TS;
     Log.Add(TS);
    end;

    procedure TMikrotikAPI.WriteStr(S:String);
    var I : Integer;
    begin
     if Length(S)>128 then Log.Add(‘< String to long.’);
     Client.IOHandler.Write(Char(Length(S)));
     for i:=1 to Length(S) do Client.IOHandler.Write(S);
     Log.Add(‘>’+S);
    end;

    function TMikrotikAPI.Read: String;
    var TS : String;
    begin
     Response.Clear;
     repeat
       TS:=ReadStr;
       if TS<>‘’ then Response.Add(TS);
     until TS=‘!done’;
     Result:=Response.Text;
    end;

    procedure TMikrotikAPI.Write(S: String);
    var SL : TStringList; i  : Integer;
    begin
     if Pos( #13 #10,S)>0 then
     begin
       SL:=TStringList.Create;
       SL.Text:=S;
       for i:=0 to SL.Count-1 do
       begin
         WriteStr(SL);
       end;
       SL.Free;
     end
     else
     begin
       WriteStr(S);
     end;
     Client.IOHandler.Write( #0 );
    end;

    constructor TMikrotikAPI.Create;
    begin
     Response:=TStringList.Create;
     Log     :=TStringList.Create;
    end;

    destructor TMikrotikAPI.Destroy;
    begin
     Response.Free;
     Log     .Free;
     inherited;
    end;
    end. { IP:=‘192.168.0.1’; Password:=‘password’; SL:=TStringList.Create; TCP:=TidTCPClient.Create; MT :=TMikrotikAPI.Create; if not MT.Connect(TCP,IP,8728) then begin ShowMessage(‘WARNING : ‘+IP+’ : API inactive?’); MT.Free; TCP.Free; end else begin MT.Logon(‘admin’,Password); MT.Write(‘/sys/pack/pr’); S1:=MT.Read; SL.Text:=S1; i:=0; while i<SL.Count do begin if Copy(SL,1,6)=‘=name=’ then begin S1:=SL; Delete(S1,1,6); SL:=S1; if SL=‘routeros-mipsle’ then SL.Delete(i) else Inc(i); end else begin SL.Delete(i); end; end; MT.Disconnect; MT.Free; TCP.Free; end; ShowMessage(SL.Text); }
    ```
     
     
     
    blt
    Guest
    #4
    0
    02.05.2008 20:06:00
    Спасибо, Ekkas! Я не нашёл функцию HexToAscii. Где её нашёл?
     
     
     
    ekkas
    Guest
    #5
    0
    02.05.2008 21:45:00
    Это в файле JvCSVParse.pas, который идёт в комплекте с библиотекой JEDI, но вот он: function HexToAscii(const S: string): string; var I, Y, L: Integer; C: array [0..256] of Char; begin L := Length(S) div 2; for I := 0 to L - 1 do begin Y := (I * 2) + 1; C := Char(HexDigitVal(S[Y]) * 16 + HexDigitVal(S[Y + 1])); end; C[L] := Chr(0); Result := C; end;
     
     
     
    ekkas
    Guest
    #6
    0
    02.05.2008 21:49:00
    и… const HexadecimalUppercaseLetters = [‘A’..‘F’]; HexadecimalLowercaseLetters = [‘a’..‘f’]; function HexDigitVal(C: Char): Integer; begin if C in DigitSymbols then Result := Ord© - Ord(‘0’) else if C in HexadecimalLowercaseLetters then Result := Ord© - Ord(‘a’) + 10 else if C in HexadecimalUppercaseLetters then Result := Ord© - Ord(‘A’) + 10 else Result := 0; end;
     
     
     
    ekkas
    Guest
    #7
    0
    02.05.2008 21:51:00
    И снова то же самое… const DigitSymbols = [‘0’..‘9’];
     
     
     
    blt
    Guest
    #8
    0
    07.05.2008 04:07:00
    Спасибо ещё раз, Ekkas! Работает.
     
     
     
    janisk
    Guest
    #9
    0
    07.05.2008 07:58:00
    Пожалуйста, имейте в виду, что через API можно отправлять строки разной длины, и в зависимости от длины возможны разные варианты ответа. Первый символ впереди показывает длину команды или возвращаемой строки — это для строк короче 255 символов. В примере API вы можете увидеть, какое значение нужно отправить или получить, если хотите использовать более длинные команды. Например, если вы отправляете и получаете скрипты, это потребуется.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры