更新记录

1.1.2(2026-08-20)

首次提交


平台兼容性

uni-app(4.72)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android Android插件版本 iOS 鸿蒙
- × - - - - 9.0 1.1.2 - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

官方 UHF Reader 插件

一个用于 uni-app 的 UTS 插件,提供超高频 RFID(UHF)读写器功能。支持连接各种品牌的 PDA 设备和第三方 UHF Reader,实现标签盘点、数据读写、参数设置等完整的 RFID 操作能力。

特性

  • 支持多种 PDA 平台:兼容驿格科技、班克曼、森得瑞、东大集成等主流品牌
  • 完整的 RFID 功能:标签盘点、读取、写入、锁定和灭活
  • 灵活的盘点模式:普通、快速、智能和自定义模式
  • 丰富的参数配置:射频功率、频率区域、防冲突算法等可调节参数
  • 高级功能支持:固件升级、高级命令执行、传感器读取
  • 双模扫描支持:RFID 盘点与条码扫码并行工作
  • 实时回调机制:标签数据、错误诊断、硬件按键事件监听

适用场景

  • 仓库物流管理:货物标签批量盘点
  • 零售门店管理:商品防盗标签查询
  • 生产制造:原材料和产品追踪
  • 医疗护理:药品和器械识别
  • 图书管理:书籍借阅和盘点

硬件设备

支持的设备型号

本插件兼容以下 UHF RFID 设备:

主流 PDA 设备:

  • 驿格科技:R20(型号:k62v1_6c)超高频数据采集终端
  • 班克曼:K62V1_6C 等型号
  • 森得瑞:ST907、ST908、ST308W、T8939 等系列
  • 东大集成:IDATA 系列 PDA
  • 其他品牌:包括海康威视、斑比特、汉德合力等

Reader 规格参数

通信接口:

  • 串口类型:UART TTL/RS232
  • 波特率:默认 115200(支持 9600~921600 可配置)
  • 串口地址:/dev/ttyS1(根据平台不同可能有所变化)

射频性能:

  • 频段范围:902MHz ~ 928MHz(中国)、865MHz ~ 868MHz(欧洲)、902MHz ~ 928MHz(美国)
  • 读取功率:最大可达 33dBm(10000)
  • 写功率:最大可达 30dBm(10000)
  • 灵敏度:≤ -86dBm

支持的协议标准:

  • ISO/IEC 18000-63 (EPC Global Gen2)
  • ISO/IEC 18000-6B

天线配置:

  • 单口或多口可选
  • 典型配置:1~4 个天线端口
  • 每端口最大输出功率可调

设备信息读取: 连接成功后可通过回调获取以下设备信息:

  • 硬件版本:Reader 硬件版本号
  • 固件版本:当前运行的固件版本号
  • 序列号(SN):设备的唯一标识符
  • 可用天线数量:已连接的天线端口数

安装使用

1. 引入插件

在项目中通过 HBuilderX 插件市场导入插件,或在 manifest.json 中添加依赖:

{
  "uni-modules": {
    "hl-uhf-reader": {}
  }
}

2. 权限配置

确保在 manifest.json 中配置以下 Android 权限:

{
  "android": {
    "permissions": [
      "<uses-permission android:name=\"android.permission.CP213xx_ACCESS\"/>",
      "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
      "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
      "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
      "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>"
    ]
  }
}

3. 基础用法示例

初始化插件

首先需要初始化和释放插件资源:

import * as UhfReader from '@/uni_modules/hl-uhf-reader'

// 初始化
UhfReader.init((result) => {
  if (result.code === 0) {
    console.log('插件初始化成功')
  } else {
    console.error('初始化失败:', result.message)
  }
})

连接 Reader

连接到 RFID 读写设备:

UhfReader.connect({
  platform: 'NONE',              // PDA 平台类型
  address: '/dev/ttyS1',         // 串口地址
  baudRate: 115200,              // 波特率
  antennaCount: 1                // 天线口数量
}, (result) => {
  if (result.code === 0 && result.connected) {
    console.log('连接成功')
    console.log('硬件版本:', result.hardwareVersion)
    console.log('固件版本:', result.softwareVersion)
    console.log('序列号:', result.readerSerialNumber)
  }
})

标签盘点(Inventory)

开始或停止标签盘点:

启动盘点:

UhfReader.startInventory({
  protocols: ['GEN2'],           // 协议类型:GEN2 或 ISO18000_6B
  mode: 'normal',                // 盘点模式:normal/fast/smart/custom
  antennas: [1],                 // 使用的天线列表
  readTimeMs: 1000,              // 每次读取时长(毫秒)
  readIntervalMs: 200,           // 读取间隔(毫秒)
  playSound: true                // 是否播放提示音
}, (result) => {
  if (result.code === 0) {
    console.log('盘点已启动')
  }
})

停止盘点:

UhfReader.stopInventory((result) => {
  console.log(result.code === 0 ? '盘点已停止' : '停止失败')
})

监听标签数据

注册标签回调,实时获取盘点到的标签:

// 注册标签监听
UhfReader.onTag((event) => {
  console.log('发现新标签')
  console.log('EPC:', event.epc)          // 标签唯一标识
  console.log('TID:', event.tid)          // 标签不可变 ID
  console.log('天线 ID:', event.antennaId)
  console.log('信号强度:', event.rssi, 'dBm')
  console.log('频率:', event.frequency, 'MHz')
})

// 取消标签监听
UhfReader.offTag()

读取单个标签

读取指定内存区域的数据:

UhfReader.readTag({
  antennaId: 1,                  // 天线 ID
  bank: 1,                       // 存储区:1=EPC, 2=Reserved, 3=User
  startAddress: 2,               // 起始字地址
  wordCount: 6,                  // 读取字数
  accessPassword: '00000000'     // 访问密码
}, (result) => {
  if (result.code === 0) {
    console.log('读取成功:', result.data)
  }
})

写入单个标签

向标签写入数据:

UhfReader.writeTag({
  antennaId: 1,
  bank: 3,                       // User 存储区
  startAddress: 0,
  data: 'DEADBEEF',              // 十六进制数据
  accessPassword: '00000000'
}, (result) => {
  console.log(result.code === 0 ? '写入成功' : '写入失败')
})

设置 Reader 参数

修改 RF 射频参数:

// 先读取当前参数
UhfReader.getReaderSettings((settingsResult) => {
  const settings = {
    readPowers: [3000, 3000],     // 读功率:每个天线的 dBm*100
    writePowers: [3000, 3000],    // 写功率
    region: 1,                     // 区域代码:1=US, 2=CN, 6=EU
    frequencies: [920000, 960000], // 频点范围(kHz)
    session: 1,                    // Session:1/2/3/4
    qValue: 8,                     // 防冲突 Q 值
    tari: 16                       // Tari 时间基准
  }

  // 写入参数
  UhfReader.setReaderSettings(settings, (result) => {
    console.log(result.code === 0 ? '参数设置成功' : '设置失败')
  })
})

固件升级

通过串口更新 Reader 固件:

// 注意:需要先将固件文件放置到应用可访问目录
const firmwareOptions = {
  filePath: '/sdcard/download/firmware.bin',
  address: '/dev/ttyS1',
  platform: 'NONE'
}

let progressCallback = (event) => {
  console.log(`升级进度:${event.progress}%`)
  console.log(`阶段:${event.phase}, 消息:${event.message}`)
}

// 监听升级进度
UhfReader.onFirmwareProgress(progressCallback)

// 开始升级
UhfReader.startFirmwareUpgrade(firmwareOptions, (result) => {
  console.log(result.code === 0 ? '升级完成' : '升级失败')
  UhfReader.offFirmwareProgress()
})

手柄扫码功能

启用扫描引擎进行条码采集:

// 打开扫码服务
UhfReader.scannerOpen((result) => {
  if (result.code === 0) {
    // 开启扫码监听
    UhfReader.onScanResult((event) => {
      if (event.success) {
        console.log('条码内容:', event.text)
        console.log('条码类型:', event.dataType)
      } else {
        console.log('扫码失败:', event.failDetail)
      }
    })

    // 启动扫码引擎
    UhfReader.scannerStart((result) => {
      console.log(result.code === 0 ? '扫码引擎启动成功' : '启动失败')
    })
  }
})

// 关闭时清理
UhfReader.scannerStop(() => {})
UhfReader.offScanResult()
UhfReader.scannerClose(() => {})

硬件按键监听

接收硬件扳机按键事件:

// 监听扳机按键
UhfReader.onTrigger((event) => {
  console.log(event.action === 'down' ? '扳机按下' : '扳机松开')
})

// 监听硬件切换键
UhfReader.onHardwareKey((event) => {
  console.log('目标:', event.target)          // rfid/scanner
  console.log('按键码:', event.keyCode)
  console.log('模式变更:', event.modeChanged)
})

// 使用完后取消监听
UhfReader.offTrigger()
UhfReader.offHardwareKey()

API 参考

核心函数

函数名 说明
init(callback) 初始化插件
release(callback) 释放插件资源
connect(options, callback) 连接 Reader 设备
disconnect(callback) 断开连接并下电
startInventory(options, callback) 启动标签盘点
inventoryOnce(options, callback) 一次性盘点
stopInventory(callback) 停止盘点
readTag(options, callback) 读取标签数据
writeTag(options, callback) 写入标签数据
lockTag(options, callback) 锁定标签
killTag(options, callback) 灭活标签
getReaderSettings(callback) 获取 Reader 参数
setReaderSettings(settings, callback) 设置 Reader 参数
runAdvancedOperation(operation, callback) 执行高级操作
startFirmwareUpgrade(options, callback) 固件升级

事件监听

函数名 说明
onTag(callback) / offTag() 标签回调
onTrigger(callback) / offTrigger() 扳机按键回调
onHardwareKey(callback) / offHardwareKey() 硬件切换键回调
onScanResult(callback) / offScanResult() 扫码结果回调
onDiagnostic(callback) / offDiagnostic() Reader 诊断回调
onScannerDiagnostic(callback) / offScannerDiagnostic() 扫码引擎诊断回调
onFirmwareProgress(callback) / offFirmwareProgress() 固件升级进度回调

扫码控制

函数名 说明
scannerOpen(callback) 打开扫码服务
scannerClose(callback) 关闭扫码服务
scannerStart(callback) 启动扫码引擎
scannerStop(callback) 停止扫码引擎
setScannerSettings(settings, callback) 设置扫码参数
setScannerParameter(param, value, callback) 设置扫码参数

支持的 PDA 平台

插件支持以下 PDA 平台型号(使用前需选择对应的 platform):

NONE, CHAINWAY, COMMANDLIST, SCAN_ALPS_ANDROID_CUIUS2, ALPS_KT45, HD508, IDATA, JIEBAO, EKEMP, SENTER_ST308W, SENTER_ST907, HANDEHUOER_12, KK, CZ880, XIANSHI, XBANG, SENTER907, ALPS_KT45Q, Urovo_31, Urovo_31Q, K06SS_A, HANDEHUOER_13, SENTER907_PDA_T8939, ST908, ST907Ver2, IDATA_95w4g, MT6737, PAX, ST917, ST917_V2, ZoomSmart, SD60RT, C72, SD55, vq513, iDat50, PAX2, C7000, ALi, HDBX6, JAHT, SD50, ST55, HANDEHUOER_13_C0

盘点模式

  • normal:标准盘点模式
  • fast:快速盘点模式
  • smart:智能盘点模式,需配置 IT Mode
  • custom:自定义周期模式,可设置 readTimeMs 和 readIntervalMs
  • temperature:温度标签盘点

Reader 参数说明

参数名 说明 单位/范围
readPowers 读取功率 dBm*100
writePowers 写入功率 dBm*100
region 区域代码 1=US, 2=CN, 6=EU
frequencies 频点列表 kHz
session 会话模式 1~4
qValue Q 值 0~15
target 目标值 0~3
tari 时间基准 数值
encoding 编码方式 数值
writeMode 写模式 数值
hopTimeMs 跳频间隔 毫秒
lbtEnabled LBT 使能 true/false

常见问题

Q1: 连接失败怎么办?

检查以下几点:

  • 确认串口地址和波特率正确
  • 确认 Reader 已通电
  • 检查 platform 是否选择正确
  • 查看日志中的错误详情

Q2: 无法读取到标签?

可能的原因:

  • 检查天线是否正确连接
  • 调整天线数量设置为真实使用的端口数
  • 调整读写功率参数
  • 确认标签符合 Gen2 或 ISO18000-6B 标准
  • 靠近标签测试,排除距离问题

Q3: 盘点速度很慢?

优化建议:

  • 使用 fast 模式提高盘点速度
  • 适当减小 Q 值和 Target 值
  • 缩短 readTimeMs 和 readIntervalMs
  • 减少天线数量或使用单个天线
  • 添加过滤器限制匹配范围

Q4: 如何判断操作成功或失败?

所有异步操作的回调都会返回一个包含 code 字段的对象:

  • code === 0:操作成功
  • code !== 0:操作失败,message 字段包含错误描述

开发调试

日志查看

插件会在运行时记录操作日志,方便排查问题:

function log(message, payload) {
  console.log(`${new Date().toLocaleTimeString()} ${message}`, 
    payload ? JSON.stringify(payload) : '')
}

错误处理

建议在调用每个接口时都做好错误处理:

myFunction(options, result => {
  if (result.code === 0) {
    // 成功逻辑
  } else {
    // 失败逻辑
    console.error('错误代码:', result.code)
    console.error('错误信息:', result.message)
    console.error('详细信息:', result.detail)
  }
})

技术支持

如需技术支持或反馈问题,请参考示例项目 pages/uhf-reader-demo 获取完整的代码实现和使用演示。

许可证

本插件遵循相应的开源许可协议。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

需要串口、设备供电和固件文件访问相关的 Android 权限。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件仅在调用接口时读取 UHF Reader、标签和设备平台信息。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。