Socket Programlama Bölüm -2

Ebru Aksoylu —  29 Aralık 2014 — 7 Comments

Önceki yazımızda cihazların nasıl iletişim kurduğu ve iletişim kurallarından kısaca bahsetmiştik. Şimdi ise “Port Dinleyici” adını verdiğimiz sunucu programını yazmaya başlayacağız.
Her cihazın yönlendirildiği porta bıraktığı sinyalin formatı farklıdır. Bu sinyallerin formatının üreticiden üreticiye değiştiğine değinmiştik. Sinyaller genellikle String dizisi halinde gönderilir. Ve dizi içerisindeki değerler birbirinden ayraçlar ile ayrılır.
Duman dedektörümüzün sunucuya gönderiği sinyalin aşağıdaki dizi olduğunu varsayalım.

Bu uzun string dizisini ( sinyali ) Parçaladıktan sonra geriye değerleri kullanmak kalıyor. İşin programlama ile ilgili olan kısmına yavaş yavaş geçelim…

Eski nesil socket programcıları ( en azından benim tanıdıklarım ) hala Delphi ‘nin dinleyici yazarken daha kullanışlı fonksiyonlara sahip olduğunu ve pratikliğini savunurken, ben C# ‘ın multithreading konusunda daha başarılı olduğunu düşünüyorum. Özellikle UDP port kanalını kullanan cihazlar için Threading çok önemli. Çünkü aynı anda sırasız ve düzensiz olarak gelen verilerin kaybolmaması için çok kanallı işlem yapabilme yeteneğine sahip bir dinleyici programlamamız gerekiyor.

Gelelim programımızı oluşturmaya…

Öncelikle Boş bir Windows Form Application açarak Form oluşturalım. Sinyal Trafiğini başlatmak ve bitirmek için 2 adet buton(kodlarda btnStart ve btnStop olarak kullanacağız) ve 1 adet Richtextbox nesnesi bizim için arayüzde yeterli olacak. Oluşturduğumuz projenin isim uzaylarını tanımladığımız kısmına :

Kütüphanelerini eklememiz gerekiyor. IO.Ports kütüphanesini port giriş çıkış işlemleri için , Net kütüphanesini Socket nesnelerini yaratmak için , Threading kütüphanesini çok kanallı işlem yapabilmek ve son olarak Data.SqlClient kütüphanesini de SQL veritabanıyla işlem yapabilmek için kullanacağız.

 

Yazacağımız fonksiyonlarda kullanmak üzere Global olarak UdpClient, Thread ve IpEndPoint sınıfından nesneler oluşturacağız.

Öncelikle Sinyal Trafiğini Başlatacak Butonumuzun “Click” olayına çok kanallı bir Threading başlatacak komutu verelim.

Initialize fonksiyonunu Thread işlemimiz için ayrıca yazıyoruz.

ReceiveMessages isimli bir fonksiyon oluşturarak buradan UDP porta gelen sinyalleri ayrıştıracağız. Byte tipinde gelen veriyi görebilmek için GetString Metodu ile string olarak alıp Richtextbox’a yazdırıyoruz.

Richtextbox’a verileri yazdırmak için Appendtextbox metodunu oluşturuyoruz.

Verileri Parçalayarak oluşturduğumuz veritabanına değerleri yazmaya başlayalım…

Bu aşamadan önce verilerinizi kaydedebileceğiniz bir veritabanı oluşturun ve Trafik isminde bir tablo ekleyin. Tabloda dedektörümüzün algıladığı anlık değerleri göstermeniz yeterli olacaktır.Örneğimiz için Kayitid ,Cihazid , Saat , Tarih , Sicaklik , Basinc sütunlarını oluşturmalısınız.

Sinyali Parçalayacak fonksiyonun açıklamalarını anlaşılır olması için satır aralarında yapacağım.

Sinyali Parçalayıp Veritabanına yazdığımıza göre artık Trafiği sonlandırabilmemizi sağlayacak Thread Sonlandırma butonunu oluşturabiliriz.

Böylece UDP portuna veri yazan bir cihazın sinyal dinleyicisini hazırlamış olduk.

3. Bölümde TCP porta veri gönderen ,ve cevap alan bir Sunucu-Client programı yazacağız. Yeni makalemizde görüşmek üzere…

Ebru Aksoylu

Ebru Aksoylu

Posts Facebook

Bilgisayar bilimleri tutkunu ve malulen emekli voleybol oyuncusu. Sektörde Full Stack Developer ve Takım Liderliği gibi görevlerde bulundu. Şuan bir banka iştirakinde uyg. geliştirme müdür yardımcısı olarak çalışıyor.

7 responses to Socket Programlama Bölüm -2

  1. Yazının 2 nci bölümü beklediğimden hızlı geldi. Kendi adıma teşekkür ederim. Gelen verileri RichTextBox nesnesine yazdırdıktan sonra, nesne içerisindeki verileri silmemiz gerekiyor mu? Yoksa verilerin kalmasının herhangi bir sakıncası yok mu? Geniş çaplı işletmeler için (gelen veri yoğunluğu açısından) verimli olabilir mi?

  2. Ebru Aksoylu

    Richtextbox nesnesine yazılan veriler 10 yada 20 satırı geçtikçe sildirebilirsiniz. Sinyalleri Richtextbox’a yazdırmak sadece dinleyiciye görsellik katar ve verinin gelip gelmediğine dair fikir edinmemizi sağlar. Fakat bunları Thread içinde kontrol ettirip ara ara temizletmeniz RAM belleğinizin şişmesini engeller.

  3. Öncelikle Türkçe yazılım kaynaklarının sıkıntılı derecede kötü ve az olduğu şu zamanlarda düzenli ve net bir anlatım görmüş olmak “Yazılıma kadın eli değdi.” dedirtti bana sonunda. Teşekkürler çok işime yaradı.Kolay gelsin.

  4. İbrahim Adam 21 Haziran 2015 at 12:01

    iyi günler ebru hanım;
    benim buna benzer bir sorunum var yardımcı olacağınızı düşünüyorum, bitirme projem için c# ortamında bir arayüz tasarlandı ve cihazımıza bir adet tetik mesajı geldiği zaman verileri göndermeye başlıyor bu işlemi seri port ile yapabliyoruz fakat bizi udp ile de lazım sahsınıza mail atsam yardımcı olabilir misiniz ?

  5. Kamil ÜNLÜ 25 Mart 2016 at 15:11

    Devamı yokmu ?

  6. databesede sinyalleri işlerken, udpden aldıgımız sınyallerı mı kullanıyoruz database bağlantısıyla detektörden mi alıyoruz sinyalleri

  7. Ebru Aksoylu

    @blenao udp porttan ham sinyali alıyoruz. Sinyali aldığımız sunucuda bir dinleyici uygulama yazıyoruz. Bu uygulama ile ham sinyali parçalayıp klasik yöntemlerle veritabanına yazıyoruz.
    Lakin bunlar big data meydana getiren sistemlerde kullanılmıyor. Daha efektif ve asenkron işlemler yapmak gerekiyor.

    Makalelerin devamında aşama aşama daha ileri seviyeleri göreceğiz. Uzun bir zaman bu bölümle ilgilenemedim. Pek yakında devamı gelecek. Bunun dışında benimle iletişim kuran arkadaşlara yardımcı olmaya çalışıyorum.

    Başarılar

Yorum yapmak için