DevCon 2025: Connect | Learn | Build
June 4 - 6, 2025
Amsterdam, Netherlands
Explore Advanced Windows Development for RFID Readers and POS Integration
Presented by Suresh Ramamoorthy, Senior Manager, Software Engineering, Advanced Location Technologies
Agenda
-
SDK/Tools
- Architecture
- Windows
- RFID.NET SDK
- 123RFID Desktop
- JPOS
- RFID Scanner Driver - Demo App
-
New Products
- FXP20 POS Reader
- RFID Accessory for ET6xW
-
Technical Resources
-
Best Practices
RFID System: Physical View
Identify and track objects wirelessly. Operates at a frequency of 860-930 MHz (Ultra High Frequency). Read range up to 20 meters.
Host system: Manages and controls the reader for reading tags or programming tags. Can be a Computer, Server, or Cloud-based platform.
Reader: Transmits radio frequency to activate the tag for receiving, decoding/encoding the tag.
Antenna: Transmits radio frequency to the tag and receives data from the tag. Polarization can be Linear (predictable placement) or Circular (unpredictable placement).
Tag: Attached to the asset/item being tracked. Contains Microchip and antenna. Passive tags rely on reader energy and have a reading range up to 20m. Active tags have an internal power source for longer distances (up to 100m reading range).
RFID Standards (GS1): EPC UHF Gen2 Air interface Protocol. Provides physical and logical requirements for an RFID System. See GS1 UHF Air Interface Protocol.
RFID Tag: Logical View
Memory Bank: USER (optional), TID, EPC, RESERVED.
Target: Inventoried Flag (SO, S1, S2, S3).
Default Persistence: Indefinite, 500ms to 5s.
Not Energized: None, 500ms to 5s, 2s.
Reserved: Kill (1st and 2nd word), Access passwords (3rd and 4th word).
EPC: Identifies the asset/item.
TID: Tag manufacturer specific information (Tag Model, serial number). Permanently locked during tag manufacturing.
USER: Allows user-specific data storage.
Tag States: Sessions support four sessions (S0, S1, S2, S3). Tags participate in one session during inventory. Inventoried flag can be A or B. Select Flag (SL) can be asserted or deasserted.
Manage Tag Population: C1G2 Standard
Select (Pre-filter):
Selects the tag population. Target indicates whether Tag's SL or inventoried flag. Action indicates whether matching tags modify SL (Assert SL or Deassert SL) or inventoried flag (A or B). Memory Bank (EPC, TID or User Memory). Start Location, Length, Mask (bit string that tag compares).
Inventory (Singulation):
Determines which tags to be participated. Sel: which tags to respond based on SL flag (0: ALL, 1: ALL, 2: ~SL, 3: SL). Session: choose the session for the inventory round (0: S0, 1: S1, 2: S2, 3: S3). Target (inventoried flag) (0: A, 1: B). Q: Tag population in the range of antenna.
Access Commands:
- Read - Reads memory bank.
- Write - Writes memory bank.
- Kill - Permanently disable the tag (Kill password).
- Lock - Access/Kill Password (Prevent read/write), Individual memory banks (prevent write), Permalock lock status password or memory bank.
Select Tags Matching with EPC "3074":
Target: SO, Action: 4. Mem Bank: EPC. Start Location: 32. Length: 16. Mask: "3074".
Inventory (Singulation)
Sel: 0. Session: SO. Target: B. Q: 8.
Action | Matching | Non-Matching |
---|---|---|
0 | assert SL or inventoried -> A | deassert SL or inventoried -> B |
1 | Assert SL or inventoried -> A | do nothing |
2 | do nothing | deassert SL or inventoried -> B |
3 | negate SL or (A->B, B->A) | do nothing |
4 | assert SL or inventoried -> B | assert SL or inventoried -> A |
5 | assert SL or inventoried -> B | do nothing |
6 | do nothing | assert SL or inventoried -> A |
7 | do nothing | negate SL or A -> B, B->A) |
3C Framework: Advance RFID Integration Quickly
- Connect: Discover available readers, Establish Connection.
- Configure: Setup Region (Persistent), Customize the reader to meet specific needs (Transient), Setup Event Streaming, Settings for optimal functionality, User preferences.
- Control: To achieve optimal performance, Control, Start/Stop operation, Manage, Software Update, Reboot, Factory Reset, Monitor Health Status.
RFID API: Structure
Generic Reader
- Reading Tags (Inventory)
- Programming Tags (Tag Access)
- Read, Write, Lock, Kill
Reader Management
- Managing Reader
- Region Setting
- Software Update
- Factory Reset
- Reboot
- Configuration
RFID Windows SDK: Architecture
User Application interacts with 123RFID Desktop and RFID Handheld Reader SDK.
The SDK supports various Zebra RFID readers including:
- RFD40 Standard, RFD40 Premium, RFD40 Premium+
- RFD90 30 Short range, RFD90 90 Long Range
- ET60W Wi-Fi, ET65W WAN
- FXP20
Connectivity options include USB-CDC, USB-CDC/Bluetooth, USB-CDC/Bluetooth/Ethernet, and USB/Bluetooth: Serial Ethernet: TCP/IP.
Requires Windows 11 64-bit and above, .NET Framework 4.8, and Visual Studio.
RFID Handheld Reader SDK: Windows
This SDK supports handheld RFID readers (RFD40/90, RFD8500, ET6xW, FXP20).
Tools:
- 123RFID Desktop - GUI based Demo Tool
Prerequisites:
- Host Platform: Microsoft Windows 11 64-bit and above
- Microsoft .NET Framework: 4.8 for Windows
- Visual Studio
Release Package:
- Demo App: Windows.RFID.DemoApp_3.0.33.zip
- Demo Source: Windows.Desktop.DemoApp.Src_v3.0.33.zip
- RFID SDK: Windows.RFID.SDK_3.0.33.zip (Includes Libraries and config files)
RFID .NET SDK: Generic Reader
Connect | Configure | Control |
---|---|---|
Discover & Connect
|
Settings
|
Reading Tags
|
RFID .NET SDK: Reader Management
Connect | Configure | Monitor | Control |
---|---|---|---|
Discover & Connect
|
Region (Persistent)
|
N/A | Software Update
|
Read Tags Demo (C# Example)
This C# code demonstrates how to connect to a reader, configure it, and read tags.
using Symbol.RFID.SDK.Domain.Reader;
using Symbol.RFID.SDK;
using System.Collections.Generic;
using System;
using System.Linq;
using System.Threading;
//CONNECT: Discover and connect to the reader
Console.WriteLine("Finding readers....");
var readerInfoList = new List();
var readerManager = RfidSdk.ReaderManagementServicesFactory.Create(ReaderCommunicationMode.USB);
readerInfoList = readerManager.GetReaders (ReaderSearchOptions.AllReaders);
List readerList = new List();
foreach (IRfidReaderInfo readerInfo in readerInfoList.OrderBy(o => o.FriendlyName))
{
var reader = RfidSdk.RfidReaderFactory.Create(readerInfo);
Console.WriteLine("Found reader:-"+ reader.FriendlyName);
readerList.Add(reader);
}
if(readerList!=null && readerList.Count>0)
{
var fxp20Reader=readerList.FirstOrDefault(ee=>ee.ReaderType==ReaderType.FXP);
if(fxp20Reader!=null)
{
Console.WriteLine("Connecting FXP20 reader-" + fxp20Reader.FriendlyName);
fxp20Reader.Connect();
Console.WriteLine("Connected-"+ fxp20Reader. FriendlyName+ "\n");
// CONFIG: Setup Events
fxp20Reader.Inventory.AttachTagDataWithTagDataReceivedEvent = false;
fxp20Reader.Inventory.InventoryStarted += Inventory_InventoryStarted;
fxp20Reader.Inventory.InventoryStopped += Inventory_InventoryStopped;
// CONTROL: Read tags for 2s
Console.WriteLine("Performing Inventory for 2 sec...");
fxp20Reader. Inventory. Perform();
Thread.Sleep(2000);
fxp20Reader.Inventory.Stop();
var tagDataArr = fxp20Reader. Inventory.GetReadTags (1000);
foreach (ITagData dataReceived in tagDataArr)
Console.WriteLine("Tag ID: "+ dataReceived.EPCId);
// Disconnect reader
fxp20Reader. Disconnect();
}
}
// Event Notifications
private static void Inventory_InventoryStarted(object sender, EventArgs e)
{
Console.WriteLine("Event: Inventory started.\n");
}
private static void Inventory_InventoryStopped(object sender, EventArgs e)
{
Console.WriteLine("Event: Inventory stopped.\n");
}
123RFID Desktop: Demo
123RFID Desktop is a simple setup and optimization tool for Zebra's passive RFID readers. Supported models include FX7500, FX9600, RE40, ATR7000, RFD40, FXR90, RFD90, ET6xW and FXP20.
What you can do:
- Read Tags: 3-clicks from launch to reading tags.
- Optimize Reader: Configuration wizard streamlines setup, 1-click Start/Stop starts and stops inventory. Filter by Reader, EPC, RSSI or Asset Tag list file helps with trend analysis.
- Write Tags: Perform tag memory access operations including writing to EPC and User Memory bank.
- Program GPIO accessory: Setup a proof of concept demonstrating solutions using GPIO accessories.
- Update Firmware: Update firmware on multiple readers (20 max) at once.
- Built-in Help: Screen-by-screen explanation of capabilities and how-to videos.
JPOS Driver for FXP20
POS Standards Overview:
- What is JPOS? JavaPOS (JPOS) is a free, open-source software framework providing a standard interface for point of sale (POS) devices (including RFID readers). JPOS is based on the International Organization for Standardization transaction card originated messages standard (ISO-8583). More info: www.jpos.org.
- What is UPOS? UPOS (Unified Point of Service) is a standard specification used in retail and point-of-sale (POS) systems that defines a common programming interface for various types of POS devices. UPOS is part of the broader JavaPOS and OPOS standards, which are often used in retail environments to interface with hardware like barcode scanners, receipt printers, cash drawers, and RFID readers. More info: www.omg.org/retail/unified-pos.htm.
- Provides a consistent, platform-independent, and vendor-neutral framework for POS devices.
JPOS/UnifiedPOS: Architecture
The architecture involves a POS Application interacting with a UnifiedPOS Device, which includes UnifiedPOS Control (Javapos-controls.jar) and Unified POS Service (jpos-rfidscanner-svc-3.0.2 (Zebra)). This communicates with the Physical (or logical) Device (FXP20) via USB CDC. JPOS.XML (Logical Name: ZebraRFIDScanners) is used for configuration.
JPOS RFID Scanner: Capabilities
- Reading Tags (Continuous / timer based): Reads TagID and UserData, Reads Partial UserData.
- Writing a Tag: Writes TagID, Writes UserData / Partial UserData.
- Locking a Tag
- Disables (kills) RFID tag
The RFID Scanner can fire events such as DataEvent, OutputCompleteEvent, and ErrorEvent to indicate the status of operations.
JPOS RFID Driver: Windows
- JPOS RFID Driver: Develop applications using the JPOS RFID Scanner Interface for FXP20 RFID POS Reader.
- Demo Tools: JPOS Sample App.
- Prerequisites: Host Platform: Microsoft Windows 11 64-bit and above; Java: Oracle JDK 1.8 or above; IDE: NetBeans IDE 8.2 or above [64-bit].
- Release Package: Includes Service Class library, JPOS dependent libraries, Zebra: jpos-rfidscanner-svc-3.0.2.jar, UPOS: jcl.jar, javapos-controls.jar, JavaCoreLogger.jar, jpos_trace.properties, jpos-rfidscanner-test.jar (sample app), jpos.xml (configuration file), and javapostest.bat (batch file).
RFID Reader: Generic Reader
Connect | Configure | Control |
---|---|---|
Discover & Connect
|
Settings
|
Reading Tags
|
RFID Reader: Reader Management
Connect | Configure | Monitor | Control |
---|---|---|---|
Discover & Connect
|
Setup Event Streaming
|
checkHealth | Software Update
|
Read Tags Demo (Java Example)
This Java code demonstrates how to connect to a reader, configure it, and read tags using JPOS.
import jpos. JposException;
import jpos.RFIDScanner;
import jpos.events.*;
public class JavaPosReadTagsDemo {
static String logicalName = "ZebraRFIDScanners";
static RFIDScanner reader = null;
static private DataListener dataListener;
public static void main(String[] args) throws JposException {
reader = new RFIDScanner();
// 1. CONNECT
reader.open(logicalName);
reader.claim(1000);
// 2. CONFIGURE
reader.setDeviceEnabled(true);
reader.addDataListener(dataEventListener);
// 3. CONTROL
reader.readTags(RFID_RT_ID, new byte[0], new byte[0], 0, 0, 5000, new byte[0]);
try {
Thread.sleep(1000);
} catch (InterruptedException jposException) {
jposException.printStackTrace();
}
try {
reader.firstTag();
for (int index = 0; index < reader.getTagCount() - 1; index++) {
String tagID = new String(reader.getCurrentTagID());
System.out.println("Tag ID " + tagID);
reader.nextTag();
}
} catch (JposException e) {
e.printStackTrace();
}
// Dispose Reader
reader.release();
reader.close();
}
static DataListener dataEventListener = new DataListener() {
@Override
public void dataOccurred(DataEvent dataEvent) {
System.out.println("dataOccurred STATUS : " + dataEvent.getStatus());
}
};
}
JPOS Sample App: Demo: Run JavaPOSTest.bat
This demonstrates the functionality of the JPOS Sample App by running the JavaPOSTest.bat file.
FXP20 POS Reader
FXP20 Fixed RFID Reader: Specification
- Power: 12VDC, 2A with lockable connector
- Internal worldwide Antenna: 1 dBic - Circular Polarized
- RFID Power: Scalable from -10 to 27 dBm
- External Antenna: 3x SMA connector
- Visual Status Indicators: 3 LED indicator multicolor lights (green, blue, orange)
- Audible Status Indicators: Buzzer adjustable from 0 to 95dB (4 levels)
- Connectivity: 1 x USB Host Type-B Lockable
- GPIO port (input): 1 - 12 volts/50 ma
FXP20 Fixed RFID Reader: External Interfaces
Front View: Includes RFID Reading Area, Power LED, COM LED, RFID LED, Internal buzzer, ABS UL94V0 case.
Side View: Includes DC Power connector, GPI connector, USB connector, Reset Button, Antenna Port 2, Antenna Port 3, Antenna Port 4.
ET6xW Tablet: Specification
- SKU: XBK-ET6X-RFID-X-01 (XN – North America, E-EMEA, A-AU/NZ)
- Installation: Easy to install. Attaches to the back side of the ET6x.
- Hand Strap
- Protocol: EPC Class1 Gen2 UHF RFID protocol
- Frequencies: North America: 902-928 MHz, EU: 865-867 MHz
- Read range: > 1 meter (3 feet)
- Tag Reading Speed: min 10 tags per second
- Antenna: Circular polarized antenna
- Connectivity: Max. USB 5V/750mA
- RF max power: 24 dBm
- Sealing: IP66 sealed
- Operating Temperature: -20 to +60 C
- Drop rating: 4 feet on concrete
Smart Inventory: Profiles
Profile | Description | Transmit power | Duty Cycle | Session | Tag Population | Link Profile |
---|---|---|---|---|---|---|
Optimal Battery | For Best battery life | 20dBm | 15% RF ON: 100ms Period: 667ms | S0 | 3 | 0 |
Balanced Performance (Default) | Maintains Balance between performance and battery life | 20dBm | 25% RF ON: 150ms Period: 600ms | S0 | 3 | 0 |
Max range | Reads as many tags as fast as possible in longer range | 24dBm | 30% RF ON: 150ms Period: 500ms | S0 | 10 | 2 |
Fastest Read | Reads as many tags as fast as possible in shorter range | 20dBm | 35% RF ON: 175ms Period: 500ms | S0 | 10 | 2 |
Cycle Count | Reads unique tags | 24dBm | 30% RF ON: 150ms Period: 500ms | S2 | 50 | 0 |
Link Profile table:
0: M=4/240, PIE=2, Tari=25us
1: M=2/320, PIE=2, Tari=18.8us
2: M=4/320, PIE=2, Tari=18.8us
Technical Resources
Resources: SDK/Tools/Documentation
- SDK/Tool: RFID Reader SDK for Windows (.NET) – includes Demo App (Exe, Source), SDK. Link: Zebra RFID SDK for Windows
- RFID Reader Tech Docs: Link: techdocs.zebra.com/dcs/rfid/
- 123RFID Desktop v3.0.0.33 or above: Link: 123RFID Desktop
- JPOS RFID Scanner Driver (Java)
- FXP20 POS RFID Reader Product Info: Link: FXP20 Product Info
- Quick Reference Guide
- Integration Guide
- Contact Zebra for support: Link: Zebra Contact Tech Support
RFID: Best Practices
- JPOS RFID: JPOS does not support Region Settings, write a Tag Access or Kill Password. 123RFID Desktop or .NET SDK can be used to set the region.
- Read Range: Adjust transmit power to avoid reading the tags in nearby RFID reader.
- Events Handling: No Blocking functions in events handler / callback functions. Enqueue the tags and release immediately.
- Reliable Encoding tag: Tags must be closer to the antenna and transmit power can be maximum.
- Optimal Performance: 123RFID Desktop tool can be used to verify and identify the right settings.
SDK/Tool: Upcoming features (FXP20)
- Windows SDK/JPOS: Beeper, External Antenna, GPI.
- JPOS: Region setting. For now, Region must be configured using 123RFID Desktop or Windows RFID SDK.
Questions?
Thank You
©2025 Zebra Technologies Corp. and/or its affiliates. All rights reserved.
Related Documents
![]() |
Developing for Zebra RFID: A Comprehensive Guide for Handheld and Fixed Readers This guide provides a comprehensive overview of developing for Zebra RFID readers, covering APIs, frameworks, use cases, and best practices for both handheld and fixed readers. It details connection methods, reader management, and various application scenarios like inventory, location tracking, bulk encoding, and conveyor belt reading. |
![]() |
Mastering Zebra RFID: Optimizing Reader Performance with Real-Time Health Monitoring and Gen2X Extensions A guide to mastering Zebra RFID technology, focusing on optimizing reader performance through real-time health monitoring and leveraging Gen2X extensions. Covers device status, API overview, health monitoring, IoT connector configurations for fixed readers and sleds, MDM integration, handheld SDK usage, Gen2x features, and best practices for RFID implementation. |
![]() |
123RFID Desktop User Guide - Zebra Technologies Comprehensive user guide for Zebra's 123RFID Desktop software, detailing how to connect, read, configure, and manage Zebra RFID readers like the FX7500, FX9600, RFD40, and RFD90. |
![]() |
Zebra FX Series 3.8.22 Firmware Release Notes and Update Guide Comprehensive release notes for Zebra FX Series RFID readers (FX7500, FX9600) firmware version 3.8.22, detailing new features, installation, known issues, and software components. |
![]() |
Zebra RFD40 RFID Sled Quick Start Guide A concise guide to setting up and using the Zebra RFD40 RFID Sled with the TC20 Mobile Computer, covering features, installation, charging, software, and optimal usage. |
![]() |
Zebra Workabout Pro 4 RFID Modules: Hardware and Software Guide Comprehensive guide to Zebra Workabout Pro 4 RFID modules, detailing UHF, HF, and LF hardware specifications, software compatibility, and options. Includes model numbers WA9901 through WA9906. |
![]() |
Zebra FX Series Embedded Java SDK User Guide for Windows Guide for developers on using the Zebra FX Series Embedded Java SDK for Windows. Learn to develop, debug, and package Java applications for FX9600/FX7500 RFID readers, covering SDK installation, remote debugging, JAR creation, and deployment. |
![]() |
Zebra RFID SDK for Android v2.0.2.125 Release Notes and Overview Summary of Zebra RFID SDK for Android v2.0.2.125, detailing updates, bug fixes, device compatibility, and developer system requirements for integrating RFID functionality into Android applications. |