● CASE STUDY · IDENTIUM TECH SOLUTIONS
RFID Reader Utility
Windows tools for reading UHF tags and setting up standalone readers
OVERVIEW
Identium ships UHF reader modules that come with a closed-source .NET SDK and a Chinese-language vendor app. This project is the pair of small purpose-built Windows tools that replaced it for two specific jobs: pulling full per-tag data (EPC, TID, User bank) into a spreadsheet, and provisioning a reader to run standalone at a gate. Both are C# Windows Forms apps talking to ModuleAPI.dll, one targeting net48 and one net452, shipped to a client as two builds that differ only in an EPC prefix filter.
THE CHALLENGE
The vendor SDK's async event stream exposes RSSI, antenna and timestamp metadata but gives no way to pull TID or User bank bytes into the stream, so getting full per-tag data meant dropping to synchronous reads with singulated tagops between bursts, which only succeed while the tag is still in the field. User memory size varies by chip family, so a fixed word count fails on half the tags. The standalone mode side was harder: the reader's config is an undocumented JSON blob you read and write back over opaque BoardEECommand opcodes, so switching modes came down to patching specific keys by string surgery, handling the 0x9020 needs-a-restart error, and polling after the reboot to confirm the write actually took.
WHAT I BUILT
- 01
Inventory loop that follows each read burst with singulated Gen2 reads for TID and User memory: a Select filter built on the EPC bank at bit offset 32 to skip the CRC and PC words, TagopAntenna and TagopProtocol set explicitly so tagops do not fail with NO_ANTENNAS 0x9002, and a User bank fallback that tries 10, 8, 6, 4 then 2 words, stepping down only on the 0x423 memory overrun fault so chips with different User bank sizes all work.
- 02
CSV export that writes the hex columns as Excel text formulas (="00000000...") so long User Data values and short EPCs keep their leading zeros instead of being turned into numbers on open, with the README documenting the pandas strip needed to read the file back programmatically.
- 03
Standalone Active Mode provisioning: reads the reader's on-board JSON config over BoardEECommand opcodes 30 and 36, injects a bankdata block (bank 3, 7 words) so User memory rides along with the EPC, forces Gen2 session 0 so tags report repeatedly, rewrites the upload block with the PC's IP and port plus a 50 ms aggregation window, adds gpo_act entries that drive the buzzer and LED for 200 ms per tag, writes it back with opcodes 31 and 37, then waits through the reboot and verifies. A Revert to Normal button clears it with opcode 32.
- 04
TCP server that receives the reader's push stream: resyncs the byte buffer on the 0xFF frame marker, reads the 22 byte header plus the big-endian payload length plus CRC, walks the 0x01 tag records inside to pull the variable-length EPC and the embedded user data, and discards anything the reader had buffered in its own memory for the first 3 seconds after connect so the log shows live reads only.
- 05
Network plumbing so the tool works on a plain office PC: it finds which local NIC actually routes to the reader by opening a UDP socket at it and reading back the local endpoint, falls back through a candidate port list when 9091 is reserved by Windows, and adds the inbound firewall rule itself by shelling out to netsh advfirewall with a UAC elevation prompt, then checks that the rule really exists.
OUTCOME
Both tools work and were handed over as client builds, one filtering to the customer's EPC prefixes and one passing everything through. A reader can be provisioned once and then runs unattended, beeping and flashing on every tag, pushing tag data to the PC whenever the app's server is up.