문서
RFID 리더기 통합 매뉴얼
시리얼 통신 설정, 안테나 구성, 태그 인코딩 작업(EPC Gen2 / ISO 18000-6C) 및 전원 관리를 다루는 종합 문서입니다. 멀티 안테나 배치 및 고속 인벤토리 스캐닝 예제가 포함되어 있습니다.
시리얼 통신 설정
Nextwaves NRN 프로토콜 RFID 리더는 시리얼 포트(RS-232 또는 USB-to-Serial)를 통해 통신합니다. 안정적인 데이터 전송을 위해 연결 파라미터를 올바르게 구성해야 합니다.
Baud Rate
115200
Data Bits
8
Stop Bits
1
Parity
None
브라우저 기반 WebSerial API 연결의 경우, app.nextwaves.com/reader에서 Nextwaves Reader Connect를 사용하십시오. 이 애플리케이션은 COM 포트를 자동으로 감지하고 연결 파라미터를 구성합니다.
// 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();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(Protocol Control Word), 카테고리, MID(Message ID), 길이, 데이터 페이로드 및 CRC16-CCITT 체크섬으로 구성된 바이너리 프레임에 캡슐화됩니다.
| 필드 | 크기 | 설명 |
|---|---|---|
| Header | 1 byte | 항상 0x5A — 프레임 시작 마커 |
| PCW | 2 bytes | 프로토콜 플래그 (버전, 주소) |
| Category | 1 byte | 명령 카테고리 (0x00=System, 0x01=Device, 0x02=RFID) |
| MID | 1 byte | 카테고리 내 메시지 ID |
| Length | 2 bytes | 바이트 단위 페이로드 길이 (big-endian) |
| Data | N bytes | 명령별 페이로드 |
| CRC16 | 2 bytes | 헤더 이후 바이트의 CRC16-CCITT 체크섬 |
명령 예시
TX → 5A 00 01 01 00 00 00 DC E5
┌──┐ ┌────┐ ┌──┐ ┌──┐ ┌────┐ ┌────┐
│5A│ │0001│ │01│ │00│ │0000│ │DCE5│
└──┘ └────┘ └──┘ └──┘ └────┘ └────┘
HDR PCW CAT MID LEN CRC16TX → 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)TX → 5A 00 01 02 FF 00 00 88 5A
HDR PCW CAT MID LEN CRC16주요 명령 참조
| 명령 | 코드 | 설명 |
|---|---|---|
| QUERY_INFO | 0x0100 | 리더 시리얼 번호 및 펌웨어 버전 조회 |
| QUERY_RFID_ABILITY | 0x1000 | RFID 기능 조회 (출력 범위, 안테나 수) |
| READ_EPC_TAG | 0x0210 | 연속 EPC 태그 인벤토리 시작 |
| WRITE_EPC_TAG | 0x0211 | 태그의 EPC 뱅크에 데이터 쓰기 |
| STOP_INVENTORY | 0x02FF | 실행 중인 태그 인벤토리 중지 |
| CONFIGURE_READER_POWER | 0x0201 | 송신 출력 설정 (안테나당 0-33 dBm) |
| CONFIGURE_ANTENNA_ENABLE | 0x0203 | 안테나 포트 활성화/비활성화 (비트마스크) |
| SET_WORKING_FREQUENCY | 0x0205 | 특정 동작 주파수 설정 |
| SET_FILTER_SETTINGS | 0x0209 | 태그 중복 필터 구성 (시간 기반) |
| BUZZER_SWITCH | 0x011E | 버저 모드 제어 |
안테나 구성
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
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다중 안테나 배치
다중 안테나를 배치할 때는 편파(선형 vs 원형), 안테나 간 간격 및 중첩되는 커버리지 영역을 고려하십시오. 리더는 활성화된 안테나를 순차적으로 스캔하며, 각 태그 보고서에는 위치 확인을 위한 안테나 ID가 포함됩니다.
독 도어
포털당 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개의 메모리 뱅크가 있습니다: Reserved (비밀번호), EPC (96비트 이상의 식별자), TID (변경 불가능한 칩 ID), 및 User (사용자 정의 데이터).
태그 메모리 구조
| 뱅크 | ID | 일반적인 크기 | 용도 |
|---|---|---|---|
| Reserved | 00 | 64 bits | Kill 비밀번호 (32b) + Access 비밀번호 (32b) |
| EPC | 01 | 96-128 bits | SGTIN-96, SSCC-96 또는 사용자 정의 인코딩 |
| TID | 10 | 96+ bits | 칩 제조업체 ID (읽기 전용, 고유) |
| User | 11 | 0-512 bits | 애플리케이션별 데이터 (칩에 따라 다름) |
SGTIN-96 디코딩 예시
SGTIN-96은 리테일 및 공급망 제품에서 가장 일반적으로 사용되는 인코딩입니다. 24자 16진수 EPC를 GTIN-14, 일련번호 및 GS1 Digital Link로 변환합니다.
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// 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 Encoder 도구를 사용하세요: /tools/tds-rfid-converter 브라우저에서 직접 SGTIN-96, SSCC-96, GRAI-96을 인코딩 및 디코딩할 수 있습니다.
전원 관리
리더 송신 출력은 안테나 포트당 0에서 33 dBm까지 조절 가능합니다. 출력이 높을수록 인식 거리는 늘어나지만 간섭과 전력 소비도 증가합니다.
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 readersRSSI 모니터링
태그의 RSSI (Received Signal Strength Indicator) 값은 raw 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)까지입니다.
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최적의 스캔 워크플로우
안테나 포트 및 출력 레벨 설정
동작 주파수 설정 (밀집 환경의 경우 FHSS 사용)
중복 필터 설정 (사용 사례에 따라 500ms-3000ms)
연속 인벤토리를 시작하려면 READ_EPC_TAG를 전송하십시오
태그 알림(PID 0x1231)이 수신되는 대로 처리하십시오
완료되면 STOP_INVENTORY를 전송하십시오
// 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");