Mikrotik – Lazarus-Delphi API Kullanımı #2

Bir önceki yazımızda Lazarus ve FPC ile mikrotik API kullanımına giriş yapmıştım. Gerekli ayarların yapılması, Gerekli kütüphaneler ve kütüphanelerin tanımlanmasını konu almıştım. Bu sefer cihaza nasıl bağlantı yapılıp veri trafiğinin yapılacağına değineceğim.
Lazarus’u açıp boş bir proje oluşturalım.
Öncelikle projemizi bir klasöre kaydelim.
Projemizde aşağıdaki kontrolleri oluşturalım. Nesnelere verdiğim isimleri yanlarına yazdım.
4 adet TEdit; IPAdres,Port,Username,Password
2 adet TButton; Baglan,KomutGonder
2 adet TMemo; Komut,Sonuc
Örnek uygulamanın tasarımını aşağıdaki gibi yapalım.
Bu aşamada “Kaynak düzenleyici“ye geçelim ve aşağıdaki gibi gerekli kod parçalarını ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
unit Unit1; {$mode objfpc}{$H+} interface . uses RouterOSAPI; type . private . public . end; . var //---------------------------------------------------------------------------- // RouterOS Tanımlamaları //---------------------------------------------------------------------------- ROS : TRosApiClient; Res : TRosApiResult; ResListen : TRosApiResult; ROSFlag : Boolean = false; //---------------------------------------------------------------------------- implementation {$R *.lfm} . . |
Dikkat etti iseniz Uses kısmında tanımlı kütüphanelerin devamına “RouterOSAPI” ekleniyor. Daha sonra Global değişken olarak “ROS,Res,ROSFlag” var blogunda tanımlanıyor. Yazının ilerleyen bölümlerinde açıklamalarını ve gerekliliklerini anlatacağım.
Gerekli tanımlamaları yaptıktan sonra uygulamanın OnCreate olayına aşağıdaki kodları yazıp gerekli nesneleri oluşturuyoruz.
1 2 3 4 5 6 7 8 9 |
procedure TForm1.FormCreate(Sender: TObject); begin //---------------------------------------------------------------------------- // RouterOS Nesneler Oluşturuluyor. //---------------------------------------------------------------------------- ROS := TRosApiClient.Create; ResListen := nil; //---------------------------------------------------------------------------- end; |
Uygulama kapatılınca oluşturduğumuz nesneleri hafızadan siliyoruz. Bunun için FormDestroy olayına aşağıdaki kodları iliştiriyoruz.
1 2 3 4 5 6 7 8 9 10 11 |
procedure TForm1.FormDestroy(Sender: TObject); begin //---------------------------------------------------------------------------- // RouterOS Hafızadan Silinsin //---------------------------------------------------------------------------- ROS.Disconnect ; // Bağlantıyı Kapattık. ROS.Free; // ROS Hafızadan Silindi. Res.Free; // RES Hafızadan Silindi. ResListen.Free // ResListen Hafızadan Silindi. //---------------------------------------------------------------------------- end; |
Bu aşamadan sonra cihaza bağlantı kurmaya sıra geldi. Daha önce bağlantı için oluşturduğumuz “Button” nesnemizin Click olayına gerekli kodları iliştiriyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
procedure TForm1.baglanClick(Sender: TObject); begin if Baglan.Tag = 0 then Begin ROSFlag := ROS.Connect(IPAdres.Text, Username.Text, Password.Text, port.text); if ROSFlag Then begin // Bağlandı Sonuc.Lines.Clear; Sonuc.lines.add('Bağlantı Başarılı!'); Baglan.Caption := 'Bağlantıyı Kes'; Baglan.tag := 1; Res := ROS.Query(['/system/resource/print'], True); if Res.Trap then Sonuc.Lines.Add('Bilgi : ' + ROS.LastError) else begin //Hata almadık ise Sonuc.Lines.Add('Cihaz : ' + Res['board-name']); Sonuc.Lines.Add('Versiyon : ' + Res['version']); end; end else begin // Bağlanamadı Sonuc.lines.add('Bağlantı Başarısız - Hata: '+ ROS.LastError); Baglan.Caption := 'Bağlan'; Baglan.tag := 0; ROSFlag := false; end; end else Begin // Aktif Bağlantı kapatıldı. ROS.Disconnect; Sonuc.lines.add('Bağlantı Kapatıldı!'); Baglan.Caption := 'Bağlan'; Baglan.tag := 0; ROSFlag := false; end; end; |
Cihaza bağlantı kurma ve bağlantı kesme işlerini tek butona yüklediğimiz için “Tag” özelliğinden faydalanacağız. Bu sayede buton ismini değiştirip butona her bastığımızda farklı görev yükleyebiliriz.
Yukarıdaki kod bloğunda bağlantının sağlanıp sağlanmadığını “ROSFlag” değişkeninde tutuyoruz. Eğer bağlantı kuruldu ise True kurulmadı ise False değeri yüklenir. Bu sayede program akışında durumu kontrol edebiliriz.
Bağlantımız başarılı ise “Res := ROS.Query([‘/system/resource/print’], True);” kodu ile cihaza sorgu gönderiyoruz. Dönüş değeri “Res” değişkenine yükleniyor. Sonrasında kullanmak istediğimiz bilgiyi alacağız.
Dönüş değerine göre eğer bir bilgi dönecekse (HATA,BILGI..vs) “Res.Trap” değişkeni True olacaktır. Biz buna bakarak dönüş bilgisini alabiliriz. Dönen hatayı ise “ROS.LastError” değişkeninden okuyabiliriz.
Eğer sorunsuz bağlantıyı kurdu isek artık dönen sorgudan istediğimiz veriyi alabiliriz. Mesela Board-Name bilgisini almak istersek “Res[‘board-name’]” kodunu kullanabiliriz.
Mikrotik komutlarını internetten araştırabileceğiniz gibi geri dönen sonuç içinden de ayıklayabilirsiniz.
Programı bu aşamaya getirince ufak bir deneme yapalım.
Gördüğünüz gibi IP Adresi,Port,Kullanıcı Adı ve şifreyi girip Bağlan butonuna basınca yukarıdaki gibi dönüş alınmaktadır. Ben dönüş olarak cihaz modeli ve versiyonu gösterdim. İhtiyaca göre şekillenebilir.
Şimdi cihaza kendimiz komut yazıp çalıştıralım.
Bunun için KomutGonder butonumuzun Onclick özelliğine aşağıdaki kodu yazmalıyız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
procedure TForm1.KomutGonderClick(Sender: TObject); var pa: array of AnsiString; i: Integer; s: String; begin if ROSFlag then begin // Komutları Diziye Aktarır. SetLength(pa, 0); for i := 0 to Komut.Lines.Count - 1 do begin s := Trim(Komut.Lines[i]); if s <> '' then begin SetLength(pa, High(pa) + 2); pa[High(pa)] := s; end; end; // Eğer Komut Girildi İse Çalıştır. if High(pa) >= 0 then Res := ROS.Query(pa, True) else begin ShowMessage('Komut Girin!!'); Komut.SetFocus; Exit; end; // Geri Hata Dönerse Göstersin. if ROS.LastError <> '' then begin Sonuc.Lines.Clear; Sonuc.Lines.Add('HATA: ' + ROS.LastError); end; // Gelen Datayı s değişkenine aktar. s := ''; while not Res.Eof do begin for i := 0 to High(Res.Values) do s := s + Res.Values[i].Name + '=' + Res.Values[i].Value + #13#10; s := s + '----------------'#13#10; Res.Next; end; // Data varsa Memo'ya aktar if length(s) > 0 then begin Sonuc.Lines.Clear; Sonuc.Lines.Add(s); end; end else Sonuc.Lines.Add('Önce Cihaza Bağlan!!'); end; |
Kodun tamamını açıklamayacağım. Sadece şunu söylemek istiyorum. Memo gibi bir kontrole girilen komutları işletmek için 2 yöntem var. Eğer komut uzunluğu ve satır sayısı değişirse String Dizisi oluşturup cihaza göndermeliyiz. Yukarıdaki kod bu işi yapmaktadır.
Eğer değişken olmayan bir komut gönderecekse tek satırda gönderebiliriz.
Örnek : Res := ROS.Query([‘/interface/print’,’?name=WAN’], True);
Bu sorguda İsmi WAN olan interface bilgileri geri dönecektir. Araya virgül koyarak komutları yan yana yazabiliriz.
Aynı komutu birde uygulama ile yapalım.
Gördüğünüz gibi komutu Memoya yazıp çalıştırınca sonuç sağ tarafta yukarıdaki gibi çıkacaktır.
Eğer komutta 2. satır olmasaydı sadece bütün interface bilgilerini yükleyecekti. Datalar çekildiğinde her interface bilgisi alındığında varsa sonraki interface bilgisine geçmek için “Res.Next” kodu kullanılır. Yukarıdaki kodu incelerseniz daha net görebilirsiniz.
Sanırım anlatacaklarım bu kadar. Bu bilgiler eşliğinde Lazarus ile Mikrotik Cihazınıza hükmedebilirsiniz. Size örnek uygulamayı vereceğim. Üzerinde deneme yanılma yaparak bilgilerinizi pekiştirebilirsiniz.
Yazının birinci bölümü : https://www.sercanca.com/mikrotik-lazarus-delphi-api-kullanimi-1/
Uygulamayı indirmek İçin : Mikrotik – Lazarus-Delphi API Kullanımı
Mikrotik API Lazarus Client Uygulaması
https://github.com/sercanca/RouterOS-API-Lazarus-Client
Başka bir yazıda görüşmek üzere,
Sercan TEK
/ip hotspot user add name=xx kullanımını başaramadım bir örmek verirmisiniz
api lerde direkt konsol komutlarını gönderip çalıştıramazsınız.
ben api ile aşağıdaki gibi user ekleyebiliyorum.
/ip/hotspot/user/add
=name=DenemeUser
=password=123
=profile=default
=comment=Deneme Kullanici