1. GİRİŞ Java nedir?



Yüklə 288.7 Kb.
səhifə5/6
tarix26.07.2018
ölçüsü288.7 Kb.
1   2   3   4   5   6

8.2.3 DTR (Data Terminal Ready)


Bu pin veri iletimini için hazır olunduğunu karşı tarafa bildiren pindir. ‘Off’ değeri veri iletişimine hazır olunduğunu ‘On’ değeri ise veri iletişimine hazır olunmadığını belirtir.

8.2.4 DSR (Data Set Ready)

Modemin haberleşme kanalına bağlandığını ve data gönderimine veya alımına hazır olduğunu lojik 1 iken bildirir.

8.2.5 GND (Logical Ground)


Teknik olarak GND pinine ait olan sinyal bir sinyal ya da bir voltaj değildir fakat diğer pinlerdeki işletilecek sinyallerde bu pin (Yani Mantıksal Toprak) olmadan işletilemezler. Basit olarak GND pini hangi voltajın negatif hangi voltajın pozitif olacağını belirlemede bir referans noktasıdır.

8.2.6 RTS (Request To Send)


Bir anda sadece bir bit lik veri kümesi gönderilebilir. Bu pin ise gönderilecek olan verilerin daha olduğunu belirterek diğer veriler için karşı cihazın kendini hazırlaması gerektiğini bildiren sinyali yollar. Bu sinyal genelde off durumundadır.

8.2.7 CTS (Clear To Send)


Bu pine sinyal karşı cihazdan gelir. Off pozisyonu cihazdan karşı cihaza gönderilecek verinin devamının olduğunu belirtir.

RTS ve CTS sinyalleri cihazların veri iletişiminin düzgün olmasını sağlar. Çoğu cihazda RTS ve CTS sinyalleri otomatik olarak Off pozisyonundadır.

RTS ve CTS sinyalleri ilk başta half duplex modemler için amaçlanmıştır. Şimdi ise half duplex modemlerinin kullanımının azalmasından dolayı hardware handshaking için kullanılmaya başlanmıştır.

Yukarıdaki şekilde iki bilgisayarın, iki modem ve bir de telefon hattıyla bağlantısı gözükmektedir. Yukarıda half dublex bağlantı kullanılmıştır. Şimdi data iletimini kısaca anlatalım.

Önce 1. bilgisayar tarafından 1. modeme bir veri gönderme isteği olduğunu belirtmek için RTS sinyali gönderilir. bunu alan 1. Modem 2. Modeme bu sinyali aldığını bildirir. Bunun üzerine 2. Modem 2. Bilgisayara DCD sinyalini yollayarak data yollanmak üzere olduğu bildirilir. Bunun amacı ise, 1. Bilgisayar veri gönderirken 2. Bilgisayarın da veri göndermesini önlemektir. Zaten half dublex bir hatta, önce bi kısım veri gönderir, göndermesi bittikten sonra da ikinci kısım veri gönderir. Aynı anda veri gönderemezler. Daha sonra 1. Modem 1. Bilgisayarın veri gönderebileceğini CTS sinyalini 1. Bilgisayara göndererek bildirir. Böylece veri iletimi gerçekleştirilebilir. Veri yollanması tamamlandıktan sonra 1. Bilgisayar RTS sinyalini 1. Modeme göndermeyi keser. Diğer taraftaki 2. Modem de DCD sinyalini 2. Bilgisayara yollamayı keser. Bundan sonra iki DTE'den biri veri göndermek istediğinde RTS sinyalini kendi modemine vererek iletişim hattını kullanabilir.

RTS, CTS ve DCD sinyalleri, lojik 1 seviyesinde ise iletim gerçekleştirilebilir. Örneğin veri gönderen bilgisayardan modeme veri beslenebilmesi, hem RTS sinyalinin hem de CTS sinyalinin lojik seviyesinde yani +12V civarında olması gerekir.



8.3 Projede Seri Port – DSR Pini Kontrolü

Projede kullanılan alarm panelinin çeşitli çıkışları vardır. Önceki bölümde anlatıldığı gibi PGM çıkışı bize alarm hakkında gerekli bilgiyi verecektir. PGM çıkışı alarm geldiğinde 8V, alarm yok iken, 0V verecek şekilde ayarlanmıştır. Bu yüzden alarm ile seri portu birleştirebilmek için, elimizdeki datamızı (0V - 8V) RS-232 formatının anlayacağı şekle getirmek gereklidir. Bunun için ufak bir devre tasarlanmış ve gerçekleştirilmiştir. Devrenin MULTISIM programındaki çizimi aşağıda verilmektedir:





8.3.1 Devrenin Amacı ve İşleyişi

Devrenin girişine alarm panelinin PGM çıkışından 8V ve 0V uygulanmaktadır. Bu gerilim düzeylerini seri portun anlayabileceği bir formata getirebilmek için, yani RS-232 formatına uygun hale getirilebilmesi için MAX232 entegresi kullanılacaktır. Aşağıda ise bu entegrenin kataloğundan alınmış bir uygulaması bulunmaktadır.



Girişimiz TTL seviyesinde olacağından bizim 8V’u TTL için lojik 1 seviye olan 5V’a indirmemiz gereklidir. Bunun için ise zener diyot kullanılmıştır ve gerilim düşürülmüştür. B TTL seviyesindeki giriş bilgimiz ise, 11 no’lu bacaktan “From TTL” girilmiştir. Çıkış ise 14 no’lu bacaktan “EIA-232 Output” alınacaktır. Bu çıkışa göre


TTL 0V  -3, -12

TTL 5V  +3,+12 olacaktır ve bu bilgi seri portumuz için anlamlı olacaktır.

Bu RS-232 bilgisi seri portumuzun DSR (6 no’lu pin) pinimize girecektir ve bu bilginin devamlı kontrol edilmesi gereklidir. Bilgisayarımıza da çalışan programımız ise devamlı seri port kontrolü yapacaktır ve DSR pininin durumu hakkında bilgi verecektir. Eğer alarm durumu oluşursa, PGM çıkışı 8V olacaktır ve TTL girişimiz lojik 1 olacak fakat RS232 çıkışımız ise -9V olacaktır. Bu da RS232’de “FALSE” durumuna denk düşer. Eğer alarm durumu almaz ise, PGM çıkışı 0V, TTL girişimiz de 0V olacaktır. Buna bağlı olarak da, RS232 çıkışımız ise 6V vermiştir bu da lojik olarak “TRUE” olacaktır. Bu şekilde alarm bilgisini programımızla tümleşik hale getirebiliriz. Çeşitli değişimleri algılayıp, alarm bilgisine erişip, alarm durumunda olmasını istediklerimizi gerçekleyebiliriz.

8.4SERİ PORT KONTROLÜ YAPAN KODLARIMIZ

import javax.comm.*;
public class ComControl implements Runnable {
static CommPortIdentifier portId;

SerialPort serialPort;

static String TimeStamp;

public static void main(String[] args) {

try

{

portId = CommPortIdentifier.getPortIdentifier("COM5");

ComControl reader = new ComControl( );

}//try
catch(Exception e) {

TimeStamp = new java.util.Date( ).toString( );

System.out.println(TimeStamp + ": COM5 " + portId);

System.out.println(TimeStamp + ": msg1 - " + e);

}//catch
}//main
public ComControl( ) {

try {

TimeStamp = new java.util.Date().toString();

serialPort = (SerialPort) portId.open("ComControl", 2000);

System.out.println(TimeStamp + ": " + portId.getName( ) +

" portumuz acildi deger bekleniyor….");

} catch (PortInUseException e) { }

try

{

serialPort1.setSerialPortParams(9600,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

serialPort.setRTS(false);
while(true){

if(serialPort.isDSR( )==false)

{System.out.println("false"); continue;}

else

{System.out.println("true");

FrameGrab f=new FrameGrab();

break;}

}//while

}//try

catch(UnsupportedCommOperationException e) {}

}//ComControl( )


public void run( ) {

try

{

Thread.sleep(100);

}//try

catch (InterruptedException e) { }

} //run( )
}//ComControl class

Öncelikle programımızda kullanacağımız bazı sınıfları tanımlayabilmek için onların paketlerini yüklememiz gereklidir:


import javax.comm.*;
Böylece artık javax.comm paketindeki tüm sınıfları kullanabilme olanağına sahip oluruz. Daha sonra programımızın başında belirli sabitler için tanımlamalar yapılmalıdır:
static CommPortIdentifier portId;

SerialPort serialPort;

static String TimeStamp;
“CommPortIdentifier” sınıfının “getPortIdentifiers(“COMX”)” metodu ile COMX hakkında bilgiler elde edilir.Bu işlem “try – catch” yapısı içinde yazılır ki, eğer port açık değilse ve bir hata varsa exceptiona düşmesi durumunda bu bilgiye rahatça erişebilelim.
serialPort = (SerialPort) portId.open("ComControl", 2000);
Bu komut ile, seriport açılmış bulunur.Buradaki open( ) metodunun constructorı:

Open(java.lang.String appname,int timeout )

Appname= Kod sahibi tarafından yazılan bir tanımlamadır.

Timeout= Portun açılması için beklenen süredir.


Eğer hiçbir hataya düşmez ise, port açılır ve bunu aşağıdaki komutu çalıştırarak kullanıcıya gösterir:
System.out.println(TimeStamp + ": " + portId.getName() + "portumuz acildi deger bekleniyor….");
Daha sonra portumuzun port standartlarında çalışması için aşağıdaki ayarları yapmamız gereklidir:

serialPort.setSerialPortParams(9600,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);
Alarm devreye girmeden önce DSR ucumuz “false” değerini gösterir. Alarm geldiğinde ise DSR ucuna, alarm panelinden çıkan ve RS232 dönüştürücü devremize girip oradan da RS232 formatında çevrilen ucumuz bağlanır. Bu ucun ne zaman “true” olup yada olmadığı hakkında bilgi edinmek için bir sonsuz döngü içine konmalıdır ve devamlı DSR ucu kontrol edilmelidir.
Aşağıdaki kod parçacığında ise; “false” durumunda aramaya devam ediyor ama “true” olduğu anda döngüden çıkıyor. Biz ise buradaki kod parçacığına “true” olduğu anda webcamden görüntü alan kod parçacığımızı; yani ResimCek sınıfımızdan bir nesne oluşturacağız.
while(true){

if(serialPort.isDSR( )==false)

{System.out.println("false"); continue;}

else

{System.out.println("true");

FrameGrab f=new FrameGrab( ); break; }

}//while
run( ) metodu çalıştırılır ve arka tarafta override edilir ve böylece programımız son bulur:
public void run( ) {

try {

Thread.sleep(100);

}

catch (InterruptedException e) {}

} //run( )

Özet olarak bu programa göre ilk önce seri port için “COM5” ayarlanıyor. Bu değer portID’ye atanıyor. Daha sonra bir “ComControl” nesnesi oluşturularak, seri portun açılması sağlanıp bu port üzerindeki herhangi bir değişiklik ya da herhangi bir değeri okuyabiliriz.


Programda yapılan kontroller, try-catch yapısı içinde yazılmıştır. Eğer portun açık olmama durum vs gibi durumlar söz konusu olursa bunu catch’e düşerek ve ekrana düşme sebebi olan hatayı yazdırarak, bizim sorun hakkında bilgilendirmemizi sağlar. Örneğin bir port kullanılıyorsa ve biz bu portu kullanmak istersek “PortInUseException” hatasına düşecektir.
Daha sonra seri portun belirli başlangıç değerlerine getirilmesi gereklidir. Bunun için ise, setSerialPortParams( ) fonksiyonu kullanılır.
Kontrol mekanizması ile DSR ucu kontrol edilir ve “true” bilgisi gelince webcamden görüntü alan FrameGrab sınıfımızdan bir nesne oluşturularak, hırsızın fotoğrafını çekebiliriz.

9. JAVA MEDİA FRAMEWORK (JMF)
9.1 GİRİŞ
JMF java programlarında media akışını işlemek için bir kullanılan yapıdır.JMF Java 2 standard platformunda seçmeli pakettir. Java Media Framework (JMF)zaman tabanlı mediayı java uygulamaları ve appletleriyle birleştiren arayüz uygulama programıdır . JMF birleşmiş mimari ve mesajlaşma protokolü sağlar , JMF :

Multimedia içeriklerini gösterir,

Mikrofon ve kameradan veriyi yakalar ,

Internet üzerinden gercek zamanlı media akışı sağlar,

Mediayı işler(media formatını değiştirir, özel etkiler katar),

Dosyaya kaydeder.


9.2 JMF MODELİ
JMF mediayı işleyen tüketici elektronik endüstrisi ile aynı modeli kullanır. JMF modeline göre medianın yaşam döngüsü media kaynağından başlar, media alıcı ile biter. Arada media işleyiciler ile işlenir. Media kaynağı yakalama aleti(mikrofon veya webcam), veya network üzerinden gerçek zamanlı media akışı olabilir. Media işleme donanım ile gerçekleştirilebilir fakat çoğunlukla yazılım ile yapılır.
VSR gibi aletler zaman tabanlı medyayı işleme ,kaydetme, gösterme için benzer model sağlarlar. VSR kullarak film açıldığında video kaseti ile media akışı sağlanır. VSR kasetteki veriyi okur ve yorumlayarak televizyona ve dinleyiciye gönderir. JMF aynı temel modeli kullanır. Data source video kaseti gibi media akışını sarmalar ve player VSR gibi ses ve görüntüyü işleme ve kontrol mekanizması sağlar. Data source media akışını playera iletir. Ses ve görüntüyü yakalama ve oynatma için JMF, mikrofon,kamera ve monitor gibi giriş cıkış aletlerine gereksinim duyar.

Şekil 9.1-JMF modeli


9.3 JMF ÖZELLİKLERİ
JMF JPEG, MPEG-1, MPEG-2, QuickTime, AVI, WAV, MP3, GSM, G723, H263, ve MIDI media formatlarını destekler ve HTTP, HTTPS, FTP, RTP ve RTSP media erişim protokollerini destekler. JMF “gözlemci” tasarım modelini izleyen iyi tanımlanmış olay rapor mekanizmasını kullanır . JMF nesnelerini yaratan “üretimlik” tasarım modelini kullanır. Real-time Transport Protocol (RTP) kullanarak media akışını ve RTP oturumlarının yönetimini destekler. JMF karşılıklı farklı media data tipleri, protokolleri ve teslim mekanizmasını ölçekler. İsteğe göre uyarlamaya ve genişletmeye uyumlu bir mimari sağlar. Teknoloji sağlayıcıları JMF’i ilave media formatını desteklemesi için genişletebilir. Donanım hızlandırıcı olarak kullanılan yüksek performans özel media player uygulaması , veya kodları JMF ile entegre edilebilir ve tanınabilir .
JMF API JMF nesnelerinin özelliklerini kontrol edebilmemiz için bazı arayüzler sağlar. Player, Processor, DataSource gibi... Örnegin GainControl nesnesi Playerın ses denetimini kontrol eder.
Manager sınıfı DataSource, DataSink, Player, Processor, cloneableDataSource, ve MergedDataSource gibi JMF nesnelerini yaratmak için kullanılır.
Ses ve görüntü yakalama aletleri kameralar ve ses kartlarını içerir. Bütün ses ve görüntü yakalama aletleri CaptureDeviceManager ile saklanır, JMF ile onları kullanmak için. CaptureDeviceManagerı verilen çıkış formatında desteklenen ses ve görüntü yakalama aletlerinin listesi için sorgulanabilir .
JMF PlugIn arayüzünü media-işleme aşamasını temsil etmek için kullanır. PlugIn tipleri;

Multıplexer

Demultıplxer

Codec


Effect

Renderer.


Processor media işleme soyut sınıfıdır. Playerı genişletir ve programsal kontrole media işleme aşamaları açısından izin verir .

Şekil 9.2. a) player modeli


Şekil 9.2. b) processer modeli

Bütün multimedia içerikleri çeşitli standard formatlar kullanılarak sıkıştırılmış biçimde saklanır. Her format temel olarak media kodlama kullanan methodu tanımlar. Bu yüzden multimedia içeriklerinin formatını tanımlayan sınıfa gereksinim duyulur. JMF uygun media Format özelliklerini belirten Format sınıfını tanımlar. Format sınıfı AudioFormat ve VideoFormat sınıfları olarak özelleştirilir.
Java , java.net.URL sınıfı ile Internetdeki kaynakları tanımlamayı sağlar. URL nesnesini kullanarak media kaynağını belirtilebilir. JMF , media kaynağının yerini belirtmek için MediaLocator sınıfını tanımlar. MediaLocator sınıfı kaynağı tanımlayan “Locator string” kullanarak veya URL kullanarak yapılandırılabilir. JMF sınıfı “DataSource” media kaynağını soyutlar ve media bilgisine ulaşmak için bağlantı protokolü sunar.
DataSink media hedefinin yerini soyutlar ve hedefe Media sunma protokolü sağlar. DataSink DataSource’den mediayı okur ve dosyaya veya streame sunar.
9.4 JMF RTP API
JMF , gerçek zamanlı iletim protokolünü (RTP) media iletimi ve alımı için destekler.RTP taşıma katmanı protokolüdür ve UDP katmanında kullanılır. RTP paketleri

paket teslimini sunmak için dizi numaraları kullanılır,

media kaynağı tanımlama,

media format tanımlama,



özelliklerine sahiptir.
RTP oturumu RTP kullanarak media yer değişikliği hazırlığı uygulamalarını içerir. Bu uygulamaların her biri katılımcı olarak adlandırılır. Her katılımcı RTP oturumlarını düzenlemek için RTPManager nesnesini kullanır. RTP oturumunda yer değiştiren media akışı RTPStream olarak adlandırılır. RTPStream iki biçimde olabilir, sendStream ve ReceiveStream.
9.5 JMStudio
JMStudio media iletmek veya almak,kaydetmek,yeniden oynatmak veya media yakalamak için önemli bir araçtır.. JMF indirildiğinde JMStudio simgesi otomatik olarak oluşur.


9.6 WEBCAM’DEN GÖRÜNTÜ ALAN KODLAR
import javax.media.util.*;

import java.awt.*;

import java.io.*;

import java.util.*;

import java.awt.image.*;

import javax.imageio.*;

import javax.media.*;

import javax.media.control.*;

import javax.media.format.*;

import javax.media.util.*;
public class FrameGrab

{

public static void main(String arg[])throws Exception

{

try {
// Create capture device

CaptureDeviceInfo deviceInfo = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image Capture (Win32):0");

Player player = Manager.createRealizedPlayer(deviceInfo.getLocator());

player.start();

// Wait a few seconds for camera to initialise (otherwise img==null)

Thread.sleep(2500);

// Grab a frame from the capture device

FrameGrabbingControl frameGrabber = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");

Buffer buf = frameGrabber.grabFrame();

// Convert frame to an buffered image so it can be processed and saved

Image img = (new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));

BufferedImage buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);

Graphics2D g = buffImg.createGraphics();

g.drawImage(img, null, null);
// Overlay curent time on image

g.setColor(Color.RED);

g.setFont(new Font("Verdana", Font.BOLD, 16));

g.drawString((new Date()).toString(), 10, 25);
// Save image to disk as PNG

ImageIO.write(buffImg, "jpeg", new File("c:\\webcamy.jpeg"));

// Stop using webcam

player.close();

}

catch (Exception exce) { }

}

}


9.6.1 Kodun Açıklaması
Tüm kod bir sınıf içinde yazılmıştır. Biz daha sonra ana programımızda bu sınıftan oluşan bir nesne oluşturup bu kodlara erişebilip webcamden görüntü alabileceğiz.

Sınıfımızın adı “FrameGrab”tir.

public class FrameGrab{} şeklinde tanımlamamızı yaparız. Süslü parantezler içine ise bu nesne oluşturulduğunda olmasını istediğimiz olayların gerçekleşmesi için gereken kodları yazarız. Her şey “try - catch” blokları içersinde yazılmalıdır. “Catch” bloğuna düşmesi demek, programın yanlış çalışması bir donanım ya da yazılım hatası alması demektir. Bu hatanın kaynağını öğrenmek için ise;

try{


//

}catch(Exception e){ System.out.println(e);} denilmelidir.

Daha sonra webcamimizi bilgisayarımıza tanıtmak için “CaptureDeviceInfo” sınıfından “deviceInfo” adlı bir nesne oluşturulur. Bilgisayarımızın webcami tanıması için

CaptureDeviceInfo deviceInfo= captureDeviceManager.getDevice(“vfw:Microsoft WDM Image Capture (Win32):0"); komutu girilmelidir.

Daha sonra bu webcam bilgisini kullanabilmek için bir player yaratılmalıdır.

Player.start(); diyerek webcam’in çalıştırılması sağlanır.

Webcamden görüntü almak için bir süre beklenmelidir. Bu yüzden “Thread” mekanizması kullanır.

Thread.sleep(2500);

Webcam’den görüntü alabilmek için yani resim yakalamak için ise aşağıdaki komut uygulanır:

FrameGrabbingControl frameGrabber =


(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");

Yakalanan obje FrameGrabbingControl sınıfına ait bir nesnedir. Bu nesnenin bir image’a dönüştürülmesi için ilk önce Buffer sınıfına ait bir nesne oluşturulmalı ve sonra bu nesne “Image” sınıfına ait nesneye dönüştürülmelidir.

Buffer buf = frameGrabber.grabFrame(); //Buffer sınıfına ait bir nesneye çevrildi

Image img = (new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));

Image sınıfına çevrildi. Bufferdaki img nesnesini çizdirebilmek için onu BufferedImage nesnesine çevirmek gerekir. BufferedImage sınıfının createGraphics() metodu kullanılarak bir “Graphics2D” sınıfına ait “g” nesnesi oluşturuldu.

drawImage() metodu ile “g” nesnesine bizim img Image’ımız verildi.

g.setColor(Color.RED);

g.setFont(new Font("Verdana", Font.BOLD, 16));

g.drawString((new Date()).toString(), 10, 25);

Olmasını istediğimiz renk, font ayarları yapıldı. Ayrıca resmin üstüne Date sınıfını kullanarak (java.util paketinden) tarih de yazdırıldı. Böylece hırsızın içeriye girdiği andaki tarih ve saat de belirlenmiş oldu.

Bu resmi harddisk’e kaydetmek için ise;

ImageIO.write(buffImg, "jpeg", new File("c:\\webcam.jpeg"));

denilerek, C dizini altına webcam adında ve jpeg formatında kaydedecektir.

Son olarak da player’ımızı kapatmamız gereklidir:

player.close();

Komutu ile player kapatılır.





Dostları ilə paylaş:
1   2   3   4   5   6


Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2017
rəhbərliyinə müraciət

    Ana səhifə