Berke Özyaşar
Blog

Barkodlu depo uygulaması geliştirmek: kamera, OCR ve Zebra yazıcı

TCT Lojistik için geliştirdiğim depo uygulamasından notlar: telefon kamerasıyla barkod okuma, OCR, ZPL etiket baskısı, yazıcı keşfi ve mevcut sisteme bağlantı.

·

Bir depoda gün boyu çok sayıda koli girer ve çıkar. Bu hareketler önce kağıda yazılıp sonra sisteme girildiğinde hem zaman kaybediliyor hem de hata kaçınılmaz oluyor. Müşterimiz TCT Lojistik için geliştirdiğim depo uygulaması bu süreci telefona taşıyor: koliler kamerayla okutuluyor, kayıt anında firmanın sistemine düşüyor, etiketler ağdaki Zebra yazıcılardan basılıyor. Ben Berke Özyaşar; bu yazıda böyle bir uygulamayı geliştirirken verdiğim teknik kararları ve pratik dersleri paylaşıyorum.

Uygulama ne yapıyor?

  • Depoya yük girişi ve depodan yük çıkışı akışları
  • Telefon kamerasıyla barkod okuma, gerektiğinde OCR ile etiket üzerindeki yazıyı okuma
  • Araç plakası seçimi, koli listeleri ve çıkış yapılacak yüklerin genel görünümü
  • Yük sorgulama
  • Barkod etiketi oluşturma, ön izleme ve Zebra yazıcıdan baskı
  • Yerel ağdaki yazıcıları bulma ve yazıcı ayarları
  • JWT ile kullanıcı girişi

Uygulama React Native 0.81 ile yazıldı ve firmanın mevcut ASP.NET Core ve SQL Server altyapısına bağlanıyor.

El terminali mi, telefon mu?

Depo yazılımı denince akla ilk gelen, dahili lazer tarayıcısı olan endüstriyel el terminalleri. Bu cihazlar yoğun okutma yapılan depolarda hâlâ en hızlı ve en dayanıklı seçenek. Ama pahalılar ve her çalışana bir tane almak her işletme için mantıklı değil. Günümüz telefonlarının kameraları ise standart barkodları ve QR kodları gayet iyi okuyor.

İşin iyi tarafı, modern el terminallerinin çoğunun zaten Android çalıştırması. React Native ile yazılmış bir uygulama hem telefonda hem el terminalinde çalışabilir. Terminalin dahili tarayıcısı okuduğu kodu genellikle klavye girişi ya da sistem yayını (broadcast) olarak uygulamaya iletiyor; kamera okumasının yanına bu girişi eklemek mümkün. Yani cihaz kararı uygulamayı yeniden yazmayı gerektirmiyor.

Kamera ile barkod okuma

Kamera tarafında react-native-vision-camera kullandım. Uygulama Code 128, Code 39, Code 93, EAN-13 ve EAN-8 gibi depolarda yaygın formatları okuyor. Bu tür bir okuyucuda öne çıkan noktalar:

  • Taranacak formatları sınırlayın. Yalnızca depoda kullanılan formatları açmak hem hızı artırıyor hem de yanlış okumaları azaltıyor.
  • Aynı kodu iki kez saymayın. Kamera saniyede birçok kare işliyor ve aynı barkod art arda defalarca okunabiliyor. Kısa süre içinde tekrar gelen aynı kodu yok saymak gerekiyor.
  • Net geri bildirim verin. Okuma başarılı olduğunda belirgin bir işaret olmalı; depoda çalışan kişi ekrana dikkatle bakmıyor.
  • Gerçek etiketlerle test edin. Ofiste temiz bir çıktıyla yapılan test, buruşmuş, streçlenmiş ya da depo ışığında parlayan etiketlerdeki davranışı göstermiyor.

Barkod okunamadığında: OCR

Her etiket okunabilir durumda değil. Bu yüzden uygulamada ikinci bir tarama modu var: OCR modunda kamera görüntüsündeki metin de okunuyor, barkod ile etiket üzerindeki yazı birlikte tanınıp karşılaştırılabiliyor. Barkodun hasar gördüğü ama numaranın okunabildiği durumlarda çalışanın numarayı elle yazması gerekmiyor. OCR için vision-camera ile çalışan bir metin tanıma eklentisi kullandım; kareler kamera tarafında işlendiği için arayüz donmuyor.

Etiket basımı: ZPL ve Zebra

Zebra yazıcılar ZPL adlı bir komut dili kullanıyor. Basit etiketler doğrudan ZPL komutlarıyla tasarlanabilir; ama etikette logo, özel yazı tipleri ya da karmaşık bir düzen olduğunda bu zahmetli hale geliyor. Bu projede farklı bir yol izledim:

  • Etiket, uygulamada normal bir React Native bileşeni olarak tasarlanıyor ve ekranda ön izleniyor.
  • Bu bileşen bir görüntüye dönüştürülüyor.
  • Görüntü yazıcının çözünürlüğüne göre (203 dpi, 4x6 inç etiket) ölçekleniyor, gerekirse döndürülüyor ve siyah-beyaz bir bit haritasına çevriliyor.
  • Bit haritası sıkıştırılarak ZPL'in grafik komutu (^GFA) içine yerleştiriliyor ve yazıcıya gönderiliyor.

Bu yaklaşımın avantajı, ekranda ne görüyorsanız kağıtta onu almanız; etiket tasarımını değiştirmek için ZPL bilmek gerekmiyor. Dikkat edilmesi gereken nokta, ince çizgilerin ve barkod çubuklarının siyah-beyaza çevrilirken bozulmaması. Ölçekleme yöntemi ve eşik değeri burada belirleyici. Kullanıcının baskı ölçeğini ve konumunu ayarlayabilmesi de farklı etiket rulolarında işe yarıyor.

Yazıcıyı ağda bulmak

Zebra yazıcılar ağ üzerinden genellikle 9100 numaralı porttan ham veri kabul ediyor. Uygulama react-native-tcp-socket ile yazıcıya doğrudan TCP bağlantısı açıp ZPL verisini gönderiyor. Kullanıcının yazıcının IP adresini bilmesini beklemek yerine, uygulama yerel ağı tarayıp bu portu açık olan cihazları listeliyor. Taramayı paralel ama sınırlı sayıda bağlantıyla yapmak, ardından cevap vermeyen adresleri daha uzun bir zaman aşımıyla yeniden denemek, hem hızlı hem güvenilir sonuç verdi.

Mevcut sisteme bağlanmak

TCT'nin zaten çalışan bir sunucu altyapısı vardı. Uygulamayı bunun yerine değil, bunun üzerine kurdum: mobil uygulama mevcut ASP.NET Core API'siyle konuşuyor, veri SQL Server'da kalıyor. Kimlik doğrulama JWT ile yapılıyor; token cihazda saklanıyor ve her istekte gönderiliyor. Bu tür projelerde önerim hep aynı: mobil uygulama veritabanına doğrudan bağlanmamalı, arada yetkilendirme yapan ve yalnızca gereken işlemleri sunan bir API olmalı.

Depo kullanıcısı için tasarım

Depo uygulamasının kullanıcısı masa başında oturmuyor. Elinde koli var, belki eldiven giyiyor, ortam gürültülü. Bu yüzden ekranları büyük butonlar, az adım ve her ekranda tek bir ana iş ilkesiyle düşünmek gerekiyor. Giriş ve çıkış gibi en sık yapılan işlemler ana ekrandan doğrudan başlatılabilmeli; menü katmanları en aza inmeli.

Benzer bir alandan: Scano QR

Kamera ile tarama ve görüntüden metin çıkarma, Google Play'de yayında olan kendi uygulamam Scano QR'ın da konusu. Bu uygulama QR kodları tarıyor, yedi farklı şablonla QR kod oluşturuyor ve görüntülerden metin çıkarıyor. Farklı ışık koşullarında okuma ve kullanıcıya anlık geri bildirim gibi konular, tüketici uygulamasında da depo uygulamasında da aynı önemde.

Sonuç

Barkodlu bir depo uygulaması pahalı donanım almayı ya da mevcut sistemi değiştirmeyi şart koşmuyor. Telefon kamerası, iyi ayarlanmış bir tarama akışı, ekranda tasarlanıp ZPL'e çevrilen etiketler ve mevcut sunucuya bağlanan bir API ile depo kayıtları anlık hale gelebiliyor. Deponuz için benzer bir çözüm düşünüyorsanız barkodlu depo ve el terminali uygulamaları sayfasına göz atabilirsiniz.

Diğer yazılar

Uygulamanızı birlikte yayınlayalım.

Ne yapmak istediğinizi birkaç cümleyle anlatın. Aynı gün dönüş yapıyorum.

Gezinmek için ↑ ↓, açmak için Enter, kapatmak için Esc