LLRPCSHARP / PROGRAMMER’S GUIDE
Reader SDK Programmer’s Guide
LlrpSdk 是面向 .NET 应用的托管 LLRP 客户端。它把 TCP 会话、协议版本协商、设备能力、Reader 设置、托管盘点和标准 C1G2 标签访问收敛到 LlrpReader 门面;应用通常不需要手写 ROSpec 或 AccessSpec 消息。
1. 安装与边界
将 Reader SDK 添加到应用:
dotnet add package LlrpSdk --version 2.0.5Impinj 与 Zebra 扩展是独立包,只有在目标设备和版本匹配时才会激活:
dotnet add package LlrpSdk.Extensions.Impinj --version 2.0.5
dotnet add package LlrpSdk.Extensions.Zebra --version 2.0.52. 连接读写器
LlrpReaderBuilder 用于设置地址、端口和连接超时。默认协议策略为自动协商:
using LlrpSdk;
await using var reader = LlrpReader.CreateBuilder("192.168.1.100")
.WithPort(5084)
.WithConnectTimeout(TimeSpan.FromSeconds(5))
.Build();
await reader.ConnectAsync();
Console.WriteLine(reader.Identity);Auto先建立连接,再尝试 1.1 协商;不支持时回到 1.0.1。默认选择Force101跳过版本探查,直接使用 LLRP 1.0.1。已知旧设备Force11必须完成 1.1 协商,失败不会静默降级。明确要求 1.1Force20使用当前 2.0 SDK 适配器基线;真实设备互操作仍需单独验收。2.0 实验或目标设备连接成功后,Capabilities、Identity 和扩展激活状态才具有设备上下文。
3. 读取设备能力
LLRP 的 RF Mode、发射功率和接收灵敏度通常以 Index 表示。不要猜测数字含义,应从当前 Reader 的能力表读取:
ReaderCapabilities capabilities = reader.Capabilities!;
Console.WriteLine(capabilities.MaxNumberOfAntennas);
foreach (var mode in capabilities.RfModes)
Console.WriteLine(mode.Description);
foreach (var power in capabilities.TransmitPowerTable)
Console.WriteLine(power.TransmitPowerDbm / 100.0);GetDefaultSettingsAsync() 会基于当前设备身份、协商版本和能力表生成推荐基线;它不是设备当前配置快照。需要读取设备事实时使用 QuerySettingsAsync()。
4. 配置读写器
ReaderSettings 表示应用想要的配置。常见流程是“读取能力相关默认值 → 编辑 → 应用”,应用后 Inventory 仍保持停止,直到显式启动:
ReaderSettings baseSettings = (await reader.GetDefaultSettingsAsync()).Settings;
ReaderSettings settings = baseSettings.Edit(builder => builder
.Inventory(inventory => inventory
.Antennas(1, 2, 3, 4)
.Mode(modeIndex: 1000)
.Session(2)
.Population(128)
.ReportEveryTag()));
await reader.ApplySettingsAsync(settings);PreserveForeign
默认只替换 SDK 自己托管的 ROSpec、AccessSpec 和临时资源,保留其他应用资源。
ReplaceAll
明确要求独占设备时才使用;它会删除全部标准 ROSpec/AccessSpec,适合专用测试设备。
配置文件、默认值和设备快照分别代表不同来源。SDK 不会把 Raw/专家接口的修改自动当成新的应用意图。
5. 托管盘点与报告
应用配置完成后,使用独立的 InventorySession 读取报告:
await using var session = await reader.StartInventoryAsync();
await foreach (TagReport tag in session.ReadReportsAsync())
{
Console.WriteLine(tag.EpcHex);
}InventorySession.ReadReportsAsync()、TagsReported 和连接级 ReadTagReportsAsync() 是互斥的报告出口。一次盘点中,第一个开始消费的出口取得所有权,避免同一份报告被多个消费者重复处理。
ReaderSettings 或 InventorySettings,必要时重新部署。6. 标签访问
标准 C1G2 Tag Access 由 SDK 管理 AccessSpec 生命周期。下面是按 EPC 选择标签并读取 User 区的最小示例:
var selection = new TagSelection
{
MemoryBank = TagMemoryBank.ElectronicProductCode,
BitPointer = 32,
BitLength = 96,
Mask = Convert.FromHexString("FFFFFFFFFFFFFFFFFFFFFFFF"),
Data = Convert.FromHexString("E28011910000000000000001")
};
TagAccessResult result = await reader.ReadTagMemoryAsync(new ReadTagRequest
{
Selection = selection,
MemoryBank = TagMemoryBank.User,
WordPointer = 0,
WordCount = 2
});
Console.WriteLine(result.Operation.Success);写入、锁定、销毁和块擦除也有对应的高层请求。Kill、Lock 以及带写入的操作可能不可逆,请在专用标签和明确的应用确认流程中执行。
7. 厂商扩展
扩展注册只是声明候选能力;连接后 SDK 会根据 Reader 身份和协商版本决定是否激活。应用在使用扩展设置前应检查实际激活状态:
using LlrpSdk.Extensions.Impinj;
await using var reader = LlrpReader.CreateBuilder("192.168.1.100")
.UseImpinj()
.Build();
await reader.ConnectAsync();
if (reader.Extensions.Get<ImpinjReaderExtension>() is null)
throw new NotSupportedException("Impinj extension is not active on this reader.");当前仓库提供 Impinj 与 Zebra 的协议/SDK 扩展基线;不同型号、固件和字段仍以实机互操作证据为准。
8. 生命周期与边界
Capabilities,用设备事实生成或校验设置。StartInventoryAsync()。await using 结束 Reader 生命周期。下一步:Reader SDK API Reference 提供公开类型和方法索引;需要命令行操作时转到 Reader CLI User’s Guide。