תיעוד

מדריך אינטגרציה של קורא RFID

תיעוד מקיף המכסה הגדרת תקשורת טורית, תצורת אנטנה, פעולות קידוד תגים (EPC Gen2 / ISO 18000-6C) וניהול צריכת חשמל. כולל דוגמאות לפריסות מרובות אנטנות וסריקת מלאי במהירות גבוהה.

הגדרת תקשורת טורית

קוראי RFID של פרוטוקול Nextwaves NRN מתקשרים באמצעות יציאה טורית (RS-232 או USB-to-Serial). יש להגדיר את פרמטרי החיבור כראוי כדי להבטיח שידור נתונים יציב.

Baud Rate

115200

Data Bits

8

Stop Bits

1

Parity

None

עבור חיבורי API WebSerial מבוססי דפדפן, השתמש ב-Nextwaves Reader Connect בכתובת app.nextwaves.com/reader. האפליקציה מזהה אוטומטית יציאות COM ומגדירה את פרמטרי החיבור.

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()

מבנה מסגרת פרוטוקול Nextwaves NRN

כל פקודת פרוטוקול NRN מכוסה במסגרת בינארית המורכבת מ: כותרת (0x5A), PCW (מילת בקרת פרוטוקול), קטגוריה, MID (מזהה הודעה), אורך, מטען נתונים וסכום ביקורת CRC16-CCITT.

שדהגודלתיאור
Header1 byteתמיד 0x5A. סמן תחילת מסגרת
PCW2 bytesדגלי פרוטוקול (גרסה, כתובת)
Category1 byteקטגוריית פקודה (0x00=מערכת, 0x01=התקן, 0x02=RFID)
MID1 byteמזהה הודעה בתוך קטגוריה
Length2 bytesאורך מטען בייטים (big-endian)
DataN bytesמטען ספציפי לפקודה
CRC162 bytesסכום ביקורת CRC16-CCITT של בתים אחרי הכותרת

דוגמאות פקודה

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

הפניה לפקודות מפתח

פקודהקודתיאור
QUERY_INFO0x0100שאילת מספר סידורי של הקורא וגרסאות קושחה
QUERY_RFID_ABILITY0x1000שאילת יכולות RFID (טווח כוח, מספר אנטנות)
READ_EPC_TAG0x0210התחל אינבנטוריזציה רציפה של תגי EPC
WRITE_EPC_TAG0x0211כתיבת נתונים לבנק EPC של תג
STOP_INVENTORY0x02FFעצור אינבנטוריזציה של תגיות מתמשכת
CONFIGURE_READER_POWER0x0201הגדר כוח שידור (0-33 dBm לכל אנטנה)
CONFIGURE_ANTENNA_ENABLE0x0203הפעל/השבת פורטי אנטנה (מסכת ביטים)
SET_WORKING_FREQUENCY0x0205הגדר תדרי עבודה ספציפיים
SET_FILTER_SETTINGS0x0209הגדר מסנן שכפול תגיות (מבוסס זמן)
BUZZER_SWITCH0x011Eבקרת מצב המפציר

תצורת אנטנה

קוראי RFID תומכים עד 32 פורטי אנטנה. כל פורט מופעל או מושבת באמצעות מסכת ביטים של 4 בתים. האנטנות ממוספרות מ-1 עד 32, כאשר כל ביט תואם לפורט.

מסכת ביטים של אנטנה

הפעל אנטנות 1‑4

0x0F, 0x00, 0x00, 0x00

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

הפעל רק אנטנות 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

פריסת ריבוי אנטנות

בעת פריסת מספר אנטנות, שקול את הקיטוב (ליניארי לעומת מעגלי), המרווח בין האנטנות ואזורי כיסוי חופפים. הקורא סורק ברצף דרך האנטנות המופעלות, וכל דיווח תג כולל את מזהה האנטנה לקביעת מיקום.

דלת משטח

2-4 אנטנות לכל פורטל, קוטביות מעגלית, 30 dBm

מסוע

1-2 אנטנות לכל תחנה, קוטביות ליניארית, 20-25 dBm

מדף קמעונאי

אנטנות שדה קרוב, הספק נמוך 15-20 dBm, צפיפות גבוהה

קידוד תג (EPC Gen2 / ISO 18000-6C)

UHF RFID פועל לפי תקן EPC Gen2 (ISO 18000-6C). לכל תג יש 4 בנקי זיכרון: שמור (סיסמאות), EPC (מזהה של 96+ ביט), TID (מזהה שבב בלתי ניתן לשינוי) ומשתמש (נתונים מותאמים אישית).

מבנה זיכרון תג

בנקמזההגודל אופיינישימוש
Reserved0064 bitsסיסמת השמדה (32b) + סיסמת גישה (32b)
EPC0196-128 bitsSGTIN-96, SSCC-96, או קידוד מותאם אישית
TID1096+ bitsמזהה יצרן שבב (לקריאה בלבד, ייחודי)
User110-512 bitsנתונים ספציפיים לאפליקציה (תלוי שבב)

דוגמה לפענוח SGTIN-96

SGTIN-96 הוא הקידוד הנפוץ ביותר עבור מוצרי קמעונאות ושרשרת אספקה. המר EPC הקסדצימלי בן 24 תווים ל-GTIN-14, מספר סידורי ו-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]

השתמש בכלי המקודד EPC המקוון בכתובת /tools/tds-rfid-converter כדי לקודד ולפענח SGTIN-96, SSCC-96, GRAI-96 ישירות בדפדפן שלך.

ניהול צריכת חשמל

עוצמת השידור של הקורא ניתנת להתאמה מ-0 עד 33 dBm לכל יציאת אנטנה. הספק גבוה יותר מגדיל את טווח הקריאה אך גם מגדיל את ההפרעות וצריכת החשמל.

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

ניטור RSSI

ערכי RSSI (מחוון עוצמת אותות שהתקבלו) מתגים מדווחים כבייטים ADC גולמיים (0-255). השתמש בנוסחת ההמרה כדי לקבל ערכי dBm מדויקים.

נוסחת המרה

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

Raw 128

-65 dBm

טוב

Raw 180

-51 dBm

חזק

Raw 220

-40 dBm

מצוין

סריקת מלאי במהירות גבוהה

לסריקת מלאי במהירות גבוהה, הגדר תדרי עבודה, מסנן תגיות כפולות ומצב סריקה רציפה. קוראים תומכים בעד 700 תגיות/שנייה עם תצורה אופטימלית.

תצורת תדר

UHF RFID פועל בפס 920-925 MHz (דרום מזרח אסיה), עם מרווח ערוצים של 0.5 MHz. הערוצים ממוספרים מ-0 (920 MHz) עד 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

זרימת עבודה סריקה אופטימלית

1

הגדר את יציאות האנטנה ורמות ההספק

2

הגדר תדרי עבודה (FHSS עבור סביבות צפופות)

3

הגדר מסנן כפילויות (500ms-3000ms בהתאם למקרה השימוש)

4

שלח READ_EPC_TAG כדי להתחיל מלאי רציף

5

עבד התראות תג (PID 0x1231) כשהן מגיעות

6

שלח STOP_INVENTORY כשתסיים

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");