Thuật toán giải quyết xung đột thẻ mà chúng tôi áp dụng vào bộ đọc SM bao gồm thuật toán DBT (mục 4.3) và phương pháp cải tiến CDBT (mục 4.4.1). Việc áp dụng thuật toán tuân theo giao thức trong chuẩn ISO/IEC 14443A đã được trình bày ở các mục trên. Với thẻ MIFARE Classic, UID có độ dài 4 byte thuộc CL1, do đó việc áp dụng hướng đến hỗ trợ giải quyết xung đột với UID CL1.
6.3.5.1 DBT
Thuật toán được áp dụng như sau: Bước 1:
Bộ đọc gán giá trị 0x93 cho trường SEL (chọn tầng CL1).
Bộ đọc gán giá trị 0x20 cho trường NVB. Giá trị này sẽ khiến toàn bộ thẻ hiện diện trong vùng từ trường phản hồi UID CL1 của nó về bộ đọc.
Bước 2: Bộ đọc phát frame định hướng bit có chứa SEL và NVB.
Bước 3: Toàn bộ thẻ hiện diện trong vùng từ trường sẽ phản hồi UID CL1 của nó về bộ đọc.
Bước 4: Nếu có nhiều hơn một thẻ phản hồi, xung đột dữ liệu có thể xảy ra. Trong trường hợp không có xung đột xảy ra, đến bước 11.
Bước 5:
Bộ đọc xác định vị trí bit xảy ra xung đột đầu tiên, gọi là p.
Bộ đọc xác định chuỗi bit UID CL1 mà bộ đọc nhận được trước p, gọi chuỗi bit này là s.
Bước 6: Bộ đọc gán giá trị cho NVB, giá trị này chính là 0x20 + p.
Bước 7: Tạo chuỗi truy vấn tiếp theo s = s | ‘1’ (với ký hiệu | là phép ghép chuỗi). Bước 8: Bộ đọc phát frame có chứa SEL, NVB và chuỗi s.
Bước 9: Chỉ có các thẻ nào mà phần đầu UID CL1 của nó khớp với s mới phản hồi lại bộ đọc, thông tin phản hồi chính là phần còn lại của UID CL1.
SEL = 0x93 NVB = 0x20 Xung đột thẻ? Sai Đúng Gửi lệnh ANTICOLLISION SEL NVB Nhận UID CL1 Xác định p Xác định s Gửi lệnh ANTICOLLISION SEL NVB s’ s = s | ‘1’ NVB = 0x20 + p Bắt đầu NVB = 0x70 Nhận SAK Kết thúc Gửi lệnh HLTA 0x50 0x00 CRC_A Gửi lệnh SELECT SEL NVB UID CL1 CRC_A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Gửi lệnh REQA Có phản hồi? Sai Đúng 16
Bước 11: Đến đây, toàn bộ UID CL1 của một thẻ đã được xác định. Bộ đọc gán giá trị 0x70 cho trường NVB. Giá trị này cho biết bộ đọc sẽ gửi toàn bộ UID CL1 đã nhận được.
Bước 12: Bộ đọc phát frame chuẩn có chứa SEL, NVB và UID CL1 theo sau bởi 2 byte CRC_A.
Bước 13: Chỉ có thẻ nào chứa UID CL1 mới phản hồi lại bộ đọc, thông tin phản hồi chính là SAK của nó.
Bước 14: Vô hiệu thẻ bằng lệnh HLTA.
Bước 15: Bộ đọc gửi lệnh REQA thăm dò thẻ. Bước 16:
Nếu có phản hồi từ thẻ: quay lại bước 1. Ngược lại: kết thúc thuật toán.
Lưu ý: Thuật toán DBT có thể được áp dụng theo hai cách với số chu kỳ là như nhau về mặt lý thuyết. Cách 1: xác định UID tăng dần với phép duyệt trái, cách 2: xác định UID giảm dần với phép duyệt phải. Việc áp dụng ở trên tuân theo cách 2.
6.3.5.2 CDBT
Phương pháp cải tiến được áp dụng theo các bước sau: Bước 1 → Bước 6: Tương tự DBT.
Bước 7: Tạo chuỗi truy vấn tiếp theo s = s | ‘0’ (với ký hiệu | là phép ghép chuỗi). Bước 8 → Bước 15: Tương tự DBT.
Bước 16:
Nếu có phản hồi từ thẻ: đến bước 17. Ngược lại: kết thúc thuật toán.
Bước 17: Tạo chuỗi truy vấn tiếp theo: UID = UID + 1.
Bước 18: Bộ đọc phát frame chuẩn có chứa SEL, NVB và UID CL1 theo sau bởi 2 byte CRC_A.
s = s | ‘0’ ... Bắt đầu UID = UID + 1 Gửi lệnh HLTA 0x50 0x00 CRC_A Gửi lệnh SELECT SEL NVB UID CL1 CRC_A
1 7 17 18 19 20 21 Gửi lệnh REQA Kết thúc Có phản hồi? Sai Đúng 16 Nhận SAK? Sai Đúng 22
Hình 6.8 Sơ đồ thuật toán giải quyết xung đột thẻ CDBT
Bước 19: Chỉ có thẻ nào chứa UID CL1 mới phản hồi lại bộ đọc, thông tin phản hồi chính là SAK của nó.
Nếu có phản hồi từ thẻ: đến bước 20. Ngược lại: quay lại bước 1.
Bước 20: Vô hiệu thẻ bằng lệnh HLTA.
Bước 21: Bộ đọc gửi lệnh REQA thăm dò thẻ. Bước 22:
Nếu có phản hồi từ thẻ: quay lại bước 17. Ngược lại: kết thúc thuật toán.
Lưu ý: Phương pháp CDBT có thể được áp dụng theo hai cách với số chu kỳ là như nhau về mặt lý thuyết. Cách 1: xác định UID nhỏ nhất và tăng dần UID, cách 2: xác định UID lớn nhất và giảm dần UID. Việc áp dụng ở trên tuân theo cách 1.