{
  "added_at": "2026-11-03",
  "additional_evidence_urls": [
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/docs/REVERSE.md",
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/docs/PROTOCOL.md",
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/docs/ANDROID.md",
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/rfid_tool.py",
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/ch340_usb.py",
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/test_offline.py",
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/android/build.sh",
    "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/LICENSE"
  ],
  "category": "reconstruction-cases",
  "description_en": "Reconstructs the A0 serial protocol of R2000-family 915 MHz UHF RFID desktop readers, which ship with only Windows software and an Android app, from the vendor app's native command encoder rather than its misleading Java SDK. A userspace CH340 driver, a Python CLI and GUI, and a small Android app then talk to the reader directly for inventory and tag-memory reads. docs/PROTOCOL.md records the frame layout, checksum, command table, response formats and the different field orders of READ and WRITE.",
  "description_zh": "从厂商安卓应用的原生指令编码器（而非其具有误导性的 Java SDK）重建 R2000 系列 915 MHz UHF RFID 桌面读写头的 A0 串口协议；这类读写头原本只随附 Windows 软件和安卓应用。项目据此提供用户态 CH340 驱动、Python 命令行与图形界面，以及小型安卓应用，直接与读写头通信，进行标签盘存并读取标签存储区。docs/PROTOCOL.md 记录了帧格式、校验和、指令表、响应格式，以及 READ 与 WRITE 不同的字段顺序。",
  "entry_url": "https://awesomerea.org/resources/a0rfid-uhf-reader-protocol-case/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/a0rfid-uhf-reader-protocol-case/",
  "evidence_url": "https://github.com/uaih3k9x/a0rfid/blob/944ec1581a5c989cc7fbd50fcdba27159ecf7aa1/README.md",
  "group": "cases",
  "id": "a0rfid-uhf-reader-protocol-case",
  "json_url": "https://awesomerea.org/resources/a0rfid-uhf-reader-protocol-case/record.json",
  "kind": "case-study",
  "markdown_url": "https://awesomerea.org/resources/a0rfid-uhf-reader-protocol-case/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/a0rfid-uhf-reader-protocol-case/index.md",
  "name": "a0rfid: an open driver for A0-protocol UHF RFID readers",
  "name_zh": "a0rfid：A0 协议 UHF RFID 读写头的开源驱动",
  "record_type": "resource",
  "relationship": "independent-reconstruction",
  "requirements": [
    "The reviewed main commit of 2026-09-17 is the second of two commits, with no tags or releases. docs/REVERSE.md describes decompiling the vendor APK, finding that the app bypasses its Java codec and calls libnative-lib.so through JNI, reading per-command field layouts from that library's rfid_encode() jump table, and then confirming the frames on hardware. The result is a protocol description and new host software; no reader firmware or vendor app is recovered, and the reader model is not named beyond the R2000 family.",
    "Using the tools requires a compatible A0-protocol reader on its CH340 USB-UART at 115200 8N1, plus tags to test with. Repeating the analysis requires the vendor's own software package and manual, which are not included: REVERSE.md states that the repository contains no vendor code, only frames observed on the wire and code written from them. android/RFID助手.apk is the project's own prebuilt app, built from android/app by android/build.sh.",
    "The Python tools need Python 3 with pyusb and pyserial. --port USB uses the bundled ch340_usb.py userspace driver, which on macOS needs Homebrew libusb; Linux can instead use the stock ch341 kernel driver through /dev/ttyUSB0. The Android app needs Android 7.0+ with USB host; android/build.sh assumes macOS/Homebrew paths, JDK 17, Android SDK platform 34 and build-tools 34.0.0.",
    "test_offline.py runs 17 hardware-free checks of checksums, frame construction and response parsing, several against frames the author recorded from a reader reporting firmware V2.4.1, and docs/ANDROID.md reports 261 offline Android checks against simulated tags. The author reports confirming the read and write paths on one reader and installing and reading with the app on one DJI Smart Controller Enterprise (Android 7.1.2); the app's multi-bank write features were checked only in simulation. The docs also note occasional firmware hangs and a 20 dBm maximum power on the author's unit.",
    "MIT License (2026, a0rfid contributors); the vendor software, SDK and reader firmware keep their own terms. Write, lock and kill commands change real tags."
  ],
  "requirements_zh": [
    "所审阅的 main 分支提交日期为 2026-09-17，是仓库两个提交中的第二个，没有标签或发布版本。docs/REVERSE.md 说明了分析过程：反编译厂商 APK，发现应用绕过其 Java 编解码器，经 JNI 调用 libnative-lib.so；再从该库 rfid_encode() 的跳转表读出各指令的字段布局，最后在硬件上确认这些帧。成果是一份协议说明和新的主机端软件；项目没有恢复读写头固件或厂商应用，除 R2000 系列外也未写明读写头型号。",
    "使用这些工具需要一台兼容 A0 协议、经 CH340 USB 转串口以 115200 8N1 连接的读写头，以及用于测试的标签。重做分析需要厂商自己的软件包和手册，仓库未附带：REVERSE.md 声明仓库不含任何厂商代码，只有在线路上观察到的帧以及据此编写的代码。android/RFID助手.apk 是项目自己的预构建应用，由 android/build.sh 从 android/app 构建。",
    "Python 工具需要 Python 3 及 pyusb、pyserial。--port USB 使用随附的 ch340_usb.py 用户态驱动，在 macOS 上需要 Homebrew 的 libusb；Linux 也可改用系统自带的 ch341 内核驱动，通过 /dev/ttyUSB0 连接。安卓应用需要 Android 7.0+ 且支持 USB Host；android/build.sh 假定 macOS／Homebrew 路径、JDK 17、Android SDK platform 34 和 build-tools 34.0.0。",
    "test_offline.py 在无硬件条件下运行 17 项检查，覆盖校验和、帧构造和响应解析，其中几项使用作者从一台报告固件 V2.4.1 的读写头录得的帧；docs/ANDROID.md 报告另有 261 项基于模拟标签的安卓离线检查。作者报告已在一台读写头上确认读写路径，并在一台 DJI Smart Controller Enterprise（Android 7.1.2）上完成应用安装和读取；应用的多存储区写入功能仅经过模拟测试。文档还提到作者的设备偶尔会固件卡死，最大输出功率为 20 dBm。",
    "采用 MIT 许可证（2026 年，a0rfid contributors）；厂商软件、SDK 和读写头固件适用其各自条款。写入、锁定和灭活指令会改变真实标签。"
  ],
  "targets": [
    "protocol"
  ],
  "url": "https://github.com/uaih3k9x/a0rfid",
  "verification": "source-reviewed",
  "verified_at": "2026-10-27"
}
