28 Şubat 2015 Cumartesi

Java Swing Örneği


     Yaklaşık 2 yıl önce bu zamanlarda Java ile görsel programlama öğrenmeye başladık. Böylece ilk defa konsoldan çıkıp görsel programlaya geçmiş olduk. Yine aynı dönem Sayısal Yöntemler adlı bir ders için uygulama yazmamız gerekiyordu. Bizde bu işi swing kullanarak gerçekleştirdik. Bu benim ilk swing uygulamam oldu. Aşağıda da zamanında işimi gören hesap makinesi tarzındaki ilk swing uygulamamı görmektesiniz. Yeni başlayanlar için küçük bir uygulama örneği olacağını düşündüğümden sizlerle paylaşmak istedim. Kodları en alttaki linkten indirebilirsiniz. 



      Uygulamayı NetBeans kullanarak yazmıştım. Bu yazıyı yazmadan önce denedim NetBeans'in yeni versiyonlarında da sorunsuz kodu açılıyor. 

     Uygulama gördüğünüz gibi şeçilen hessaplama yöntemi için girdiğimiz verileri baz alarak alttaki boş kısımda iterasyon sonuçlarını veriyor.




      Bu uygulamanın çalışır halini "dist" kalsörü altındaki jar dosyasını alarak kullanabiliriz. Ben bu yazıyı yazmadan önce Linux ve Windows üzerinde denedim sorunsuz çalışıyor.

Kaynak Kodu İndir

25 Şubat 2015 Çarşamba

Arduino Ethernet Shield (Wiznet W5100) Client Uygulama



     Bir önceki yazımda daha kolay olduğunu düşündüğüm için Ethermet Shield ile server uygulamasından bahsetmiştim. Bu yazıda ise elimizdeki Ethernet Shield ile nasıl Client olabiliriz  , IP sini bildiğimiz bir siteye nasıl bağlanırız önce bunları sonra da Arduino ile yapılmış olan açık kaynak Akıllı Ev Otomasyonları nasıl çalışıyor , biz de benzer bir iş yapmak istesek Arduino'yu dünyanın herhangi bir yerinden nasıl kontrol edebiliriz bu konuları bulabilirsiniz. Şimdi sırası ile başlayalım;

1) Arduino Ethernet Shield ile Client Uygulaması

     Öncelikle kodu ben yazmadım onu belirteyim. Bir önceki server yazısında olduğu gibi webten çalışır durumdaki bir kod buldum. Arduino ile ilgili internette bir çok konuda bir çok kod örneği var ve bunlardan işe yarayanları alıp gerekli yerleri değiştirerek istediğim şeyi yapmak daha kolayıma geliyor. Sıfırdan yazabiliriz ama uzun sürer  , yine de tercih sizin!

     Kendi bilgisayarımızdan web tarayıcıyı açıp Google üzerinde sorgu yaptığımızı düşünelim. Burada Server  Google , Client ise bizim bilgisayarımızdır. Bunu Ethernet Shield ile yapabilmemiz için ;

* MAC adresi
* Client IP adresi (Arduino için)
* Gateway
* Subnet Mask
* Server IP adresi (Google'ın IP'si)
* Bağlanacağımız Port (Genelde 80 nolu porttur)

bilgilerini belirlemeli ve Arduino'nun kod kısmında yazmalıyız. Daha sonra 80 nolu port üzerinden bağlantı açmalıyız. Bu bağlantının başarılı olup olmadığını ise Serial Monitor kullanarak denetleyebiliriz. Aynı şekilde bağlantı varsa bağlandığımız sayfanın HTML kodlarını okuyup Serial Monitor üzerinde yazdırabiliriz. Aşağıdaki kod tam olarak Google'a Arduino sorgusu gönderiyor ve cevap olarak yönlendirildiğimiz sayfanın HTML kodlarını okuyup Serial Monitore yazdırıyor.



/*
Bu uygulama web sayfasını yazdırıyor
 */

#include 
#include 

// this must be unique
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// change to your network settings
IPAddress ip(192,168,1,21);
IPAddress gateway(192, 168, 2, 1);
IPAddress subnet(255, 255, 255, 0);

// change to your server
IPAddress server(74,125,227,16); // Google

//Change to your domain name for virtual servers
char serverName[] = "www.google.com";
// If no domain name, use the ip address above
// char serverName[] = "74.125.227.16";

// change to your server's port
int serverPort = 80;

EthernetClient client;
int totalCount = 0;
char pageAdd[64];
String bufferRequest = "";
// set this to the number of milliseconds delay
// this is 30 seconds
#define delayMillis 300UL

unsigned long thisMillis = 0;
unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);

  // disable SD SPI
  pinMode(4,OUTPUT);
  //digitalWrite(4,HIGH);

  // Start ethernet
  Serial.println(F("Starting ethernet..."));
  Ethernet.begin(mac, ip, gateway, gateway, subnet);

  // If using dhcp, comment out the line above
  // and uncomment the next 2 lines plus the Ethernet.maintain call in loop

  // if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  // else Serial.println(F("ok"));

  Serial.println(Ethernet.localIP());

  delay(200);
  Serial.println(F("Ready"));
}

void loop()
{
  // If using dhcp to get an IP, uncomment the next line
  // Ethernet.maintain();

  thisMillis = millis();

  if(thisMillis - lastMillis > delayMillis)
  {
    lastMillis = thisMillis;

    // Modify next line to load different page
    // or pass values to server
    sprintf(pageAdd,"/",totalCount);

    // sprintf(pageAdd,"/arduino.php?test=%u",totalCount);

    if(!getPage(server,serverPort,pageAdd)) Serial.print(F("Fail "));
    else Serial.print(F("Pass "));
    totalCount++;
    Serial.println(totalCount,DEC);
  }    
}

byte getPage(IPAddress ipBuf,int thisPort, char *page)
{
  int inChar;
  char outBuf[128];

  Serial.print(F("connecting..."));

  //if(client.connect(ipBuf,thisPort) == 1)
  if(client.connect(server,80) == 1)
  {
    Serial.println(F("connected"));
    int a = analogRead(0);
    
    sprintf(outBuf,"POST /#q=arduino HTTP/1.1",a,page);
    client.println(outBuf);
    sprintf(outBuf,"Host: %s",serverName);
    client.println(outBuf);
    client.println(F("Connection: close\r\n"));

  }
  else
  {
    Serial.println(F("failed"));
    return 0;
  }

  // connectLoop controls the hardware fail timeout
  int connectLoop = 0;

  while(client.connected())
  {
    while(client.available())
    {
      inChar = client.read();
      Serial.write(inChar);
      // set connectLoop to zero if a packet arrives


      connectLoop = 0;
    }
    //bufferRequest = "";
    connectLoop++;

    // if more than 10000 milliseconds since the last packet
    if(connectLoop > 10000)
    {
      // then close the connection from this end.
      Serial.println();
      Serial.println(F("Timeout"));
      client.stop();
    }
    // this is a delay for the connectLoop timing
    delay(1);
  }

  Serial.println();

  Serial.println(F("disconnecting."));
  // close client end
  client.stop();

  return 1;
}




Kodu çalıştırdığımızda Serial Monitor görüntüsü aşağıdaki gibi olacaktır.




2) Arduino ile Yapılmış Açık Kaynak Akıllı Ev Otomasyon Sistemleri

     Günümüzde basit bir araştırma ile bu tarz sistemlerin çok olduğunu ve gerçekten çalıştığını görebiliriz. Amaç elinde Arduino - Raspberry pi olan kişilerin bunları internet üzerinden kontrol etmelerini sağlamak . Gerçekten kullanıcı kitleleri var mı bilmiyorum ama bana göre elinde bu malzemeler olup da evde boş boş yatacağına böyle bir sisteme entegre edip kullanmak son derece mantıklı. Tabi hepsi açık kaynak değil , bazıları da ücretli hizmet sunuyor.

     Bizim ilgilendiğimiz kısım açık kaynak olanlarıdır. Sonuçta hem bu sistemleri kullanabilir hem de nasıl çalıştıklarını kolay bir şekilde saptayabiliriz. Şöyle ki açık kaynak olanlarda herkes elindeki malzemeleri kullansın mantığına göre çalıştığı için ücretsiz üyelikten sonra Arduino'ya yüklemek üzere bize kod veya kodlar verebiliyor. İşte biz elimizdeki bu kodları inceleyerek sistemin nasıl çalıştığını anlayabiliriz.

     Ben bu tarz web sitelerinden olan http://homeautomationserver.com/ üye oldum. Verdiği talimatlar doğrultusunda led , servo ve kamera kullanıp kontrol edebiliyoruz. Bunlardan sadece led kısmını denedim sorunsuz çalışıyor. Yani Arduino'yu çalışır durumda bırakırsam nerede olursam olayım internet üzerinden bana kontrol etme imkanı sağlıyor. Asıl ilgilendiğim kısımda burasıydı. Bu işi nasıl yapıyor bana verdiği Arduino kodu üzerinden görebiliyorum. Bu sistemi tasarlayan kişi de en ufak detaya kadar açıklamış. Kodu buradan vermiyorum merak edenler siteye ücretsiz üye olup kodu inceleyebilir.

     Ben sadece nasıl çalıştığını açıklayayım. Öncelikle üye olan kişilere bir ID veriyor ve bu ID'yi Arduino'nun kod kısmına ekleyip siteye öyle  bağlanmamız gerekiyor. Böylece bizim sayfamızdan yapılan değişikliği Arduino'ya aktarıyor. Bu aktarma kısmı da kısmen yukarıda anlattım aslında. Arduino sayfamıza bağlandığında sayfayı  okuyor ve gerekli yerleri ayrıştırarak işlem yapıyor. Örneğin butona bastığımızda led on durumuna geçecek. Bunu yapabilmek için butona önce bir onclick event ı ekleyip bu event içerisine de Javascript fonksiyonu yazıyor. Bu fonksiyonun temel görevi belirli bir HTML kodunun değerini değiştirmek. Arduino tarafında bu değişikliği algılıyor ve gerekli işlemi if-else ile gerçekleştiriyor.

     En kısa haliyle kontrolü böyle sağlıyor. Ben tam anlatamamış olabilirim ama siz siteye girerseniz ne demek istediğimi daha rahat anlayabilirsiniz.

3) Benzer Çalışmalar Yapabilir miyiz?

     Öncelikle bir işi bir başkası yapıyorsa bizim de yapmamız kesinlikle mümkündür , yeter ki gayret edelim. Dışarıdan zor gibi gelebilir ama işin içine girdiğiniz zaman öyle olmadığını anlamamız çok sürmeyecektir. Ben de benzer bir çalışma yapıyorum. Kısmet olurda tamamlarsam yine buradan paylaşırım. Aşağıda benzer bir çalışma yaparken dikkat etmemiz gereken hususları da yazıp bu yazıyı bitiriyorum;

* Local de bir web sitesi yapıp ağ üzerinden Arduino ile bağlantı kurmak için önce Güvenlik duvarından sunucunuza izin vermeli veya güvenlik duvarını komple kapatmalıyız.

* İlk aşamadan sonra Arduino bağlantı açmak için kullandığınız port numarasını düzeltmeliyiz. Yukarıdaki örnekte port numarası 80 ama bizim sunucumuz 8080 de çalışıyorsa port numarasını 8080 yapmalıyız.

* Arduino ile bağlantıyı açacağımız zaman  sitenin IP adresini vererek sayfaya bağlanmalıyız. Örneğin bilgisayarda URL miz şöyle olsun "localhost:8080/ArduinoWeb/anasayfa.xhtml" ise Arduino koduna bağlantı sayfasını "192.168.1.20:8080/ArduinoWeb/anasayfa.xhtml" şeklinde vermeliyiz. Buradaki IP adresini salladım. Siz kendi bilgisayarınızın IP adresini bulmak için Windows'ta komut istemi içerisine ipconfig yazarak , Linux'ta terminal içerisine ifconfig yazarak IP adresimizi öğrenebiliriz. 

     Bu 3 işlem esasında Local çalıştırdığımız Web sitesi ile Arduino arasındaki bağlantıyı kumak içindir. Bu bağlantıyı kurduğumuzda gerisi kendiliğinden gelecektir. Aşağıda bu 3 maddeye örnek olması açısından yaptığım küçük uygulamayı izleyebilirsiniz. Bu uygulamada ağ üzerinden gerçek zamanlı LDR takibini görebilirsiniz! Şimdilik bu kadar , sizlere kolay gelsin!



19 Şubat 2015 Perşembe

Arduino Ethernet Shield(Wiznet W5100) Server Uygulama


     

     Yaklaşık bir ay önce Ethernet Shield (Wiznet W5100) aldım. Tamamen deneme amaçlıydı , nasıl kullanıldığını ve ne yapacağımı bilmiyordum. Bu yüzden klon ürün aldım. Böylece çok ucuza geldi , en azından bir işe yaramazsa bir kenara atabilirdim. Eğer işe yararsa da yeni çalışmamda kullanacaktım. 



               (Ethernet Shield ortadaki , sorunsuz çalışıyor. Bir çok işimiz halledebilir. Orjinalinden farksız.)     

     Ürün geldi ,  daha sonra nereden başlasam bilemedim. Özelliklerini araştırdığımda Client ve Server olarak kullanılabileceği yazıyor ama nasıl olacağı yazmıyor. Bende normal olarak  ilk başta Arduino'nun hazır örneklerini deneyeyim dedim ama yine sonuç alamadım. Daha sonra internette araştırma yaptım ve gerçekten çalışan basit , güzel uygulamalar buldum. Bu yazımda geçen süre içerisinde edindiğim bilgileri ve internetten bulduğum güzel bir örneği paylaşmak istiyorum. 

     Ethernet Shield ile Arduino'muzu Client , Server veya her ikisini aynı anda  kullanabiliyoruz. Ben burada yeni kullanmaya başladığımızı varsayarak kolay olduğunu düşündüğümden sadece Server kullanımından bahsetmek istiyorum. 


     Aşağıdaki örneği randomnerdtutorials.com adresinden aldım. Örnekte aynı ağ üzerinden led on/off uygulaması yapmış. Aynı zamanda servo kontrolüde yapıyor. Gerekli yerlerde açıklamalarda bulunmuş ve en önemlisi de kod çalışıyor. Kodu aşağıdaki linkten alabilirsiniz;

Kod ve uygulama

     Gerekli kodları yazıp Arduino'yu Server olarak başlattığımızda kodların içerisinde bizim belirttiğimiz ip adresinde sunucu başlatılır. Bu sunucu üzerinden Arduino'yu kontrol edebiliriz veya Arduino üzerinden bu sunucuya veri aktarabiliriz.  Bu kullanıma örnek olarak kendi kullandığımız modemleri örnek verebiliriz. Modemlerin genelde 192.168.1.1 ip adresinde şeklinde yönetici paneli vardır ve buradan modemi kontrol edebilir , ayarlarını değiştirebilir ve bağlı cihazları görebiliriz. Arduino'yu da Server olarak başlattığımızda bu şekilde çalışır. Farklı bir ağdan erişmemiz mümkün değildir. Kısacası Server derken sadece aynı ağdaki kullanıcıların erişebileceği bir yapıdan bahsedilmektedir. 





     Bu uygulamanın ip adresini ve mac adresini değiştirebiliriz sıkıntı olmayacaktır. Kodu incelediğimizde sunucuyu başlattıktan sonra sayfada olmasını istediği şeyleri tek tek client.println() ile HTML kodlarını yazdırmış. CSS kodunu da dikkat ederseniz kendi sitesinden çağırmış. Kodu yükleyip çalıştırdığımızda ve tarayıcı üzerinde 192.168.1.178 ip adresini yazdığımızda aşağıdaki ekran gelecektir.





     Çalışma mantığı ise oldukça basit. Butonlara bastığımızda adres çubuğundaki değişimi farketmişsinizdir. Bu değişimi Arduino tarafında string okuyarak algılıyor ve gerekli işlemleri if blokları ile yapıyor. Aslında butonlara basmadan da direk adres çubuğuna belirlenen şekilde(?button1on ...) yazdığımızda çalışacaktır. Temel amaç buna görsel sağlamak ve telefon tablet ile bağlanarak ağın çektiği herhangi bir konumdan veri akışını sağlamak. 





     Bu kodu kendimizce değiştirip daha işlevsel hale getirebiliriz. Ama css konusuna dikkat etmeliyiz yoksa sayfa birşeye benzemez. Genel olarak Server kullanımı bu şekildedir. Arduino ve Raspberry Pi ile gerçekleştirilen bazı açık kaynak akıllı ev uygulamaları bu mantığa göre inşaa edilmiştir. Ama bu şekilde yapılan uygulamalarda dünyanın herhangi bir yerinden cihazınızı kontrol etmenizi sağlamaz. 


     Sonraki yazımda Ethernet Shield ile Client kullanımı ile bu cihazları yukarıda bahsettiğim gibi dünyanın herhangi bir yerinden kontrol işlemininin nasıl yapılabileceğini incelediğim bir sistem üzerinden anlatacağım. Şimdilik bu kadar.

13 Şubat 2015 Cuma

PrimeFaces Push



     Bu yazımda genel olarak PrimeFaces Push nedir , JSF ile nasıl kullanabiliriz ve dikkat etmememiz gereken hususlar nelerdir sorularına değineceğim. Öncelikle işin temelinden bir kaç örnekle başlayıp sonunda PrimeFaces Push teknolojisine geleceğim.

     Örneğin bir web sitesi tasarlıyoruz , sitede Borsa verilerinin güncel olarak  takibini sağlamamız gerekiyor. Bu isteneni nasıl yapabiliriz?

     Günlük hayatta mail uygulamalarımız açıksa gelen mailleri anlık olarak takip edebiliriz . Benzer şekilde chat uygulamalarında da karşıdaki bir şey yazdığında anında biz mesajını görebiliyoruz. Takip ettiğimiz birisi tweet attığında aynı anda bize yeni tweet olduğuna dair bildirim gözüküyor. Facebook'ta Okey oynarken diğer kullanıcıların hareketlerini gözlemleyebiliyoruz. Evet tüm bu örneklere baktığımızda ortak nokta olayların gerçek zamanlı ve sayfa yenilenmeden yapılabiliyor olmasıdır.

     Bu anında iletimi sağlayan teknoloji HTML 5 ile gelen Websocket'tir . Websocket günümüzde yaygın olarak kullanılmakta ve çoğu tarayıcı desteklemektedir.(Google Chrome , Internet Explorer , Firefox , Safari , Opera ...) Aynı şekilde Web uygulaması geliştirebileceğimiz bütün dillerle bu teknolojiyi kullanabiliriz. Teknik detaylar için aşağıdaki linklere göz atabilirsiniz;

http://en.wikipedia.org/wiki/WebSocket
http://www.tutorialspoint.com/html5/html5_websocket.htm

     Websocket temelinde javascript ile verileri taşıyor. Ajax yapısını da kullanarak her seferinde sayfayı yenilemeden verilerin güncellenmesini sağlıyoruz. PrimeFaces bir çok işimizi kolaylaştırdığı gibi Websocket konusunda da bize kolaylıklar sağlıyor. PrimeFaces'in bu teknolojisinin adı PrimeFaces Push'tur. Burada bizde sıfırdan Websocket için kodları yazabiliriz ama bu hem zaman alacak hem de bolca hatayla karşılaşacağız demektir.

http://www.primefaces.org/showcase/push/

    PrimeFace Push'ta Atmosphere Framework üzerine inşa edilmiştir. Sıfırdan kod yazmak yerine hazırı kullanmanın daha mantıklı olacağını düşünüyorum.

     PrimeFaces Showcase'de hazır kodlar bulunmakta ama bunları direk uyguladığımda bazı sıkıntılarla karşılaştım. Burada dikkat etmemiz gereken hususları da yazıp yazıyı bitiriyorum;


  • Maven kullanıyorsak pom.xml içerisine gerekli dependency eklemeliyiz
  • JSF içerisindeki web.xml kısmına da gerekli servlet tanımlarını eklemeliyiz
  • Managed Bean için RequestScoped annotation kullanırsak istediğimiz şekilde sonuç alamayabiliriz
  • Atmosphere Framework kullanılarak geliştirildiği için projemizde kullandığımız kütüphanelerin PrimeFaces tarafında kullanılan kütüphane sürümüyle aynı olmasına özen göstermeliyiz. Yoksa beklenmedik şekilde hatalar alabiliriz.
Aşağıda Arduino ve PrimeFaces Push ile yaptığım küçük bir uygulamayı izleyebilirsiniz!