شارك المقالة

واحدة من المشاكل الحقيقية اللي ممكن تقف قدام أي Flutter Developer هي التعامل مع Hardware مباشر — خصوصًا أجهزة زي قارئ البصمة. في المقال ده هحكيلك تجربة عملية في حل مشكلة ربط جهاز بصمة ZKTeco ZK8500R مع تطبيق Flutter POS، بدون أي مكتبة جاهزة.

المشكلة

كان المطلوب في نظام POS مبني بـ Flutter إن الموظفين يسجلوا حضور وانصراف باستخدام البصمة، مش بكلمة سر ولا PIN. لكن أول challenge ظهر كان:

  • مفيش أي مكتبة Flutter تدعم أجهزة ZKTeco
  • Flutter مش مصمم للتعامل المباشر مع Hardware
  • pub.dev مفيهوش أي حلول مناسبة

وده كان معناه إن الحل التقليدي مش موجود.

الفكرة الأساسية للحل

بدل ما ننتظر مكتبة تظهر، تم بناء حل كامل من الصفر باستخدام فكرة بسيطة:


Flutter ↔ REST API ↔ Python Agent ↔ Fingerprint Device

يعني بدل ما Flutter يتكلم مع الجهاز مباشرة، يتكلم مع API محلي.

⚙️ المعمارية (Architecture)

تم بناء Python Agent بيشتغل محليًا على الجهاز، وبيعمل:

  • التواصل مع جهاز ZKTeco باستخدام pyzkfp
  • تشغيل REST API على port 9201
  • إدارة قراءة ومطابقة البصمات

API Endpoints


/connect
→ فتح الاتصال بالجهاز وتشغيل background polling

/load_templates
→ تحميل بصمات الموظفين من Firebase إلى الذاكرة

/status
→ معرفة هل في بصمة حالياً (Polling كل 500ms)

/identify
→ مطابقة البصمة مع المستخدمين وإرجاع user_id

/clear_pending
→ مسح البصمة السابقة قبل أي scan جديد

التكامل مع Flutter

تم استخدام مكتبة Dio لإرسال HTTP Requests:


final response = await dio.get('http://localhost:9201/status');

Flutter بيتعامل مع الـ agent كأنه backend عادي جدًا.

Flow النظام

1. تسجيل الحضور (Check-in)

  • الموظف يسجل بصمته
  • الأدمن يوافق ببصمته
  • يتم تسجيل العملية في Firestore

2. تسجيل الانصراف (Check-out)

  • نفس الفلو السابق

3. العمليات المالية

  • أي تعديل مالي يحتاج بصمة الأدمن

UI Component

تم بناء Widget موحد:


FingerprintDialog

ويحتوي على حالات:

  • Waiting
  • Scanning
  • Success
  • Failed

مع دعم:

  • Animations
  • Auto Retry
  • Reusable في أكثر من مكان

المشكلة التقنية الأصعب

أثناء استخدام pyzkfp ظهر الخطأ:


RuntimeError: Initialize clr before importing

السبب كان إن pythonnet 3.x غيّر طريقة التهيئة.

الحل

إضافة سطر واحد قبل import clr:


import pythonnet
pythonnet.load('netfx')

import clr

سطر واحد حل مشكلة debugging استمرت لساعات.

النتيجة

  • النظام شغال في بيئة production
  • تسجيل حضور وانصراف بالبصمة بدون Keyboard
  • تكامل كامل بين Flutter + Python + Hardware

المميزات

  • حل قابل للتوسعة لأي جهاز Hardware
  • فصل واضح بين Flutter و Hardware Layer
  • سهولة الصيانة والتطوير

العيوب

  • الحاجة لتشغيل Agent محلي
  • تعقيد أعلى في البداية
  • إدارة Deployment للـ Python service

الخلاصة

عدم وجود مكتبة مش نهاية الطريق. أحيانًا ده معناه إنك تبني حل أفضل — ويمكن كمان يكون أساس لمنتج أو مكتبة يستخدمها غيرك.

مصادر مفيدة



مزيد من المقالات من موقعنا : كيف تجعل واجهات تطبيقاتك في Flutter متجاوبة مع جميع الشاشات باستخدام MediaQuery و GridView
مزيد من المقالات : مراقبة حالة الاتصال بالإنترنت باستخدام Flutter وDart
شاهد أيضًا
مقالات ذات صلة

🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع