Afyon Kocatepe Üniversitesi BİDB: Stajyer Bilgisayar Mühendisi
2014
2014 — AKÜ Bilgi İşlem Daire Başkanlığı Yazılım Şubesi'nde RFID, RS232, UID işleme, veri tabanı, seri port izleme ve Arduino tabanlı kartlı geçiş sistemleri üzerinde uçtan uca yazılım-donanım entegrasyonu.
2014 yazındaki stajımı Afyon Kocatepe Üniversitesi Bilgi İşlem Daire Başkanlığı Yazılım Şubesi'nde gerçekleştirdim. Başlangıçta çalışma alanı üniversitenin kartlı geçiş sistemlerinde kullanılan RFID okuyuculardı. Kısa süre içinde bunun yalnızca kart numarasını okuyup ekrana yazdırma problemi olmadığı ortaya çıktı. Elektriksel arayüz, seri haberleşme, cihaz protokolü, UID gösterimi, veri tabanı ve kullanıcı uygulaması aynı veri akışının farklı katmanlarıydı.
Bu dönem benim için uygulama geliştirme ile sistem geliştirme arasındaki farkı ilk kez belirgin biçimde gördüğüm kurumsal çalışmalardan biridir. Bir sorunla karşılaştığımda yalnızca ekrandaki hata mesajına veya uygulama koduna bakmak yerine, verinin fiziksel kaynağından başlayıp veri tabanındaki son karşılığına kadar izlenmesi gerektiğini burada öğrendim.
RFID ve RS232 ile Başlayan Çalışma
İlk çalışmalar Promag MF7-20 RFID okuyucular üzerinde yürüdü. Okuyucunun RS232 çıkışını bilgisayarda güvenilir biçimde gözlemleyebilmek için MAX232 tabanlı bir devre kuruldu; güç, TX/RX hatları ve bağlantı parametreleri cihaz dokümantasyonuyla birlikte incelendi. Ham seri akışı terminal yazılımıyla takip ederek STX/ETX sınırları arasındaki UID bilgisini ayırdım ve baud rate, parity, data bits gibi parametrelerin veri üzerindeki etkilerini gözlemledim.
Buradaki amaç hazır bir SDK kullanmak değildi. Önce cihazın gerçekten hangi byte dizisini gönderdiğini anlamak, sonra uygulama katmanını bunun üzerine kurmak gerekiyordu. C# tarafında SerialPort kullanarak ham veriyi alan, byte dizisini hexadecimal olarak gösteren ve terminal uygulamasından görülen veriyle karşılaştırmaya imkân veren araçlar geliştirdim.
Staj boyunca PCR310 ve Verifone QX1000 dahil farklı kart okuyucularla da çalıştım. Aynı amaca hizmet eden cihazların protokol ve bağlantı davranışlarının birbirinden farklı olması, cihaz bağımlı kod ile genel veri işleme mantığını ayırmanın önemini gösterdi.
Arızayı Yazılımda Varsaymamak
İlk okuyuculardan birinde beklenen UID elde edilemediğinde problem yazılım, seri port ayarları, veri dönüşümü, farklı devreler ve farklı bilgisayarlar üzerinden araştırıldı. Üreticiyle teknik görüşmelerin ve alternatif donanım denemelerinin ardından okuyucu değiştirilince doğru veri elde edildi.
Bu olayın benim için önemli tarafı sonucun "cihaz arızalıymış" olması değildi. Bir entegrasyon probleminde hipotezleri katman katman elemek gerektiğini erken dönemde göstermesiydi. Donanımın doğru çalıştığı kanıtlanmadan uygulama kodunu sürekli değiştirmek, hatayı çözmek yerine belirsizlik üretir.
Yeni cihazla doğru veri alındığında bu kez farklı bir veri gösterimi problemi ortaya çıktı. Okuyucudan gelen örnek bir UID F23ACBD2 biçimindeyken veri tabanındaki karşılığı D2CB3AF2 olarak tutuluyordu. Byte sırasındaki bu farklılık belirlenerek dönüşüm uygulama katmanında gerçekleştirildi ve sonuç veri tabanındaki kayıtla karşılaştırılarak doğrulandı.
Bu küçük örnek, daha sonraki çalışmalarımda sık karşılaşacağım bir ilkenin erken halidir: aynı bilgi protokol, bellek veya depolama katmanında farklı fiziksel temsillere sahip olabilir; dönüşüm yapılmadan önce hangi temsilin hangi sınırda kullanıldığı netleştirilmelidir.
Farklı Cihazların Davranışını Çözümlemek
PCR310 tarafında mevcut örnek yazılımın cihazla nasıl haberleştiğini inceleyerek istek-cevap akışını çözümledim. Bir Visual Basic örneğinin davranışını okuyup C# tarafında yeniden gerçekleştirerek port açma, request gönderme, anticollision sonucunu alma ve UID'yi kullanılabilir biçime dönüştürme akışını kurdum.
Verifone QX1000 çalışması ise yazılım ile fiziksel bağlantının birlikte ele alınmasına iyi bir örnek oldu. Beklenen pin dizilimiyle iletişim kurulamayınca kabloyu multimetreyle kontrol ederek gerçek bağlantıyı çıkardım. Cihazın komut satırı aracından üretilen çıktıyı işleyen bir C# uygulaması geliştirerek gelen alanları ayrıştırdım.
Bu çalışmaların ortak noktası belirli bir marka veya model değildi. Farklı bir donanım geldiğinde önce fiziksel bağlantıyı, sonra protokolü ve veri çerçevesini, en son uygulama entegrasyonunu doğrulama alışkanlığı kazandım.
İhtiyaçtan Doğan Seri Port Araçları
Kullandığım terminal uygulamalarının çalışma sırasında ihtiyaç duyduğum bazı özellikleri karşılamaması üzerine kendi seri port terminal ve izleme yazılımlarımı geliştirdim. Port adı, baud rate, parity, data bits ve stop bits gibi parametrelerin çalışma sırasında yönetilebildiği; alınan ham verinin ve işlem günlüğünün dosyada tutulabildiği bir masaüstü araç hazırladım.
Günlük kaydı yalnız hata mesajı göstermek için kullanılmıyordu. Yapılan işlemin zamanı, port yapılandırması ve oluşan hata birlikte tutulduğunda daha önce gerçekleşmiş bir iletişim problemini geriye dönük incelemek mümkün hale geliyordu.
Daha sonra aynı veri akışını web üzerinden gözlemlemek için ayrı bir izleme katmanı geliştirdim. Masaüstü terminalinin ürettiği dosyanın tamamını her istekte yeniden okumak yerine son okunan konum takip edilerek yalnız yeni eklenen kısmın alınmasını sağladım. Ham byte verisi hexadecimal, günlük metni ise karakter verisi olarak işleniyor ve web arayüzü periyodik olarak güncelleniyordu.
Masaüstü terminali, kalıcı günlük ve web izleme katmanı birlikte küçük ölçekli bir data acquisition -> persistence -> remote observation zinciri oluşturuyordu. Problemi ayrı sorumluluklara bölme yaklaşımı daha sonraki uzun süre çalışan sistem çalışmalarımda da devam etti.
Veri Tabanı ve Metadata Tabanlı Yönetim Aracı
RFID sisteminin yalnız kart okuması yeterli değildi. Kart, kullanıcı ve yetki bilgilerinin tutarlı biçimde yönetilmesi gerekiyordu. SQL Server üzerinde kullanıcı ve kart verilerini içeren bir veri modeli oluşturdum ve ardından Java ile bu veri tabanını yöneten masaüstü uygulaması geliştirdim.
Uygulamada sabit bir tabloya göre form tasarlamak yerine JDBC metadata kullanmaya yöneldim. Tablo ve sütun bilgileri, veri türleri ve birincil anahtarlar çalışma zamanında okunuyor; tablo görünümü ve düzenleme ekranı bu metadata'ya göre oluşturuluyordu.
Bu yaklaşım staj düzeyindeki bir araç için gerekenden daha genel görünse de benim açımdan önemliydi. Veri tabanı şeması değiştiğinde uygulamanın mümkün olduğunca az sabit varsayıma bağlı kalması fikrini burada uygulamaya başladım.
UID Dönüşümü ve Veri İşleme
Staj boyunca 7 byte ve 4 byte UID gösterimleri, byte-order farklılıkları ve veri tabanındaki mevcut kayıt biçimleri arasında çeşitli dönüşüm problemleriyle çalıştım. Ham UID'yi alıp sistemde kullanılan biçime dönüştüren, binary ve hexadecimal karşılıkları gösterebilen ve ilgili kayıtlarla karşılaştırabilen yardımcı uygulamalar geliştirdim.
Dönemin bazı örneklerinde kart verisinin doğrudan düz metin olarak tutulmaması için kriptografik API'leri de denedim. Bunlar modern anahtar yönetimi veya erişim kontrolü tasarımı değildi; veri biçimi ile veri koruma problemini aynı akış içinde ele aldığım erken denemelerdi.
Arduino ile Fiziksel Geçiş Kontrolü
Stajın ilerleyen bölümünde RFID okuyucuyu yalnız bilgisayara bağlanan bir çevre birimi olmaktan çıkarıp fiziksel geçiş mekanizmasına bağladım. Arduino UNO, servo motor, LED ve MF7 okuyucu kullanarak kart bilgisine göre servo hareketi üreten küçük bir kartlı geçiş sistemi kurdum.
Karttan gelen seri veri okunuyor, izin verilen kimlik bilgisiyle karşılaştırılıyor ve sonuca göre servo motor üzerinden fiziksel geçiş davranışı oluşturuluyordu. Daha sonra kızılötesi kumanda ile alternatif kontrol denemeleri ve Arduino ile haberleşen masaüstü kapı kontrol yazılımı üzerinde de çalıştım.
Bu bölüm bilgisayar mühendisliği ile mekatroniğin pratikte nerede birleştiğini görmem açısından ayrıca değerlidir. Yazılım artık yalnız ekranda sonuç üretmiyor; yanlış bir durum kararı fiziksel bir aktüatör davranışına dönüşüyordu.
Stajın Teknik Karşılığı
Bir aylık çalışma sonunda üç farklı kart okuyucudan veri alınması, seri haberleşme araçları, UID dönüşümleri, kullanıcı/kart veri tabanı, masaüstü ve web izleme yazılımları, Arduino tabanlı geçiş sistemi ve çeşitli yardımcı veri işleme araçları aynı problem alanı etrafında oluştu.
Bu bölüm 2014'te tuttuğum ayrıntılı staj kayıtlarındaki teknik olaylara dayanır. RFID okuyucudan veri tabanına ve fiziksel aktüatöre uzanan zincirde karşılaştığım problemler, sonraki sistem çalışmalarımda benimsediğim hata ayıklama ve entegrasyon yaklaşımının erken örneklerini oluşturdu.
Bu dönemin bende bıraktığı kalıcı alışkanlıklar somuttur: ham veriyi görmeden üst katman varsayımı yapmamak, donanım arızasını yazılım hatası kabul etmemek, protokol sınırlarını açık biçimde belirlemek, tekrarlanan manuel işlemi araçlaştırmak ve bir prototipi mümkün olduğunca uçtan uca çalışır hale getirmek.
Afyon Kocatepe Üniversitesi Bilgi İşlem Daire Başkanlığı