B4J - hızlı uygulama geliştirme aracı

 


Resimde gördüğünüz uygulamayı B4X araçlarından biri olan B4J ile geliştirdim. Ofis tarayıcı, ağda bulunan tüm bilgisayarlara ping atarak, o anda ağa bağlı olan kullanıcıları listeliyor.. 

B4J, Basic for Java'nın kısa hali. Yazılan program java üzerinde çalışıyor ama yazının sonunda bahsettiğim üzere yazdığınız uygulamanın başka bilgisayarda çalışabilmesi için o bilgisayara java kurulması gerekmiyor. Enteresan ve harika değil mi ?

C# veya Java ile uğraştıysanız, B4J Basic dilinin onlara göre çok çok daha kolay olduğunu söyleyebilirim. Programlamaya başlamak veya öğrenmek istiyorsanız, kesinlikle denemenizi tavsiye ediyorum.

B4J ile Windows pc veya Raspberry Pi için, B4A ile Android tablet veya telefon için, B4i ile iOS içeren Iphone veya Ipad için, B4R ile Arduino veya ESP için yazılım geliştirebilirsiniz. B4i dışındakiler tamamen ücretsiz sunuluyor. Yazılımcı olmamama rağmen Basic gibi kolay bir dili ve sağlam bir forum sitesi olduğundan bir şeyler yapabiliyorum. Forumda soru sormaya gerek kalmadan, arama yaparak birçok şey bulunabiliyor. Şimdi bu uygulamayı yani ofis tarayıcıyı adım adım birlikte yapacağız. Böylece B4J ye hızlı bir dalış gerçekleştireceğiz. B4X araçlarını yapan, java dehası olan Erel'in hazırladığı eğitim videolarını youtube üzerinden izleyebilirsiniz. 


Ofis tarayıcı programı nasıl çalışıyor ?

Dediğim gibi ağda bulunan tüm bilgisayarlara ping atarak, o anda ağa bağlı olan kullanıcı isimlerini listeliyor. Komut isteminde (CMD) arp -a komutu ile ağdaki ip adreslerini ve her ip'nin mac adresini görebiliyoruz fakat bu liste ilk etapta eksik olacaktır. Ağa bağlı tüm pc'lerin listesini almak için önce tek tek tüm bilgisayarlara ping atmak gerekiyor maalesef. Ardından arp komutu ile tüm listeyi alabiliyoruz. Mac adresi yani fiziksel adres her pc için iki adet olabilir, biri kablo biri wifi şeklinde.. Program, bu listeyi elde ettikten sonra her bir mac adresinin karşılığı olan kullanıcı ismini bir txt dosyasından okuyarak ekrana yazdırıyor. Haliyle bu txt dosyasını sizin oluşturmanız gerekiyor. Bir bilgisayarın mac adresini, ipconfig/all komutu ile görebilirsiniz.

B4J kurulumu

Daha önceden bilgisayarda Java 8 varsa kaldırın.. CMD komut isteminde java -version yazdığınızda version 1.8.. gibi bir bilgi geliyorsa Java 8 kuruludur. Aşağıdaki OpenJDK yı kurduğunuzda bu komuta version 11.0.1 gibi bir cevap gelecektir. Merak etmeyin, Java 8 de çalışan programlarınız Java 11 de de çalışacaktır. Aşağıdaki programları indirin;
OpenJDK zipli dosyayı C:\jdk-11.0.1 gibi bir dizine açın.. 


B4J.exe kurulumunu yapıp, Tools > configure paths menüsünde çıkan pencerede javac.exe konumunu gösterin..


Java yı sisteme tanıtmak için arama çubuğuna ortam değişkenleri yazıp enter a basın. Çıkan pencerede ortam değişkenlerine tıklayın.. Sistem değişkenleri kısmında Yeni butonuna tıklayın ve aşağıdaki şekilde JAVA_HOME değişkenini tanımlayın..

Yine Sistem değişkenleri altında Path (yol) e tıklayıp, Düzenle butonuna ardından Yeni butonuna tıklayın, aşağıdaki gibi java dizinini ekleyin..



Java 8 den 11 e geçtiyseniz eski Java 8 jar dosyalarınız çift tıklama ile çalışmayacaktır. Bunu düzeltmek için jarfix.exe programını bir kerelik çalıştırmak gerekiyor. 


B4J IDE kullanımı

File > New > UI menüsünden yeni proje açın..


Programları koyacağınız bir proje dizini oluşturun ve üstteki kutuda bu dizini seçin. Create New Folder seçili olsun ki programımız için bir dizin açılsın. Sizi aşağıdaki pencere karşılayacaktır..


Menü dilini değiştirmek veya arka fonu benim gibi koyu yapmak isterseniz, Tools > IDE Options menüsünü kullanabilirsiniz. Üstte bulunan run butonuna tıklayınca veya F5 e basınca program çalışacaktır.





Kullanıcı arayüzü ayarları

UI yani arayüzü ayarlamak için menüden Designer > Open Internal Designer a tıklıyoruz..



Button1 zaten mevcut olacak silmeyin, Add View dan Label1, Label2, TableView, ProgressBar ekleyin, bunları resimdeki gibi yerleştirin. Label1, ProgressBar ın üstüne geliyor.. Soldaki pencerede tblData gözüküyor, bu aslında TableView, bu komponenti seçince ortadaki Properties penceresinden Name yani ismini değiştirerek tblData yapın. Sağdaki Abstract Designer da bir komponenti seçin, örneğin Label2 ye sağ klik yapın, Generate > Dim Label2 as Label seçtiğiniz anda kod penceresinde Process_Globals altında label için referans kodu oluşacaktır. Designer da işiniz bitince File > Save yapmayı unutmayın, tasarım diske kaydedilir. tblData seçip ortada Properties penceresinde Columns özelliğine NAME, IP Address yazın..





Kaynak kodun eklenmesi

Projede kullanılan kütüphanelerin projeye eklenmesi gerekir. Bunun için sağ alt köşede bulunan Library Manager sekmesine tıklayın ve aşağıdaki kütüphanelerin seçili olduğundan emin olun..



Sub Process Globals ile başlayan kısımdan itibaren aşağıdaki kodu kopyalayıp yapıştırın. B4J IDE nin font büyüklüğünü Tools > IDE Options > Font Picker ile ayarlayabilirsiniz..

Sub Process_Globals
Private fx As JFX
Private MainForm As Form
Private Button1 As Button
Private sh As Shell
Private params As List
Private baseAddress As String = "10.220.50."  'change it for your network
Private ipAddress As String
Private counter As Int
Private macs As Map
Private Label1 As Label
Private ProgressBar1 As ProgressBar
Private progress As Float
Private tblData As TableView
Private Label2 As Label
End Sub

Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.RootPane.LoadLayout("Layout1")
MainForm.Title = "OFFICE SCANNER"
MainForm.Show
CSSUtils.SetBackgroundColor(Label1, fx.Colors.Transparent)
CSSUtils.SetStyleProperty(ProgressBar1, "-fx-accent", CSSUtils.ColorToHex(fx.Colors.LightGray))
macs.Initialize
macs = File.ReadMap(File.DirApp, "mac_adres.txt") 
End Sub

Sub Button1_Click
Button1.Enabled = False
tblData.Items.Clear
progress = 0
For k = 1 To 254 ' ip addresses 
ipAddress = baseAddress & k
Wait For(ping(ipAddress)) Complete (Result As Boolean)
'Log("result: " & Result)
progress = progress + (100/254)
ProgressBar1.Progress = progress / 100
Label1.Text = $"%${NumberFormat(progress,0,0)}"$
Next
params.Initialize
params.AddAll(Array As String ("-a"))
sh.Initialize("sh","arp",params)
sh.WorkingDirectory =  "C:\Windows\system32"
sh.Run(-1)
Wait For sh_ProcessCompleted (Success As Boolean, ExitCode As Int, StdOut As String, StdErr As String)
If Success And ExitCode=0 Then
Log("-----------------------------------------------------")
Dim arrLine() As String = Regex.Split(CRLF,StdOut)
Dim arrWord() As String
Dim macSample As String
For k = 1 To arrLine.Length-1
If arrLine(k).Contains("dynamic") Then
arrWord = Regex.Split("\s+",arrLine(k))
macSample = arrWord(2).ToUpperCase
If macs.ContainsKey(macSample) Then
Log(macs.Get(macSample)&"      IP: "&arrWord(1))
Dim row() As String = Array As String(macs.Get(macSample), arrWord(1))
tblData.Items.Add(row)
End If
End If
Next
End If
DateTime.TimeFormat = "HH:mm"
Label2.Text = "Last scan: " & DateTime.Time(DateTime.Now)
Button1.Enabled = True
End Sub

Sub ping (address As String) As ResumableSub
params.Initialize
params.AddAll(Array As String ("-n","1",address))
sh.Initialize("sh","ping",params)
sh.WorkingDirectory =  "C:\Windows\system32"
sh.Run(200) 'timeout value is 200ms not to wait too much for unreachable ip addresses
' counter = counter + 1
' Log("counter " &counter)
Wait For sh_ProcessCompleted (Success As Boolean, ExitCode As Int, StdOut As String, StdErr As String)
' Log(params.Get(2)) ' ip address
If Success And ExitCode=0 Then
' Log("success")
' Log("---------------------------------")
' Dim str As String = StdOut
' Dim ind As Int = str.Length
' Log(str)
' Log(ind)
' Log("----------------------------------")
Return True
Else
' Log(StdErr)
' Log("ExitCode : "&ExitCode)
' Log("---------------------------------")
' Dim str As String = StdOut
' Dim ind As Int = str.Length
' Log(str)
' Log(ind)
' Log("----------------------------------")
Return False
End If
End Sub


Txt dosyası

mac_adres.txt Dosyasını resimdeki gibi oluşturup, proje dizini altında Objects dizini içine koymanız gerekiyor..



Dağıtım

Yazdığınız programı veya uygulamayı başka bir bilgisayarda çalıştırmak için o bilgisayarda java kurulmasına gerek kalmıyor. Project > Build Standalone Package menüsü ile OfficeScanner\Objects\temp\build dizini altında oluşan 4 dizini ve exe dosyasını diğer bilgisayara kopyalamanız yeterli olacaktır. run_debug.bat Dosyası ile programda bir hata varsa görebilirsiniz. Ben öyle gördüm, form açılır açılmaz kapanıyordu. Meğer program txt dosyasını bulamayınca kapanıyormuş. Üstte oluşturduğum txt dosyasını bin dizini içine koyunca hata düzeldi.

Yorumlar

Bu blogdaki popüler yayınlar

VBA - Mscomm (seri port) ile veri loglama

RJ45 2 - Novexx barkod yazıcıya, S7-1200 plc ile etiket yazdırma

PC_SIMU V3 ile S7-1200 simülasyonu