frebergguru/uhf_reader

GitHub: frebergguru/uhf_reader

独立实现的 C 语言工具包,通过逆向得到的 R2000 0xA0 协议驱动 UHF RFID 阅读器进行 EPC Gen2 标签读写与盘点。

Stars: 0 | Forks: 0

# uhf_reader [![构建](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/e04356ed12145810.svg)](https://github.com/frebergguru/uhf_reader/actions/workflows/ci.yml) 一个用于 **PiSwords UHF reader/writer** 的 C 语言工具包,其 RF module 报告为 **UCM601**(EPC C1G2 reader/writer/copier)。它通过 `1a86:fe0c` QinHeng USB-serial bridge(`/dev/ttyACM*`)连接,并使用 **Impinj R2000 "0xA0" protocol**(通过逆向厂商的 Java 应用获得——参见 [`docs/PROTOCOL.md`](docs/PROTOCOL.md))。 ``` libuhf.a serial layer + R2000 0xA0 frame protocol ├─ uhf_probe confirm the reader + find its baud/address ├─ uhf_scan continuous real-time inventory scanner └─ uhf_console interactive REPL (info / power / scan / read / write / raw) ``` ## 构建 ``` make # -> uhf_probe, uhf_scan, uhf_console, libuhf.a ``` 仅需要 C11 + POSIX,无外部依赖。 ## 设备权限 `/dev/ttyACM*` 属于 `root:uucp`(模式 0660),而你的用户不在 `uucp` 组中。选择以下一种方式: ``` sg uucp -c './uhf_probe' # one-off, current command only sudo usermod -aG uucp $USER # permanent (re-login afterwards) # 或者通过 udev 规则授予您的登录会话访问权限: echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="fe0c", TAG+="uaccess"' \ | sudo tee /etc/udev/rules.d/60-uhf-reader.rules sudo udevadm control --reload && sudo udevadm trigger ``` 节点编号在重新插拔后可能会改变;稳定的路径是 `/dev/serial/by-id/usb-wch.cn_USB_Serial-if00`。使用 `-d` 传入任意设备。 ## 用法 默认值:设备 `/dev/ttyACM0`,波特率 **9600**,地址 **0x00**(此设备的 设置——与厂商 GUI 使用 reader 类型 "UCM601" 时的设置相同)。 ``` ./uhf_probe # confirm a reply, report baud/address ./uhf_probe -l 9600 # long passive capture at one baud ./uhf_scan -d /dev/ttyACM0 -b 9600 -a 00 ./uhf_console -d /dev/ttyACM0 ``` ### uhf_console 一个交互式 REPL,暴露了**完整的 R2000 命令集**——输入 `help` 获取 完整列表。亮点: ``` System info temp reset save factory checkant setaddr baud RF/power power temppower power4 power8 antenna region rflink cw txtime session beep Inventory one scan binv inventory stop custom sessioninv multag buffer bufferreset buffercount clearbuffer Tag (G2) dump read write lock kill match getmatch select getselect GPIO gpio setgpio keepalive Raw cmd [data] raw ``` 大多数命令是 get-or-set(获取或设置):不带参数时为查询,带参数时为 设置(例如 `power` 打印当前 dBm,`power 20` 进行设置;`beep off`, `region 2 0 6` 用于 ETSI,或 `region custom 500 4 915000` 用于自定义 频段)。`addr ` 选择命令针对的 reader 地址。 查看 tag 的三种方式:`one` 读取单个 tag 的 EPC(有界的单 tag 读取——对于单个 tag 最为可靠);`scan [secs]` 运行实时的 inventory 并列出唯一的 EPC;`binv [secs]` 使用 reader 的缓冲 inventory (在 reader 中去重,报告每个 tag 的读取次数)。示例: ``` uhf> info -> reader: UCM601 v2.3 uhf> one -> read OK pc=3000 EPC E2 00 00 ... 90 25 uhf> binv 2 buffered inventory: 1 unique tag, reads=90, freq=865300 uhf> dump read all four banks (EPC / TID / User / Reserved) uhf> read 1 2 6 read 6 words from EPC bank @ word 2 uhf> write 1 2 write EPC (clone target); see below uhf> beep off silence buzzer, then `save` to persist uhf> raw A0 03 00 72 EB send exact bytes verbatim ``` ### 克隆 tag 1. 放置**源** tag,输入 `scan`,复制其 EPC。 2. 放置一个**可写**的 tag,输入 `write 1 2 <那个EPC>`(EPC bank,字地址 2 — 字 0 是 CRC,字 1 是 PC)。 有关帧格式和注意事项,请参见 [`docs/PROTOCOL.md`](docs/PROTOCOL.md) (写入是破坏性的;锁定的 tag 会拒绝写入)。 ## 状态 已在 9600 波特率/地址 0 下针对实机(UCM601 v2.3)进行了端到端验证: - **通信 / 配置:** `info`、`power`、`antenna`、`temp`、`region` 等全部 支持往返通信(`GetFirmwareVersion` 发送 `A0 03 00 72 EB` → 接收 `A0 06 00 72 02 03 01 E2`)。 - **Inventory:** `one`、`scan`(实时、去重)和 `binv`(缓冲)均 能返回 tag 并随后使 reader 保持安静状态——没有失控,没有卡死。 - **读取:** `dump` / `read` 读取每个 bank。示例卡片 —— EPC `E2000020091401632380​9025`,TID `E2003412013101000E5439AF`,user mem 为空, reserved bank 需要 access password。 - **写入 / 克隆:** `write`/`lock`/`kill` 帧构建正确,但 **尚未在 tag 上验证**(需要可写目标——参见 [`docs/TODO.md`](docs/TODO.md))。 ## 文件 ``` include/serial.h src/serial.c POSIX termios serial layer include/uhf.h src/uhf.c R2000 0xA0 build / parse / decode src/probe.c uhf_probe src/scan.c uhf_scan src/console.c uhf_console docs/PROTOCOL.md protocol reference (from the vendor app) docs/TODO.md open items (clone/write, password recovery) Makefile ``` ## 免责声明 这是一个独立、干净的 reader 串行协议重新实现,旨在实现与作者拥有的硬件的**互操作性**。该 协议是通过观察和反编译厂商自己的 应用程序恢复的;本代码库**不包含任何厂商代码、二进制文件或固件**—— 仅包含原创的 C 语言实现。 "PiSwords"、"UCM601"、"Impinj"、"R2000"、"QinHeng" 以及其他名称均为 其各自所有者的商标,此处仅出于指代目的用于描述 硬件兼容性。不暗示任何关联或背书。 仅对你拥有或被授权访问的 RFID tag 和 reader 使用本工具, 并遵守所在司法管辖区的法律。按“原样”提供, 不提供任何形式的保证。 ## 许可证 [MIT](LICENSE) © 2026 Hypnotize —— 参见 [`LICENSE`](LICENSE)。
标签:Bing搜索, RFID, 串口通信, 云资产清单, 客户端加密, 物联网, 硬件工具, 网络安全监控, 逆向工程, 驱动开发