12 اردیبهشت 1399
چنانچه این مطلب را میخوانید، نشان میدهد به یکپارچهسازی نرمافزارهایتان اهمیت میدهید و دوست دارید سامانه حضور و غیاب پرسنل شما جدا از سایر قابلیتهای نرمافزارِ تحتِ وب موسسهتان نباشد. چقدر عالی میشود اگر دستگاه تردد با دیتابیس - اطلاعات کاربران، تصاویر پرسنل، تعاریف حقوق و دستمزد و غیره - در ارتباط باشد.
حتما میدانید که دستگاههای تردد انواع گوناگونی دارند؛ دستگاههای ساعتزنی که با اثر انگشت، تشخیص چهره، تشخیص کف دست، کد عبور و کارت - یا همه موارد ذکر شده - ساعت ورود و خروج کارکنان را ثبت میکنند. ارتباط این دستگاهها با سیستم شما میتواند از طریق شبکه، پورت سریال و یا موارد دیگری باشد.
در اینجا به نحوه ارتباط شبکه با دستگاههای تردد ZKTeco و کتابخانه پیاچپی zklib میپردازیم. همینطور ارتباط با دستگاه از طریق نودجیاس را نیز بررسی میکنیم.
پیش از پیادهسازی کدها، طبیعتا میبایست کاربران را در خودِ دستگاه ساعتزن تعریف کرده باشید. ثبت کد کاربر (کد پرسنلی) در دستگاه اجباری است ولی الزامی به درج نام کاربر نیست چراکه با امکانِ اتصال به دیتابیسِ سرور، میتوانیم نام را - براساس کد کاربر - از جدول مربوط بخوانیم.
الف) توسط پیاچپی
ب) توسط نودجیاس
پس از دانلود کتابخانه php_zklib از طریق github یا بخش «دانلود» همین مقاله، آن را در برنامه خود فراخوانی میکنیم. فایلی که از github دانلود میکنید ممکن است با برخی دستگاههای جدید ZKTeco همخوانی نداشته باشد که من در بخش «دانلود» این ناهمخوانی را تاحدودی رفع کردهام.
<?php include("zklib/zklib.php"); ?>
حال با فرض اینکه کاربری در مقابل دستگاه ساعت زده باشد، نحوه عملکرد کدهای فوق و فراخوانی ترددهای ثبت شده در دستگاه به این شکل است:
با وارد کردن نشانی IP و پورت دستگاه به آن متصل یا connect می شویم
دستگاه را توسط دستور disableDevice غیر فعال میکنیم
آرایه ترددها در دستگاه را توسط getAttendance فراخوانی می کنیم. متغیر به دست آمده شامل اطلاعاتی نظیر کد کاربر، نوع تردد (ورود، خروج یا ماموریت که در دستگاه تعیین می گردد) و زمان تردد است
به کمک clearAttendance می توان اطلاعات تردد را از دستگاه پاک کرد
در نهایت دستگاه را به کمک دستور enableDevice فعال نمود و اتصال را قطع یا disconnect می کنیم
<?php include("zklib/zklib.php"); $deviceIP = "192.168.10.201"; $devicePort = 4370; $zk = new ZKLib($deviceIP, $devicePort); $zk->connect(); sleep(1); $zk->disableDevice(); sleep(1); foreach ($zk->getAttendance() as $att) { $user = $att[1]; $type = $att[2]; $date = $att[3]; echo $user." ".$date."<br>"; } $zk->clearAttendance(); $zk->enableDevice(); sleep(1); $zk->disconnect(); ?>
در پایان چنانچه میخواهید اطلاعات تردد را در دیتابیس ذخیره کنید پیش از صدا زدن clearAttendance کد کاربر و زمان تردد را در جدول مربوط به تردد ذخیره نمایید.
اساس کدنویسی نودجیاس نیز به همین صورت است. هرچند انتظار میرود که در این روش همزمان با ساعت زدن کاربر، روی دادِ فراخوانی انجام شود ولی اینطور نیست و میتوانید هر چند دقیقه - بنابر نیاز - تابع مربوطه را صدا بزنید. برای نصب کافی است کتابخانه node-zklib را نصب کنید.
npm i node-zklib
حال کدهای زیر را بررسی نمایید. در این روش نیز همانند روش اول، برنامه از طریق آیپی و پورتِ دستگاه به آن متصل میشود و آرایهای از اطلاعات را که شامل کد کاربر، نوع تردد و زمان تردد است، میخواند. تابعی نیز وجود دارد به نام getInfo که سه پارامتر برای شما بر میگرداند و شما با پارامتر logCounts میتوانید تشخیص دهید که چند تردد در دستگاه انجام شده است؛ در صورتی که این عدد از صفر بیشتر باشد getAttendances صدا زده شود.
const ZKLib = require('node-zklib'); let zkInstance; const attendance_conn = async () => { zkInstance = new ZKLib('192.168.10.201', 4370, 10000); try { await zkInstance.createSocket(); setTimeout(attendance_log,5000); } catch (e) { console.log('No Connection ZKTeco'); } } attendance_conn(); const attendance_log = async () => { let report = await zkInstance.getInfo(); let logCounts = report['logCounts']; if(logCounts > 0) { const attendences = await zkInstance.getAttendances(); for(var i=0;i<attendences.data.length;i++) { var date = attendences.data[i]['recordTime']; var user = attendences.data[i]['deviceUserId']; console.log(user +' '+date); } zkInstance.clearAttendanceLog(); } else { console.log('No Data ZKTeco '); } setTimeout(attendance_log,300000); }