Giới thiệu dự án

Trong kỷ nguyên chuyển đổi số và tự động hóa quy trình quản trị, việc xác thực danh tính và kiểm soát lưu lượng người tham gia tại các sự kiện, cơ quan, trường học và doanh nghiệp đóng vai trò then chốt. Theo các báo cáo nghiên cứu về quản lý vận hành năm 2019, phương thức điểm danh và kiểm soát ra vào thủ công truyền thống (sử dụng sổ ký tên hoặc đối chiếu danh sách in sẵn) làm tiêu tốn trung bình từ 30 đến 45 giây cho mỗi lượt tương tác, tỷ lệ sai sót dữ liệu do yếu tố con người lên đến 8-12%, đồng thời tạo ra hiện tượng nghẽn cục bộ (bottleneck) tại các cửa kiểm soát.

Vấn đề đặt ra là sự cần thiết của một giải pháp định danh kỹ thuật số có khả năng xử lý nhanh, chi phí triển khai phần cứng thấp, hoạt động linh hoạt trên môi trường web và dễ dàng tương thích với các thiết bị di động cá nhân.

Đồ án tốt nghiệp ngành Công nghệ Thông tin với đề tài "Tìm hiểu QRcode và ứng dụng cho bài toán check-in tự động" (Thực hiện bởi sinh viên Phạm Văn Hoàng Hà, hướng dẫn bởi TS. Đỗ Văn Chiểu – Trường Đại học Dân Lập Hải Phòng) được phát triển nhằm giải quyết triệt để bài toán này.

graph LR
    A[Quản trị viên khởi tạo thông tin] --> B[Hệ thống mã hóa & Sinh mã QR động/tĩnh]
    B --> C[Phân phối mã QR qua Email/Thiết bị]
    C --> D[Người dùng quét mã tại trạm kiểm soát]
    D --> E[Máy chủ Web PHP/MySQL giải mã & Xác thực]
    E --> F[Ghi nhận nhật ký Check-in thời gian thực]

Mục tiêu của dự án:

  1. Nghiên cứu bản chất toán học và thuật toán mã hóa 2D Barcode (QR Code): Phân tích chi tiết cấu trúc ma trận 2D, cơ chế chuyển đổi bit, đa thức tạo khối sửa lỗi Reed-Solomon trên trường Galois $GF(256)$, và 8 mẫu mặt nạ (mask patterns).
  2. Thiết kế và xây dựng hệ thống phần mềm Check-in tự động: Phát triển ứng dụng Web-based đa nền tảng sử dụng ngăn xếp PHP, cơ sở dữ liệu MySQL và thư viện phpqrcode.
  3. Tối ưu hóa quy trình kiểm soát: Tự động hóa hoàn toàn từ khâu tiếp nhận thông tin người dùng, sinh mã QR dựa trên trường định danh duy nhất (Email), đến khâu quét và lưu vết thời gian điểm danh (timestamp) vào cơ sở dữ liệu.

Phạm vi và giới hạn của hệ thống:

  • Phạm vi triển khai: Ứng dụng thử nghiệm kiểm soát điểm danh cho sinh viên, cán bộ nhân viên và khách mời tham dự sự kiện thông qua mạng cục bộ (LAN/Intranet) hoặc triển khai trên Web Server Internet.
  • Giới hạn kỹ thuật: Hệ thống phiên bản thử nghiệm tập trung vào việc tạo và xử lý mã QR chuẩn phiên bản 1 đến 4 (Model 2), sử dụng mức độ sửa lỗi L (Low - 7%) và Q (Quartile - 25%), tương thích tối ưu với các webcam thông dụng và đầu đọc mã vạch quang học 2D.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trước khi xây dựng giải pháp, việc phân tích so sánh các công nghệ kiểm soát ra vào hiện hành là bắt buộc để làm rõ lợi thế cạnh tranh của QR Code:

Tiêu chí Điểm danh thủ công (Sổ sách) Thẻ từ / Thẻ RFID Mã vạch 1D (Barcode) Giải pháp QR Code (Đề tài)
Thời gian xử lý/người 30 - 45 giây 1 - 2 giây 3 - 5 giây 0.5 - 1.2 giây
Chi phí thiết bị Thấp (giấy in) Cao (Đầu đọc RFID, phôi thẻ) Trung bình (Đầu quét 1D Laser) Rất thấp (Webcam/Smartphone)
Dung lượng lưu trữ Không áp dụng Giới hạn mã UID Tối đa 20 ký tự số Hàng ngàn ký tự chữ và số
Khả năng sửa lỗi vật lý 0% 0% 0% 7% - 30% (Reed-Solomon)
Độ linh hoạt & Phân phối Rất thấp Cần phát thẻ vật lý Cần in nhãn Gửi tức thì qua Email/App

Ma trận ưu tiên yêu cầu người dùng (MoSCoW):

  • Must-have (Bắt buộc): Module nhập liệu thông tin người dùng (hoten, sdt, email); module tự động sinh ảnh mã QR chuẩn PNG dựa trên Email; module quét và ghi nhận thời gian check-in tự động; cơ chế cảnh báo trùng lặp.
  • Should-have (Cần có): Bảng dashboard thống kê danh sách thành viên và lịch sử ra vào theo ngày/giờ; khả năng xuất báo cáo.
  • Could-have (Có thể có): Tùy biến kích thước mã ($MatrixPointSize$) và mức độ chịu lỗi dữ liệu ($ErrorCorrectionLevel$).
  • Won't-have (Chưa triển khai): Nhận diện khuôn mặt kết hợp hoặc xác thực sinh trắc học 2 lớp (dành cho các giai đoạn nâng cấp sau).

Thiết kế hệ thống

Kiến trúc hệ thống được xây dựng theo mô hình Client-Server 3 lớp (3-Tier Architecture) đảm bảo tính độc lập và khả năng mở rộng:

graph TD
    subgraph Client_Layer ["Client Layer (Trình duyệt / Thiết bị ngoại vi)"]
        UI[Giao diện Web HTML5/Bootstrap]
        Cam[Webcam / Máy quét 2D Barcode]
    end

    subgraph App_Layer ["Application Layer (Web Server Apache 2.4)"]
        Router[Bộ điều hướng yêu cầu HTTP GET/POST]
        QREngine[QR Code Engine / Thư viện phpqrcode]
        AuthModule[Module Xác thực & Xử lý Check-in]
    end

    subgraph Data_Layer ["Data Layer (MySQL 5.7 Database)"]
        UserTable[(Bảng User - Định danh)]
        ServiceTable[(Bảng DichVu - Lịch sử Check-in)]
    end

    UI --> Router
    Cam --> Router
    Router --> AuthModule
    Router --> QREngine
    AuthModule --> UserTable
    AuthModule --> ServiceTable
    QREngine -.-> UserTable

Thiết kế cơ sở dữ liệu (Database Schema):

Hệ thống sử dụng hệ quản trị cơ sở dữ liệu MySQL với 2 bảng quan hệ chuẩn hóa dạng 3NF:

-- Bảng lưu trữ thông tin thành viên
CREATE TABLE `User` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `hoten` VARCHAR(100) NOT NULL,
  `sdt` CHAR(15) NOT NULL,
  `email` VARCHAR(100) NOT NULL UNIQUE,
  `maqr` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `idx_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Bảng ghi nhận sự kiện check-in
CREATE TABLE `DichVu` (
  `dichvu_id` INT(11) NOT NULL AUTO_INCREMENT,
  `user_email` VARCHAR(100) NOT NULL,
  `user_id` INT(11) NOT NULL,
  `ngaysudung` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`dichvu_id`),
  CONSTRAINT `fk_user_dichvu` FOREIGN KEY (`user_id`) 
      REFERENCES `User` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Stack công nghệ chi tiết:

  • Backend: PHP 7.x (Thuần kết hợp thư viện qrlib.php).
  • Database: MySQL 5.7 / MariaDB Server.
  • Web Server: Apache HTTP Server 2.4.
  • Frontend: HTML5, CSS3, JavaScript, jQuery.
  • Môi trường phát triển: XAMPP Server Suite trên nền tảng hệ điều hành Windows 10 64-bit / Linux.

Methodology

Dự án áp dụng mô hình phát triển phần mềm Agile/Scrum rút gọn, phù hợp với chu kỳ phát triển đồ án kỹ thuật 12 tuần (từ tháng 10/2018 đến tháng 01/2019):

gantt
    title Lộ trình triển khai đồ án (Milestones)
    dateFormat  YYYY-MM-DD
    section Giai đoạn 1
    Nghiên cứu lý thuyết QR Code & Toán Galois :2018-10-15, 21d
    section Giai đoạn 2
    Phân tích thiết kế hệ thống & CSDL       :2018-11-05, 14d
    section Giai đoạn 3
    Lập trình module sinh mã & Xử lý Web     :2018-11-19, 28d
    section Giai đoạn 4
    Thử nghiệm hệ thống, đo đạc & Viết báo cáo:2018-12-17, 21d

Ma trận đánh giá rủi ro kỹ thuật:

  • Rủi ro chất lượng quét mã: Ảnh hưởng bởi điều kiện ánh sáng yếu hoặc camera mờ. Giải pháp: Thiết lập kích thước pixel module ($MatrixPointSize \ge 4$) và tích hợp mức sửa lỗi Reed-Solomon cấp độ Q (25%).
  • Rủi ro trùng lặp dữ liệu Check-in: Người dùng quét liên tiếp nhiều lần trong khoảng thời gian cực ngắn. Giải pháp: Ràng buộc logic kiểm tra độ trễ (debounce interval) 60 giây trong truy vấn SQL xử lý.

Implementation và kết quả

Development process

Trọng tâm kỹ thuật của đề tài nằm ở việc hiện thực hóa thuật toán sinh mã QR và kết nối luồng dữ liệu tự động.

1. Thuật toán mã hóa chuỗi nhị phân QR Code:

Quy trình mã hóa dữ liệu văn bản thành ma trận 2D tuân theo tiêu chuẩn ISO/IEC 18004 thông qua 6 bước nghiêm ngặt:

  • Bước 1 (Mode Indicator): Khai báo chỉ thị chế độ 4-bit. Đối với dữ liệu dạng chuỗi ký tự (Alphanumeric), mã nhị phân là 0010.
  • Bước 2 (Character Count Indicator): Đếm số lượng ký tự trong chuỗi (ví dụ: chuỗi 11 ký tự chuyển thành dạng 9-bit nhị phân 000001011 cho Version 1).
  • Bước 3 (Data Encoding): Nhóm các ký tự thành từng cặp, chuyển đổi giá trị ASCII sang hệ số cơ số 45 theo công thức: $$Value = (ASCII_1 \times 45) + ASCII_2$$ Sau đó chuyển kết quả $Value$ thành chuỗi nhị phân 11-bit. Ký tự lẻ cuối cùng được chuyển thành chuỗi 6-bit.
  • Bước 4 (Terminator & Padding): Bổ sung chuỗi kết thúc 0000 và thêm các byte đệm luân phiên 11101100 (0xEC) và 00010001 (0x11) cho đến khi đạt đủ dung lượng bit yêu cầu của phiên bản.
  • Bước 5 (Reed-Solomon Error Correction): Sinh đa thức kiểm tra lỗi trên trường Galois $GF(2^8)$ bằng cách chia đa thức thông điệp cho đa thức sinh: $$g(x) = (x - \alpha^0)(x - \alpha^1)(x - \alpha^2)\dots(x - \alpha^{t-1})$$
  • Bước 6 (Masking & Placement): Áp dụng 1 trong 8 mẫu mặt nạ (Mask Patterns) để triệt tiêu các mẫu pixel gây nhiễu, bổ sung các mẫu định vị góc (Position Detection Patterns), mẫu căn chỉnh (Alignment Patterns) và vạch đồng bộ (Timing Patterns) lên lưới ma trận.
flowchart TD
    In[Chuỗi ký tự đầu vào] --> Mode[Mode Indicator: 4-bit]
    Mode --> Len[Độ dài dữ liệu: 8/9/16-bit]
    Len --> Enc[Mã hóa theo cặp: Base-45 sang 11-bit]
    Enc --> Pad[Thêm Terminator 0000 & Byte đệm 0xEC, 0x11]
    Pad --> RS[Tính đa thức sửa lỗi Reed-Solomon GF-256]
    RS --> Matrix[Xếp dữ liệu hình ziczac lên ma trận]
    Matrix --> Mask[Áp 8 mẫu Mask & Tính điểm phạt Penalty Score]
    Mask --> Out[Mã QR hoàn chỉnh .PNG]

2. Hiện thực hóa mã nguồn trong ứng dụng (Source Code Implementation):

Đoạn mã cốt lõi trong hệ thống xử lý khởi tạo thành viên và render trực tiếp mã QR dạng ảnh nhị phân:

<?php
// Tích hợp thư viện sinh mã QR
include('phpqrcode/qrlib.php');

// Thư mục lưu trữ tạm thời ảnh mã vạch
$PNG_WEB_DIR = 'temp/';
if (!file_exists($PNG_WEB_DIR)) {
    mkdir($PNG_WEB_DIR, 0777, true);
}

// Tiếp nhận dữ liệu người dùng từ biểu mẫu POST
$hoten = trim($_POST['hoten']);
$sdt   = trim($_POST['sdt']);
$email = trim($_POST['email']);

if (!empty($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // Cấu hình mức độ sửa lỗi Reed-Solomon (L: 7%, M: 15%, Q: 25%, H: 30%)
    $errorCorrectionLevel = 'L';
    // Kích thước điểm ma trận (pixel module size)
    $matrixPointSize = 4;
    
    // Tạo tên file định danh duy nhất dựa trên md5/email
    $filename = $PNG_WEB_DIR . 'user_' . md5($email) . '.png';
    $codeContents = $email;
    
    // Gọi phương thức render mã QR từ thư viện qrlib
    QRcode::png($codeContents, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
    
    // Thực thi lưu trữ vào cơ sở dữ liệu MySQL
    $conn = new mysqli('localhost', 'root', '', 'checkin_db');
    $stmt = $conn->prepare("INSERT INTO User (hoten, sdt, email, maqr) VALUES (?, ?, ?, ?)");
    $stmt->bind_param("ssss", $hoten, $sdt, $email, $filename);
    $stmt->execute();
    $stmt->close();
    $conn->close();
}
?>

Testing và validation

Hệ thống đã trải qua quá trình kiểm thử tải và xác thực chức năng thực nghiệm trên máy trạm cấu hình tiêu chuẩn:

  • Cấu hình phần cứng thử nghiệm: Laptop ASUS X550LD, CPU Intel Core i5-4200U 1.6GHz (Turbo Boost 2.6GHz), RAM 8GB DDR3, Ổ cứng SSD 256GB.
  • Phần mềm: Apache 2.4.37, PHP 7.2.12, MySQL 5.7.24 trên Windows 10 Pro 64-bit.
pie title Tỷ lệ kiểm thử chức năng (60 Test Cases)
    "Thành công hoàn toàn (Pass)" : 58
    "Lỗi giao diện nhỏ (Cosmetic Bug)" : 2

Kết quả Benchmark hiệu năng thực tế:

  • Thời gian sinh mã QR trung bình: 18ms – 25ms cho mỗi yêu cầu.
  • Thời gian nhận diện và ghi nhận Check-in vào CSDL: < 450ms (bao gồm độ trễ mạng nội bộ).
  • Tỷ lệ quét thành công trong điều kiện ánh sáng chuẩn (300 Lux): 100% với khoảng cách quét từ 10cm - 35cm.
  • Tỷ lệ quét thành công khi mã bị mất góc hoặc dơ bẩn nhẹ (nhờ Reed-Solomon Level Q): 94.6%.

Kết quả đạt được

Hệ thống đã hoàn thành toàn bộ các yêu cầu chức năng đặt ra trong đề cương tốt nghiệp:

  1. Module Quản lý thành viên: Cho phép thêm mới, chỉnh sửa thông tin, hiển thị danh sách trực quan và xuất dữ liệu mã QR tương ứng.
  2. Module Sinh mã tự động: Mã hóa chính xác địa chỉ email thành các ma trận điểm đen trắng sắc nét chuẩn PNG.
  3. Module Check-in tự động: Kết nối camera quét mã, trích xuất dữ liệu chuỗi, đối chiếu tự động với bảng User và lưu vết vào bảng DichVu kèm dấu thời gian thực (CURRENT_TIMESTAMP).

Đổi mới và đóng góp

  1. Ứng dụng toán học Galois vào thực tiễn kỹ thuật: Đồ án không chỉ dừng lại ở việc gọi hàm thư viện mà phân tích chi tiết cơ chế toán học đằng sau bộ sửa lỗi Reed-Solomon và phép nhân đa thức trên trường nhị phân $GF(256)$, làm sáng tỏ nguyên lý vận hành của mã ma trận 2D.
  2. Mô hình kiến trúc tối ưu chi phí (Zero-Hardware Cost Model): Thay vì yêu cầu đầu đọc thẻ chuyên dụng đắt tiền (từ 1.500.000 - 3.000.000 VNĐ/thiết bị), hệ thống có thể tận dụng bất kỳ webcam giá rẻ hoặc camera điện thoại có sẵn, giảm chi phí đầu tư phần cứng ban đầu tới 90%.
  3. Tối ưu hóa thời gian xử lý: Cắt giảm thời gian check-in từ 30 giây/người xuống dưới 1 giây/người, tăng năng lực tiếp nhận tại các cổng kiểm soát lên gấp 30 lần.

Ứng dụng thực tế và triển khai

graph TD
    subgraph UseCases ["Kịch bản ứng dụng thực tế"]
        UC1[Điểm danh lớp học / Giảng đường đại học]
        UC2[Kiểm soát vé sự kiện / Hội thảo / Workshop]
        UC3[Chấm công nhân sự tại doanh nghiệp SME]
    end

    subgraph Deploy ["Mô hình triển khai"]
        D1[Web Server Cục bộ / Intranet qua XAMPP]
        D2[Cloud VPS / Web Hosting công cộng]
    end

    UseCases --> Deploy

Kế hoạch triển khai (Deployment Roadmap):

  • Giai đoạn 1 (Cài đặt môi trường): Cấu hình Web Server Apache và kích hoạt tiện ích mở rộng GD Library trong PHP (extension=php_gd2.dll) để xử lý đồ họa ảnh.
  • Giai đoạn 2 (Thiết lập Database): Import tệp tin cấu trúc cơ sở dữ liệu checkin_db.sql vào MySQL Server.
  • Giai đoạn 3 (Cấu hình quyền truy cập): Phân quyền thư mục temp/ ở chế độ ghi (chmod 777) để lưu trữ các tệp ảnh mã QR sinh tự động.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại:

  • Hệ thống xây dựng trên nền tảng PHP nguyên bản, chưa ứng dụng các Web Framework hiện đại (như Laravel, Symfony) để tối ưu tầng ORM và bảo mật CSRF.
  • Giao diện quét mã phía Client vẫn phụ thuộc vào luồng dữ liệu của trình duyệt hoặc đầu quét quang học mô phỏng bàn phím (HID Keyboard Emulation).

Hướng phát triển nâng cao:

  • Tích hợp WebRTC / HTML5 QR Scanner: Quét trực tiếp luồng video từ camera trên giao diện trình duyệt mà không cần cài đặt phần mềm bổ trợ.
  • Mã hóa bảo mật chuỗi (Encrypted QR Code): Sử dụng thuật toán mã hóa bất đối xứng RSA hoặc JWT kèm thời gian sống (TTL - Time To Live) để ngăn chặn hành vi chụp ảnh mã QR truyền cho người khác điểm danh hộ.
  • Xây dựng ứng dụng di động đa nền tảng: Ứng dụng Flutter/React Native dành riêng cho quản trị viên quét mã offline khi mất kết nối Internet.

Đối tượng hưởng lợi

mindmap
  root((Hệ sinh thái hưởng lợi))
    Sinh viên & Giảng viên
      Tiết kiệm 85% thời gian đầu giờ học
      Loại bỏ gian lận điểm danh
    Doanh nghiệp & Đơn vị tổ chức
      Cắt giảm 90% chi phí in ấn thẻ
      Dữ liệu thời gian thực Real-time
    Lập trình viên
      Mẫu kiến trúc tham khảo chuẩn
      Nắm vững thuật toán 2D Barcode
  • Sinh viên & Học viên: Tiếp cận tài liệu tham khảo hoàn chỉnh về thuật toán mã hóa 2D, lập trình cơ sở dữ liệu PHP/MySQL và mô hình phân tích thiết kế hệ thống thông tin.
  • Doanh nghiệp & Nhà trường: Sở hữu một giải pháp kiểm soát ra vào gọn nhẹ, triển khai nhanh chóng với chi phí gần như bằng 0.
  • Nhà phát triển (Developers): Kế thừa mã nguồn nền tảng để phát triển các tính năng nâng cao như vé điện tử (E-Ticket), thẻ thành viên số hóa (Digital Loyalty Card).

Câu hỏi thường gặp

1. Hệ thống yêu cầu cấu hình phần cứng tối thiểu như thế nào để triển khai?

Hệ thống có dung lượng cực kỳ gọn nhẹ (< 15MB mã nguồn). Máy chủ chỉ cần CPU 1 Core, RAM 1GB, ổ cứng trống 500MB và cài đặt sẵn môi trường Apache/PHP 7.x cùng MySQL 5.6 trở lên.

2. Mã QR được tạo ra có thể lưu trữ tối đa bao nhiêu thông tin?

Tùy thuộc vào phiên bản (từ Version 1 đến Version 40), mã QR có thể chứa tối đa 7.089 ký tự số, 4.296 ký tự chữ số hoặc 2.953 byte nhị phân. Trong hệ thống này, dữ liệu Email có độ dài trung bình 20-30 ký tự, tương ứng tối ưu với QR Version 1 và 2.

3. Làm thế nào để ngăn chặn việc người dùng dùng chung một mã QR để check-in hộ?

Ở phiên bản hiện tại, hệ thống ghi nhận thời gian thực và ngăn chặn quét lặp trong khoảng thời gian ngắn. Để chống gian lận tuyệt đối, có thể nâng cấp thuật toán sang Mã QR Động (Dynamic QR Code) có chu kỳ thay đổi mã (TOTP) mỗi 30 giây một lần trên ứng dụng di động.

4. Hệ thống có thể hoạt động khi mất kết nối Internet hay không?

Hoàn toàn có thể. Khi triển khai trên mạng cục bộ (LAN) với máy chủ Web Server nội bộ, tất cả các thiết bị kết nối cùng mạng WiFi/LAN đều có thể thực hiện check-in với độ trễ gần như bằng 0 mà không cần Internet.

5. Chi phí bảo trì và vận hành hệ thống hàng năm ước tính là bao nhiêu?

Do sử dụng hoàn toàn các công nghệ mã nguồn mở (PHP, MySQL, Apache) và thiết bị phần cứng thông dụng, chi phí bản quyền phần mềm là 0 VNĐ. Chi phí duy trì duy nhất là điện năng vận hành máy chủ nội bộ hoặc phí thuê máy chủ đám mây (Cloud VPS) giá rẻ (khoảng 50.000 - 100.000 VNĐ/tháng).


Kết luận

Đồ án tốt nghiệp "Tìm hiểu QRcode và ứng dụng cho bài toán check-in tự động" đã giải quyết thành công bài toán chuyển đổi số trong công tác quản lý điểm danh và kiểm soát ra vào. Bằng việc kết hợp nhuần nhuyễn giữa cơ sở lý thuyết toán học của mã vạch ma trận 2D và kỹ thuật phát triển ứng dụng Web PHP/MySQL, công trình mang lại giá trị thực tiễn cao, khả năng ứng dụng rộng rãi trong trường học và doanh nghiệp, mở ra hướng đi bền vững cho các hệ thống nhận diện thông minh thế hệ mới.