Nâng cao

Mã hóa thẻ & bộ nhớ EPC

Nắm vững kiến trúc bộ nhớ thẻ và mã hóa GS1 để tích hợp chuỗi cung ứng

4 Phân vùng Bộ nhớ

Mỗi thẻ EPC Gen2 có chính xác 4 phân vùng bộ nhớ, mỗi phân vùng phục vụ một mục đích cụ thể. Hiểu rõ cấu trúc này là điều cần thiết để mã hóa, đọc và bảo mật thẻ của bạn.

Phân vùng 00 (Reserved): Chứa Mật khẩu Hủy (Kill Password) 32-bit và Mật khẩu Truy cập (Access Password) 32-bit. Giá trị mặc định là 0x00000000. Mật khẩu hủy sẽ vô hiệu hóa thẻ vĩnh viễn khi được gửi — không thể đảo ngược. Mật khẩu truy cập khóa các phân vùng bộ nhớ để ngăn chặn việc ghi dữ liệu trái phép.

Phân vùng 01 (EPC): Chứa StoredCRC (16 bit, tự động tính toán), StoredPC/Protocol Control (16 bit, cho biết độ dài EPC và khả năng của thẻ), và chính giá trị EPC — thường là 96 bit (12 byte) cho SGTIN-96. Một số thẻ hỗ trợ EPC 128 bit hoặc thậm chí 496 bit.

Phân vùng 10 (TID): Mã định danh thẻ (Tag Identifier) được lập trình tại nhà máy. Chứa mã nhà sản xuất chip, số hiệu model và số sê-ri duy nhất. Phân vùng này chỉ đọc và không bao giờ có thể thay đổi — điều này khiến nó vô cùng giá trị trong việc chống hàng giả và xác thực thẻ.

Phân vùng 11 (User): Bộ nhớ bổ sung tùy chọn. Kích thước thay đổi tùy theo chip: NXP UCODE 9 có 0 bit (không có bộ nhớ người dùng), Quanray QStar-7U có 512 bit (64 byte). Sử dụng nó cho số lô, ngày kiểm tra, ngưỡng nhiệt độ hoặc hồ sơ bảo trì. Luôn kiểm tra dung lượng khả dụng trước khi ghi.

Mã hóa SGTIN-96

SGTIN-96 là sơ đồ EPC được sử dụng rộng rãi nhất. Nó mã hóa một mã GTIN-14 (mã vạch sản phẩm của bạn) cộng với một số sê-ri duy nhất thành chính xác 96 bit (12 byte). Điều này cho phép lên đến 274 tỷ số sê-ri duy nhất cho mỗi loại sản phẩm.

Cấu trúc 96-bit: Header (8 bit, luôn là 0x30 cho SGTIN-96) → Filter (3 bit: 0=tất cả, 1=POS, 2=nguyên thùng, 3=dự phòng, 4=gói nội bộ, 5=dự phòng, 6=đơn vị tải, 7=linh kiện) → Partition (3 bit: xác định cách chia các bit giữa tiền tố công ty và tham chiếu mặt hàng) → Tiền tố Công ty (20–40 bit) → Tham chiếu Mặt hàng (4–24 bit) → Số Sê-ri (38 bit).

Giá trị Partition (0–6) xác định độ dài Tiền tố Công ty: P=0 → tiền tố 40-bit (12 chữ số), P=1 → 37-bit (11 chữ số), P=2 → 34-bit (10 chữ số), P=3 → 30-bit (9 chữ số), P=4 → 27-bit (8 chữ số), P=5 → 24-bit (7 chữ số), P=6 → 20-bit (6 chữ số). Độ dài tiền tố công ty GS1 của bạn sẽ quyết định giá trị partition nào cần sử dụng.

💡

Sử dụng công cụ Nextwaves TDS RFID Converter tại /tools/tds-rfid-converter để mã hóa và giải mã các giá trị SGTIN-96 một cách tương tác. Nhập GTIN-14 + số sê-ri của bạn và nhận ngay mã EPC dạng hex.

SGTIN-96 Bit Structure
┌────────┬──────┬─────┬──────────────┬──────────────┬──────────────┐
│ Header │Filter│Part │Company Prefix│Item Reference│   Serial     │
│ 8 bits │3 bits│3bits│  20-40 bits  │   4-24 bits  │   38 bits    │
│  0x30  │ 0-7  │ 0-6 │  GS1 prefix  │  product ref │  unique ID   │
└────────┴──────┴─────┴──────────────┴──────────────┴──────────────┘

Partition table (defines prefix/item bit allocation):
P=0: 40-bit prefix (12 digits)  P=4: 27-bit prefix (8 digits)
P=1: 37-bit prefix (11 digits)  P=5: 24-bit prefix (7 digits)
P=2: 34-bit prefix (10 digits)  P=6: 20-bit prefix (6 digits)
P=3: 30-bit prefix (9 digits)

Example: 3034257BF7194E4000001A85
  Header=0x30 Filter=1 Part=5 Prefix=0614141
  Item=812345 Serial=6789 → GTIN-14: 80614141123458

Các mã hóa EPC khác

Ngoài SGTIN-96, GS1 còn định nghĩa một số sơ đồ EPC 96-bit khác cho các mã định danh chuỗi cung ứng khác nhau. Mỗi sơ đồ có byte header riêng.

Đọc & Ghi bộ nhớ thẻ

Việc đọc thẻ trong quá trình kiểm kê là thụ động — đầu đọc phát một truy vấn và các thẻ phản hồi bằng EPC của chúng từ Bank 01. Tuy nhiên, bạn cũng có thể đọc rõ ràng bất kỳ ngân hàng bộ nhớ nào bằng cách gửi lệnh READ với số ngân hàng, độ lệch từ (word offset) và số lượng từ (word count).

Việc ghi vào thẻ đòi hỏi độ chính xác cao hơn. Thẻ phải được chọn riêng lẻ (chỉ một thẻ phản hồi) và việc ghi diễn ra theo từng từ (16 bits) một. Một lần ghi EPC 96-bit đầy đủ yêu cầu 6 lần ghi từ tuần tự. Mỗi lần ghi mất 10–20ms, vì vậy việc mã hóa một thẻ duy nhất mất 60–120ms chỉ riêng cho dữ liệu EPC.

Các lỗi ghi phổ biến: Thẻ quá xa anten (cần tín hiệu mạnh hơn để ghi so với để đọc — hãy đưa thẻ vào trong khoảng cách 1m). Nhiều thẻ trong vùng phủ sóng (chọn riêng lẻ thất bại — hãy cô lập thẻ mục tiêu). Bộ nhớ thẻ bị khóa (yêu cầu mật khẩu truy cập). Xác minh ghi thất bại (thử lại, hoặc thẻ có thể bị lỗi — tỷ lệ lỗi điển hình là 1–3 trên 10.000).

💡

Thực hành tốt nhất: Luôn xác minh sau khi ghi bằng cách đọc lại dữ liệu và so sánh. Một lệnh ghi có thể thành công nhưng làm hỏng các bit lân cận trong một số trường hợp hiếm gặp. Việc xác minh đọc-sau-khi-ghi sẽ phát hiện các vấn đề này.

Write EPC — Nextwaves NRN Protocol
TX → 5A 00 01 02 11 00 0C [EPC_12_BYTES] [CRC16]

Write per 16-bit word: 10-20ms
Full 96-bit EPC = 6 words = 60-120ms total

With access password:
TX → 5A 00 01 02 11 00 10 [PWD_4B] [EPC_12B] [CRC16]

Kiểm soát truy cập cấp thẻ

Thẻ EPC Gen2 hỗ trợ hai mật khẩu 32-bit để bảo mật. Mật khẩu truy cập (Access Password) khóa các ngân hàng bộ nhớ cụ thể — sau khi được thiết lập, ngân hàng đó yêu cầu mật khẩu trước bất kỳ thao tác đọc hoặc ghi nào. Mật khẩu hủy (Kill Password) sẽ vô hiệu hóa vĩnh viễn thẻ khi được truyền đi — một thao tác không thể đảo ngược chủ yếu được sử dụng cho quyền riêng tư của người tiêu dùng trong bán lẻ (hủy thẻ sau khi thanh toán).

Các thực hành bảo mật tốt nhất: Không bao giờ sử dụng mật khẩu mặc định toàn số không (0x00000000) trong sản xuất — nó không mang lại tính bảo mật nào. Tạo mật khẩu duy nhất cho mỗi lô thẻ hoặc sử dụng tiền tố công ty của bạn làm hạt giống. Lưu trữ mật khẩu trong hệ thống backend của bạn, không bao giờ lưu trên chính thẻ (bộ nhớ mật khẩu có thể bị đọc nếu thẻ được mở khóa). Khóa các ngân hàng mật khẩu sau khi lập trình. Cân nhắc chế độ Untraceable (có sẵn trên các chip mới hơn) giúp ẩn TID và giảm EPC, cung cấp quyền riêng tư mà không cần hủy thẻ.

⚠️

Lệnh Kill là vĩnh viễn và không thể đảo ngược. Không có lệnh hoàn tác. Một khi thẻ đã bị hủy, nó không bao giờ có thể phản hồi lại bất kỳ đầu đọc nào nữa. Luôn triển khai xác minh mật khẩu hủy trong phần mềm của bạn và yêu cầu sự cho phép của quản lý trước khi thực hiện các lệnh hủy.