Python + Android (IP Webcam) İle Barkod Okuyucu Benim Pos Satış Entegrasyonu

Dün akşam şans eseri @KerimCETINBAS üstad ile sohbet ederken böyle bir projeden bahsetmiştim, normalde webcam ile yapmayı planlıyordum ama cep telefonu daha mantıklı geldi ve bunu python ile yaptım. Burada ki yapmak istediğim asıl mantık telefon kamerası sürekli açık durması ve okunan ürünlerin barkodu nu ayarlanan tarayıcıda ki benimpos satış ekranına gönderimi sağlanılması. Şuan itibarıyla projenin %95'ini tamamladım. okuyup post ediyor sistem çalışıyor ancak ufak tefek düzenlemeleri gerekmektedir. Bittikten sonra bu konunun altında paylaşacağım.
Aşağıdaki makale, verdiğiniz telefon (IP-kamera) barkod/QR + BenimPOS entegrasyonu uygulamasını “öğretmen gibi” adım adım anlatır: mimari akış, kullanılan kütüphaneler, önemli kod noktaları, kurulum-çalıştırma, sık hatalar ve genişletme önerileri.
1) Ne yapıyoruz? (Özet)
Bu uygulama:
- Telefonu/IP kamerayı (mjpeg/shot.jpg gibi HTTP uçları) video kaynağı yapar.
- Barkod/QR okur (OpenCV QRCodeDetector + opsiyonel pyzbar).
- Okunan kodları SQLite/CSV/Seri port/klavye wedge olarak dışarı verir.
- Tekrarlı okumalara karşı bastırma süresi (cooldown) uygular.
- Ağ taraması ile yerel IPv4 /24 üzerinde otomatik kamera keşfi yapar.
- CDP (Chrome DevTools Protocol) ile BenimPOS giriş alanına metni yazar ve Enter basar.
- Rotating log ile hataları/anlık durumu kaydeder (logs/app.log).
Kısaca: “Telefon kamerasını barkod okuyucuya” çevirip, BenimPOS satış ekranına anında yazan pratik bir masaüstü aracı.
2) Mimari genel akış
URL normalizasyonu: Kullanıcı “http:192.168.1.101:8080” gibi bozuk bir adres yazsa bile normalize_camera_url() düzeltiyor (şema ekleme, path düzeltme, IP doğrulama vb.).
Akış/Snapshot bağlantısı: CameraWorker akış (mjpeg) ya da snapshot (periyodik JPEG) modunda görüntü çeker.
Çözümleme: Her karede
Bastırma (no-repeat): Aynı kod kısa sürede tekrar görülürse atlanır (cooldown ms).
Çıkışlar: SQLite’e yaz, CSV’ye ekle, seri porta gönder, klavye wedge ile yaz, CDP ile BenimPOS alanına bas.
Loglama: Her adım logs/app.log dosyasına dökülür (dönen loglar).
Ağ tarama: DiscoverWorker yerel /24 ağda tipik port+yolları gezip çalışan snapshot/akış URL’lerini bulur.
3) Kurulum
Gerekli paketler
pip install pyqt5 opencv-python numpy requests
pip install websocket-client
pip install pyzbar # (opsiyonel ama tavsiye)
pip install simpleaudio # (opsiyonel, WAV bip için)
pip install pyautogui # (opsiyonel, wedge için)
pip install pyserial # (opsiyonel, seri port için)
Windows’ta pyzbar için ek bağımlılık (ZBar DLL) gerekebilir. Alternatif olarak sadece OpenCV QR okuyucu da çalışır.
Kamera uygulaması önerisi
- Android: IP Webcam, DroidCam, Iriun, vs.
- Uygulama IP ve portu gösterir (örn.
http://192.168.1.101:8080/video veya /shot.jpg).
BenimPOS için tarayıcı başlatma
Sağlanan .bat dosyası Brave/Chrome’u CDP (uzak hata ayıklama) modunda açar:
--remote-debugging-port=9222
- Ayrı bir kullanıcı profili klasörü (
C:\BraveDebug)
--remote-allow-origins= ile 403 riskini azaltma
Bat’ı çift tıklayın, açılan tarayıcıda BenimPOS sekmesi görünsün. Sonra uygulamadaki “BenimPOS’a gönder (CDP)” kutusunu işaretleyin.
4) Uygulamayı çalıştırma
python main.py
Ana pencere:
- URL kutusuna IP kamera adresini yazın (bozuk yazsanız da toparlanır).
- Snapshot modu isterseniz işaretleyin ve periyot (ms) belirleyin.
- Bastırma (ms) ile tekrarlanan okuma engelleme süresini belirleyin.
- Başlat deyin, görüntü akmaya başlayınca barkod/QR’ı okutun.
- “Oto Bul (Ağ Tara)” ile otomatik bulunan URL’ler sağdaki kutuya düşer.
Çıkışlar:
- SQLite (varsayılan açık)
- CSV (dosya seçin)
- Klavye wedge (aktif pencereye yazar + Enter)
- Seri port (COM ve baud ayarlayın)
- WAV bip / Sistem bip
- BenimPOS’a gönder (CDP) (port, domain ve CSS selector ayarlayın; varsayılan:
#urun_barkodu)
5) Önemli kod parçalarını anlamak
5.1 Loglama (Rotating)
fh = RotatingFileHandler("logs/app.log", maxBytes=1_000_000, backupCount=3)
- Log 1 MB’ı geçince döner, 3 yedek tutar.
- Hatalar
log_exception() ile stack trace olarak yazılır.
5.2 URL normalizasyonu
normalize_camera_url("http:192.168.1.101:8080")
# → http://192.168.1.101:8080/video
http// → http://
- Şema yoksa ekler
http://http:IP:PORT/... gibi bozuk netloc’u onarır
- IP dört oktet ve 0–255 kontrolü
- Path boşsa /video’ya yönlendirir (mjpeg uygulamalarında pratik varsayılan)
Neden? Saha kullanımında yazım hataları çok olur; kullanıcıyı kurtarır.
5.3 Kamera iş parçacığı
snapshot_mode=True → periyodik JPEG okur (/shot.jpg vb.)
Aksi durumda akış dener. Adresten türetilen candidate listesi oluşturur:
Port listesi: p.port (geçerliyse) + [8080,4747,8888,8000,8181,80]
Yol listesi: /video, /mjpeg, /mjpg, /stream, /videofeed, /shot.jpg
Port okunurken ValueError yakalanır ve loglanır:
“Port could not be cast to integer value…” tipi hatayı akışı bozmadan atlayıp devam eder.
5.4 Barkod/QR çözümleme
- pyzbar varsa: EAN13/EAN8/UPCA/CODE128/CODE39/QRCODE/DATAMATRIX
- OpenCV QRCodeDetector: pyzbar yoksa da QR okur.
- Bastırma (cooldown): Aynı (tip, veri) kısa sürede tekrar gelirse atla.
- UI’de “Tek seferlik okuma” ile global tekrar engeli (aynı veriyi tümden yok say) de var.
5.5 Çıkış katmanı
_apply_outputs() şu aksiyonları uygular:
- SQLite (
barcodes.db → scans tablosu: ts,type,data,source,camera_url)
- CSV (başlık otomatik eklenir)
- Klavye wedge (pyautogui → aktif pencereye yazar ve Enter basar)
- Seri port (varsa
data + "\r\n" yaz)
- Başarısız olanlar loglanır ve tabloya “HATA” etiketi düşer.
5.6 BenimPOS entegrasyonu (CDP)
CDPClient:
http://127.0.0.1:9222/json’dan açık sekmeleri alır, domain filtre ile hedefi bulur.
- WebSocket ile bağlanır,
Runtime.evaluate ile JS enjekte eder:
var el = document.querySelector("#urun_barkodu");
el.value = "1234567890";
el.dispatchEvent(new Event('input', {bubbles:true}));
el.dispatchEvent(new Event('change', {bubbles:true}));
// Enter tetikleri
- 403 görürseniz bat dosyasındaki
--remote-allow-origins=* (geçici) satırını deneyebilirsiniz.
- Selector alanını UI’dan değiştirebilirsiniz.
6) Çoklu kamera sekmeleri
PhoneCamWidget → “Yeni Kamera Sekmesi” ile birden çok CameraPanel aynı anda çalışır. Tek bir SQLite dosyasına yazar.
7) Ağ taraması (Oto Bul)
DiscoverWorker:
- Yerel IP’den /24 çıkarımı yapar (örn.
192.168.1.0/24).
- Tipik port+path kombinasyonlarını hızlıca dener.
- Çalışan bir snapshot/akış bulursa emits → sağdaki kutuya eklenir.
Tarama agresiftir; güvenlik duvarında çok kısa zaman aşımları olabilir. Log’a bakın.
8) .bat dosyası (CDP modunu zahmetsiz açma)
- Brave varsa onu, yoksa Chrome’u dener.
- Uzak hata ayıklama portu açar (9222).
- Ayrı profil klasörü ile (C:\BraveDebug) test ortamınızı izole eder.
- Açıldıktan sonra “http://127.0.0.1:9222/json” üzerinden sekme listesi görünmelidir.
9) Sık karşılaşılan hatalar ve çözümler
- “Port could not be cast…” (ValueError)
→ Kod çözüldü: urlparse(...).port okuması try/except ile korunuyor; loga yazar, akış denemeye devam eder.
- pyzbar yok / ZBar DLL eksik
→ QR yine OpenCV ile okunur. 1D kodlar için pyzbar kurun ya da alternatif yol ekleyin.
- CDP 403 / Bağlanamıyor
→ Tarayıcıyı .bat ile açın; gerekirse geçici --remote-allow-origins=*. Doğru port, domain filtre ve selector kullandığınızdan emin olun.
- Akış yok, snapshot var
→ Snapshot moduna geçin ve /shot.jpg yolunu deneyin. Bazı IP Webcam uygulamaları mjpeg yerine sadece snapshot verir.
- Wedge yazmıyor
→ pyautogui kurulu mu? Hedef pencere odakta mı? Güvenlik ayarları (UAC) engelliyor olabilir.
- Seri port hatası
→ COM adı doğru mu? Bağışıklamak için UI’daki Seri Port uyarmasını takip edin; log’a bakın.
10) Performans ve doğruluk ipuçları
- Işık/Netlik: Kontrastı iyi, sabit odaklı kamera daha iyi okur.
- Çözünürlük: Çok düşük kare boyutu zayıf okur; çok yüksek çözünürlük CPU’yu yorabilir. Orta bir denge seçin.
- Preprocess: Gerekirse gri ton üzerine CLAHE, adaptive threshold, keskinleştirme ekleyebilirsiniz (geliştirme alanı).
- Cooldown ayarı: Hızlı kasada 600–900 ms, nazik sistemlerde 1200–1500 ms iyi bir aralık.
11) Güvenlik ve yetkiler
- CDP, açık sekmeye JS enjekte eder. Bu yüzden yalnız güvenilir sayfalarda kullanın.
- Seri port, wedge gibi özellikler sistem erişimi ister; antivirüs/savunma yazılımları izin sorabilir.
- Log dosyalarında kredi kartı, kişisel veri gibi hassas barkodları saklamayın (gizlilik politikası).
12) Genişletme önerileri
- RTSP desteği: Bazı IP kameralar RTSP verir (
rtsp://…). OpenCV VideoCapture(rtsp_url) ile deneyebilirsiniz (URL normalizatörüne RTSP şeması eklenebilir).
- PDF417: Pyzbar’da PDF417 gürültülü uyarı verebilir; istenirse filtre ile kapatılabilir (şu an “susturma” notu var).
- Filigran/Overlay: Görüntü üzerine son okunan kodu overlay yazma.
- Webhook/HTTP POST: Kod geldiğinde bir REST API’ya push etme.
- Yetkili cihaz listesi: Ağ tarama sonuçlarını beyaz liste ile filtreleme.
13) Mini SSS
S: pyzbar kurmadan 1D (EAN/Code128) okur mu?
C: Hayır; 1D için pyzbar gerekiyor. pyzbar yoksa yalnızca OpenCV’nin QR okuyucusu çalışır.
S: BenimPOS selector’u neden değiştirilebilir?
C: Tema/sürüm farklarında input’un CSS seçicisi değişebilir. Default #urun_barkodu ama UI’dan güncelleyebilirsiniz.
S: Aynı barkodu iki kere okutmak istiyorum.
C: “Tek seferlik okuma”yı kapatın veya “Görülenleri Sıfırla”ya basın. Cooldown süresini de düşürebilirsiniz.
14) Hızlı kontrol listesi
- [ ] Telefon/IP kamera açık, IP’ye ping atabiliyorum.
- [ ] URL’yi bozuk yazsam bile sahada normalize ediliyor (gerekirse elle
/video veya /shot.jpg).
- [ ] Başlat → kareler geliyor, QR/1D okunuyor.
- [ ] SQLite/CSV/Seri/Wedge aksiyonlarından en az biri başarıyla çalışıyor.
- [ ] BenimPOS sekmesi CDP portunda açık, selector doğru, Enter basılıyor.
- [ ]
logs/app.log’da hata yok / anlarsam düzeltiyorum.
Bu makaleyle, projeyi sadece “kullanır” değil, nasıl çalıştığını da “öğrenir” hale gelmiş olacaksınız. Eğer isterseniz bir sonraki adımda RTSP desteği, görüntü ön-işleme (CLAHE/threshold) veya Webhook eklemesini de birlikte kodlayalım.