TÀI LIỆU

Tài liệu tích hợp Reader RFID

Tài liệu toàn diện về thiết lập truyền thông nối tiếp, cấu hình anten, hoạt động mã hóa thẻ (EPC Gen2 / ISO 18000-6C) và quản lý nguồn. Bao gồm ví dụ triển khai đa anten và quét kiểm kê tốc độ cao.

Thiết lập truyền thông nối tiếp

Đầu đọc RFID NRN protocol giao tiếp qua cổng serial (RS-232 hoặc USB-to-Serial). Cấu hình kết nối cần được thiết lập chính xác để đảm bảo truyền dữ liệu ổn định.

Baud Rate

115200

Data Bits

8

Stop Bits

1

Parity

None

Để kết nối qua WebSerial API (trình duyệt), sử dụng Nextwaves Reader Connect tại app.nextwaves.com/reader. Ứng dụng này tự động phát hiện cổng COM và thiết lập tham số kết nối.

TypeScript — WebSerial Connection
// Request serial port access
const port = await navigator.serial.requestPort();
await port.open({
  baudRate: 115200,
  dataBits: 8,
  stopBits: 1,
  parity: "none",
  flowControl: "none",
  bufferSize: 4096,
});

// Get reader/writer streams
const reader = port.readable.getReader();
const writer = port.writable.getWriter();
Python — PySerial Connection
import serial

port = serial.Serial(
    port="/dev/ttyUSB0",      # Linux/macOS
    # port="COM3",            # Windows
    baudrate=115200,
    bytesize=serial.EIGHTBITS,
    stopbits=serial.STOPBITS_ONE,
    parity=serial.PARITY_NONE,
    timeout=2.0,
)

# Flush buffers before communication
port.reset_input_buffer()
port.reset_output_buffer()

Cấu trúc khung giao thức Nextwaves NRN

Mỗi lệnh NRN protocol được đóng gói trong khung nhị phân bao gồm: Header (0x5A), PCW (Protocol Control Word), Category, MID (Message ID), Length, Data payload và CRC16-CCITT checksum.

TrườngKích thướcMô tả
Header1 byteLuôn là 0x5A — đánh dấu đầu khung
PCW2 bytesCờ giao thức (phiên bản, địa chỉ)
Category1 byteDanh mục lệnh (0x00=Hệ thống, 0x01=Thiết bị, 0x02=RFID)
MID1 byteID tin nhắn trong danh mục
Length2 bytesĐộ dài payload tính bằng byte (big-endian)
DataN bytesPayload dành riêng cho lệnh
CRC162 bytesChecksum CRC16-CCITT của các byte sau header

Ví dụ lệnh

QUERY_INFO — Query reader serial number & firmware
TX → 5A 00 01 01 00 00 00 DC E5
       ┌──┐ ┌────┐ ┌──┐ ┌──┐ ┌────┐ ┌────┐
       │5A│ │0001│ │01│ │00│ │0000│ │DCE5│
       └──┘ └────┘ └──┘ └──┘ └────┘ └────┘
       HDR   PCW   CAT  MID  LEN    CRC16
READ_EPC_TAG — Start continuous EPC tag inventory
TX → 5A 00 01 02 10 00 00 04 5A
       HDR  PCW   CAT MID LEN   CRC16
       
Response notifications (PID 0x1231) contain:
  • Antenna ID (1 byte)
  • RSSI value (1 byte, raw ADC 0-255)
  • EPC data (12+ bytes)
  • Frequency channel index (1 byte)
STOP_INVENTORY — Stop running inventory scan
TX → 5A 00 01 02 FF 00 00 88 5A
       HDR  PCW   CAT MID LEN   CRC16

Danh sách lệnh chính

LệnhMô tả
QUERY_INFO0x0100Truy vấn số serial và phiên bản firmware đầu đọc
QUERY_RFID_ABILITY0x1000Truy vấn khả năng RFID (phạm vi công suất, số anten)
READ_EPC_TAG0x0210Bắt đầu quét thẻ EPC liên tục
WRITE_EPC_TAG0x0211Ghi dữ liệu vào ngân hàng EPC của thẻ
STOP_INVENTORY0x02FFDừng quét thẻ đang chạy
CONFIGURE_READER_POWER0x0201Cài đặt công suất phát (0-33 dBm mỗi anten)
CONFIGURE_ANTENNA_ENABLE0x0203Bật/tắt cổng anten (bitmask)
SET_WORKING_FREQUENCY0x0205Thiết lập tần số làm việc cụ thể
SET_FILTER_SETTINGS0x0209Cấu hình bộ lọc thẻ trùng lặp (theo thời gian)
BUZZER_SWITCH0x011EĐiều khiển chế độ còi

Cấu hình anten

Đầu đọc RFID hỗ trợ lên đến 32 cổng anten. Mỗi cổng được bật hoặc tắt thông qua bitmask 4 byte. Anten được đánh số từ 1 đến 32, mỗi bit tương ứng với một cổng.

Bitmask anten

Bật anten 1-4

0x0F, 0x00, 0x00, 0x00

Binary: 00001111 → Ports 1,2,3,4 ON

Chỉ bật anten 1 & 3

0x05, 0x00, 0x00, 0x00

Binary: 00000101 → Ports 1,3 ON

CONFIGURE_ANTENNA_ENABLE — Enable ports 1-4
TX → 5A 00 01 02 03 00 04 0F 00 00 00 E1 EF
                              ┌───────────┐
       Payload:               │0F 00 00 00│ ← bitmask
                              └───────────┘
       Bit 0 = ANT1, Bit 1 = ANT2, Bit 2 = ANT3, Bit 3 = ANT4
       0x0F = 0b00001111 → all 4 ports enabled

Triển khai đa anten

Khi triển khai nhiều anten, cần cân nhắc phân cực (tuyến tính vs tròn), khoảng cách giữa các anten và vùng phủ sóng chồng lấn. Đầu đọc sẽ quét tuần tự qua các anten được bật, mỗi thẻ được báo cáo kèm ID anten để xác định vị trí.

Cửa Dock

2-4 anten mỗi cổng, phân cực tròn, công suất 30 dBm

Băng chuyền

1-2 anten mỗi trạm, phân cực tuyến tính, 20-25 dBm

Kệ bán lẻ

Anten trường gần, công suất thấp 15-20 dBm, mật độ cao

Mã hóa thẻ (EPC Gen2 / ISO 18000-6C)

UHF RFID tuân theo chuẩn EPC Gen2 (ISO 18000-6C). Mỗi thẻ có 4 ngân hàng bộ nhớ: Reserved (mật khẩu), EPC (96+ bit mã định danh), TID (chip ID không thay đổi) và User (dữ liệu tùy chỉnh).

Cấu trúc bộ nhớ thẻ

Ngân hàngIDKích thước điển hìnhSử dụng
Reserved0064 bitsMật khẩu Kill (32b) + Mật khẩu Access (32b)
EPC0196-128 bitsSGTIN-96, SSCC-96 hoặc mã hóa tùy chỉnh
TID1096+ bitsID nhà sản xuất chip (chỉ đọc, duy nhất)
User110-512 bitsDữ liệu dành riêng cho ứng dụng (tùy chip)

Ví dụ giải mã SGTIN-96

SGTIN-96 là mã hóa phổ biến nhất cho sản phẩm bán lẻ và chuỗi cung ứng. Chuyển đổi EPC hex 24 ký tự thành GTIN-14, số serial và GS1 Digital Link.

SGTIN-96 Decode — Example
EPC Hex: 3034257BF7194E4000001A85

Decoded:
  Header:         0x30 (SGTIN-96)
  Filter:         1 (Point-of-Sale)
  Partition:      5
  Company Prefix: 0614141
  Item Reference: 812345
  Serial:         6789
  GTIN-14:        80614141123458
  Digital Link:   https://id.gs1.org/01/80614141123458/21/6789
WRITE_EPC_TAG — Write EPC data to tag
// NRN protocol WRITE_EPC_TAG command
TX → 5A 00 01 02 11 00 0C [EPC_DATA_12_BYTES] [CRC16]

// The reader will:
// 1. Select the tag in its field
// 2. Write the provided EPC data to Bank 01
// 3. Return success/failure notification

// Access password required if tag is locked:
TX → 5A 00 01 02 11 00 10 [ACCESS_PWD_4B] [EPC_DATA_12B] [CRC16]

Sử dụng công cụ EPC Encoder trực tuyến tại /tools/tds-rfid-converter để mã hóa và giải mã SGTIN-96, SSCC-96, GRAI-96 trực tiếp trên trình duyệt.

Quản lý nguồn

Công suất phát của đầu đọc điều chỉnh được từ 0 đến 33 dBm cho mỗi cổng anten. Công suất cao hơn tăng khoảng cách đọc nhưng cũng tăng nhiễu và tiêu thụ điện.

CONFIGURE_READER_POWER — Set 30 dBm on all 4 ports
TX → 5A 00 01 02 01 00 04 1E 1E 1E 1E 67 FE
                              ┌───────────┐
       Payload:               │1E 1E 1E 1E│
                              └───────────┘
       0x1E = 30 decimal = 30 dBm per port
       
Power guidelines:
  • 33 dBm — Maximum range (~10m), dock doors
  • 30 dBm — Standard range (~6-8m), general use
  • 25 dBm — Medium range (~3-5m), conveyor belts
  • 20 dBm — Short range (~1-2m), point-of-sale
  • 15 dBm — Near-field (~0.5m), shelf readers

Giám sát RSSI

Giá trị RSSI (Received Signal Strength Indicator) từ thẻ được báo cáo dưới dạng byte ADC thô (0-255). Sử dụng công thức chuyển đổi để có giá trị dBm chính xác.

Công thức chuyển đổi

dBm = -100 + round((raw × 70) / 255)

Raw 128

-65 dBm

Tốt

Raw 180

-51 dBm

Mạnh

Raw 220

-40 dBm

Xuất sắc

Quét kiểm kê tốc độ cao

Để quét kiểm kê tốc độ cao, cần cấu hình tần số làm việc, bộ lọc thẻ trùng lặp và chế độ quét liên tục. Đầu đọc hỗ trợ quét lên đến 700 thẻ/giây với cấu hình tối ưu.

Cấu hình tần số

Tần số UHF RFID hoạt động trong dải 920-925 MHz (Đông Nam Á), với bước nhảy 0.5 MHz. Mỗi kênh được đánh số từ 0 (920 MHz) đến 10 (925 MHz).

SET_WORKING_FREQUENCY — 6 channels (920-925 MHz)
TX → 5A 00 01 02 05 00 06 00 02 04 06 08 0A C4 1B

Channel mapping (formula: 920.0 + index × 0.5 MHz):
  Ch 0  → 920.0 MHz
  Ch 2  → 921.0 MHz
  Ch 4  → 922.0 MHz
  Ch 6  → 923.0 MHz
  Ch 8  → 924.0 MHz
  Ch 10 → 925.0 MHz

Quy trình quét tối ưu

1

Cấu hình cổng anten và mức công suất

2

Thiết lập tần số (FHSS cho môi trường đông đúc)

3

Cấu hình bộ lọc trùng lặp (500ms-3000ms tùy trường hợp)

4

Gửi READ_EPC_TAG để bắt đầu quét liên tục

5

Xử lý thông báo thẻ (PID 0x1231) khi chúng đến

6

Gửi STOP_INVENTORY khi hoàn tất

Complete inventory flow — TypeScript
// 1. Enable antennas 1-4
await sendFrame("CONFIGURE_ANTENNA_ENABLE", [0x0F, 0x00, 0x00, 0x00]);

// 2. Set power to 30 dBm on all ports
await sendFrame("CONFIGURE_READER_POWER", [0x1E, 0x1E, 0x1E, 0x1E]);

// 3. Set working frequencies
await sendFrame("SET_WORKING_FREQUENCY", [0, 2, 4, 6, 8, 10]);

// 4. Set duplicate filter to 1000ms  
await sendFrame("SET_FILTER_SETTINGS", [0x03, 0xE8]);

// 5. Start inventory
await sendFrame("READ_EPC_TAG");

// 6. Process tags...
reader.on("tag", (tag) => {
  const rssiDbm = -100 + Math.round((tag.rssi * 70) / 255);
  console.log(`EPC: ${tag.epc}, Ant: ${tag.antenna}, RSSI: ${rssiDbm} dBm`);
});

// 7. Stop when done
await sendFrame("STOP_INVENTORY");