You need to use Indy 10, paste the stuff below as a unit. At the bottom is an example to show packages on the RB. This should be enough to get you going. If you refine/improve it, please report back here so all can share in the ‘fun’. Maybe I’ll post this in the WIKI but if you feel like it, go ahead, just mention me there.
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);
}_