Reader SDK API 参考手册

LLRPCSHARP / READER SDK PUBLIC API REFERENCE

Reader SDK API 参考文档

LlrpSdk 提供参考 Impinj Octane 设计的高层托管客户端,支持协议版本自适应、强类型不可变配置模型、独占流式标签消费以及 C1G2 标签内存完整操作。

架构与核心能力

核心包
LlrpSdk (基于 .NET 10 现代异步流与 Channels)
协议支持
LLRP 1.0.1 / 1.1 可用基线 · 2.0 适配器基线
状态模型
DesiredSettings 意图与 ObservedState 物理实况严格双轨隔离
资源接管
默认 PreserveForeign (安全共存) · 可选 ReplaceAll

快速符号索引 (Quick Jump)

Reader SDK 核心门面与生命周期

LlrpReader Class
命名空间: LlrpSdk · 实现: IAsyncDisposable

代表与单个物理或虚拟 LLRP 读写器的托管客户端会话。管理连接生命周期、协议版本自动探查、硬件能力查询、不可变配置下发与异步标签流分发。

核心方法与签名

方法签名说明与契约
Task ConnectAsync(CancellationToken cancellationToken = default) 建立底层 TCP 连接,探查并协商协议版本,初始化 Capabilities。若已连接则直接返回。
Task<ReaderSettingsDefaults> GetDefaultSettingsAsync(CancellationToken cancellationToken = default) 基于当前已连接设备的硬件能力表(天线数、功率表、RF 模式)生成推荐的默认配置基线。
Task ApplySettingsAsync(ReaderSettings settings, ResourceTakeoverPolicy takeoverPolicy = PreserveForeign, CancellationToken cancellationToken = default) 校验并将配置意图部署到读写器(部署后保持停止状态)。默认仅替换 SDK 自有资源。
Task<InventorySession> StartInventoryAsync(InventorySettings? settings = null, CancellationToken cancellationToken = default) 启动托管盘点并返回 InventorySession 会话实例。支持独占异步消费标签流。
Task StopAsync(CancellationToken cancellationToken = default) 停止当前正在运行的托管盘点,保留已下发的配置定义。

实战代码示例 (C# Code Sample)

using LlrpSdk;

// 1. 构建并连接读写器
await using var reader = LlrpReader.CreateBuilder("192.168.1.100")
    .WithPort(5084)
    .WithConnectTimeout(TimeSpan.FromSeconds(5))
    .Build();

await reader.ConnectAsync();

// 2. 获取基于该设备真实能力生成的默认设置并下发
ReaderSettingsDefaults defaults = await reader.GetDefaultSettingsAsync();
await reader.ApplySettingsAsync(defaults.Settings);

// 3. 启动盘点并消费标签流
await using InventorySession session = await reader.StartInventoryAsync();
await foreach (TagReport tag in session.ReadReportsAsync())
{
    Console.WriteLine($"[天线 {tag.AntennaId}] EPC: {tag.EpcHex}, RSSI: {tag.PeakRssi} dBm");
}
LlrpReaderBuilder Class
命名空间: LlrpSdk

提供流式链式调用以配置并创建 LlrpReader 实例。

实战代码示例 (C# Code Sample)

using LlrpSdk;
using LlrpSdk.Extensions.Impinj;

var reader = LlrpReader.CreateBuilder("192.168.1.100")
    .WithPort(5084)
    .WithConnectTimeout(TimeSpan.FromSeconds(10))
    .UseImpinj()
    .Build();
ReaderCapabilities Class
命名空间: LlrpSdk

存储连接建立后从读写器查询并归一化的硬件能力(天线数、功率索引表、RF 调制模式表)。

配置管理与托管盘点流

ReaderSettings Record
命名空间: LlrpSdk

不可变的读写器配置意图 Record,包含设备级心跳与 Inventory 盘点参数。

实战代码示例 (C# Code Sample)

ReaderSettings baseSettings = (await reader.GetDefaultSettingsAsync()).Settings;

ReaderSettings customSettings = baseSettings.Edit(b => b
    .Inventory(inv => inv
        .Antennas(1, 2)
        .Mode(modeIndex: 1000)
        .Session(2)
        .Population(64)
        .ReportEveryTag()));

await reader.ApplySettingsAsync(customSettings);
InventorySession Class
命名空间: LlrpSdk · 实现: IAsyncDisposable

代表单次托管盘点会话。实现 IAsyncDisposable,在退出作用域时自动停止盘点。

TagReport Record
命名空间: LlrpSdk

统一的标签报告投影,包含 EPC 十六进制字符串、天线号、RSSI、变长 PC 字与 Access 结果。

C1G2 标签操作 (Tag Access)

TagAccessRequest / TagSelection Records
命名空间: LlrpSdk

标准 Gen2 内存读写锁灭请求族,支持通过 EPC/TID 掩码过滤目标标签。

实战代码示例 (C# Code Sample)

// 1. 匹配目标标签
var selection = new TagSelection
{
    MemoryBank = TagMemoryBank.ElectronicProductCode,
    BitPointer = 32,
    BitLength = 96,
    Mask = Convert.FromHexString("FFFFFFFFFFFFFFFFFFFFFFFF"),
    Data = Convert.FromHexString("E28011910000000000000001")
};

// 2. 向 User 存储区 Word 0 写入 2 个字
TagAccessResult writeResult = await reader.WriteTagMemoryAsync(new WriteTagRequest
{
    Selection = selection,
    MemoryBank = TagMemoryBank.User,
    WordPointer = 0,
    WriteData = [0x1234, 0x5678],
    AccessPassword = "00000000"
});

专家通道与厂商扩展

IRoSpecService / IReaderProtocolAccess Interfaces
命名空间: LlrpSdk

提供对底层 ROSpec 资源的直接控制与桥接运行,以及直发直收二进制 LLRP 帧的逃生通道。

厂商扩展与核心枚举 Extensions
// 启用 Impinj 扩展
var reader = LlrpReader.CreateBuilder("192.168.1.100").UseImpinj().Build();

// 核心枚举:
// ResourceTakeoverPolicy: PreserveForeign (默认) / ReplaceAll
// TagMemoryBank: Reserved(0), ElectronicProductCode(1), TID(2), User(3)
// TagLockMode: Accessible, AlwaysAccessible, SecuredWrite, AlwaysUnwriteable