Low Level Reader Protocol (LLRP v1.0.1 / v1.1)
LLRP provides standard binary message serialization between host middleware and physical RFID readers. It allows granular configuration of reader operations (ROSpecs), antenna ports, RF power (dBm), filter algorithms, and real-time RO_ACCESS_REPORT event notifications.
Core Protocol Architecture & Specifications
- ✓ Standardized binary encoding with 10-bit Message Type and 32-bit Length headers
- ✓ Configurable ROSpec (Reader Operation Specification) with periodic and trigger-based inventory runs
- ✓ Granular antenna port power, sensitivity, and tag dwell time control
- ✓ Real-time RO_ACCESS_REPORT message decoding with Peak RSSI, Antenna ID, and PC/EPC bytes
- ✓ Zero vendor lock-in across Impinj, Zebra, Alien, and generic UHF readers
using System.Buffers.Binary;
public static class LlrpMessageDecoder
{
public const ushort RO_ACCESS_REPORT_MSG_TYPE = 61;
public const ushort PARAM_TAG_REPORT_DATA = 240;
public const ushort PARAM_PEAK_RSSI = 218;
public const ushort PARAM_ANTENNA_ID = 221;
public static List<(string EPC, float RSSI, int Antenna)> DecodeRoAccessReport(byte[] buffer)
{
var tags = new List<(string EPC, float RSSI, int Antenna)>();
if (buffer == null || buffer.Length < 10) return tags;
ushort msgTypeHeader = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(0, 2));
ushort msgType = (ushort)(msgTypeHeader & 0x03FF);
uint length = BinaryPrimitives.ReadUInt32BigEndian(buffer.AsSpan(2, 4));
if (msgType != RO_ACCESS_REPORT_MSG_TYPE || buffer.Length < length) return tags;
int index = 10;
int maxIndex = (int)length;
while (index + 4 <= maxIndex)
{
ushort paramHeader = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(index, 2));
ushort paramType = (ushort)(paramHeader & 0x03FF);
ushort paramLength = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(index + 2, 2));
if (paramLength == 0 || index + paramLength > maxIndex) break;
if (paramType == PARAM_TAG_REPORT_DATA)
{
// Parse EPC-96, RSSI, and Antenna Port
var tag = ParseTagReportData(buffer, index + 4, index + paramLength);
if (!string.IsNullOrEmpty(tag.EPC)) tags.Add(tag);
}
index += paramLength;
}
return tags;
}
} Verified Hardware Implementations
Our engineering team has thoroughly tested and validated LLRP across the following reader models, embedded modules, and smart transponders:
Target Deployments
- High-speed conveyor portals
- Warehouse dock door loading gates
- Automated manufacturing lines
- Multi-antenna smart shelves
Deploy with OpenRFID
Integrate LLRP into your ERP, warehouse software, or custom mobile app with pre-built C# / C++ drivers.
Frequently Asked Questions (LLRP)
Engineering insights on EPCglobal / ISO/IEC 24730 implementation challenges
Why use LLRP over proprietary reader SDKs?
Does LLRP support Keep-Alive heartbeats?
How does LLRP binary framing structure its 10-bit Message Type and 32-bit Length headers?
RO_ACCESS_REPORT, 20 for ADD_ROSPEC). The subsequent 32 bits define the total byte length of the message payload including nested parameters.How do you configure an `ADD_ROSPEC` message for trigger-based conveyor scanning?
ROSpec, define an ROBoundarySpec containing an ROSpecStartTrigger set to GPI (General Purpose Input) Trigger Type. When the photoelectric sensor detects an approaching box, the reader immediately starts inventory execution and shuts down upon a timer or trailing edge trigger.