Вам нужно использовать 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); }
```