W76R(4G UHF RFID电瓶车门禁控制器)API

概述

W76R 用于电瓶车停车场、车棚和出入口门禁。设备读取车辆标签的 EPC 与芯片 TID,在本地授权库内完成判断,授权通过后输出约 1 秒开门信号。

项目 说明
设备序列号 以 W76R 开头,以设备标签为准
接口域名 https://wdev.wmj.com.cn
请求格式 application/json
本地标签容量 每台最多 4096 张
通行判定 本地完成,正常通行不依赖当次云端往返
防复制校验 同时校验只读 TID 与 EPC
重复识别 同一 EPC 持续停留时,每 3 秒可重新触发

API 凭据请在微门禁开放平台申请。示例中的 {{wmjv2appid}}、{{wmjv2appsecret}} 和 {{device_sn}} 均为环境变量占位符,请勿把正式密钥写入客户端、日志或公开代码仓库。

接入流程

  1. 注册 W76R,将设备绑定到客户账号。
  2. 查询设备在线状态。
  3. 在天线读区内只放置一张待发标签,读取 EPC 和 TID。
  4. 可选:改写 EPC,再次读取并确认。
  5. 把 TID、EPC 和有效期写入需要放行的 W76R。
  6. 车辆进入读区后,设备本地判断权限并输出开门信号。

写标签和授权通行是两个独立操作。任意一台已注册、在线且 RFID 功能正常的 W76R 都可以作为写标签设备,请用 device_sn 指定实际执行设备。标签需要通过几台 W76R,就必须向这几台设备分别下发同一条 TID 与 EPC 授权记录。

设备命令公共规则

本文所有设备命令均复用硬件云 APIv2 通用接口:

  • 请求 URL:https://wdev.wmj.com.cn/deviceApi/send
  • 请求方式:POST
  • 请求格式:application/json
  • type 固定为 1
  • 命令名放在 data.cmd_type
  • 命令参数放在 data.info
{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "命令名称",
    "info": {}
  }
}

平台同步等待设备响应,默认最长约 15 秒。顶层 code 表示硬件云处理结果;data.info.code 表示设备执行结果。两层 code 都为 0 才表示命令真正成功。

1.注册设备

请求URL

https://wdev.wmj.com.cn/deviceApi/register

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}"
}
参数名 必填 类型 说明
app_id 是 string APIv2 应用 ID
app_secret 是 string APIv2 应用密钥
device_sn 是 string W76R 设备序列号

返回示例

{
  "code": 0,
  "msg": "注册成功"
}
2.查询设备在线状态

简要描述

查询设备是否连接硬件云。本接口只读取平台在线记录,不向设备发送命令。

请求URL

https://wdev.wmj.com.cn/deviceApi/getOnLine

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}"
}

返回示例

{
  "code": 0,
  "msg": "查询成功",
  "data": {
    "on_line": 1
  }
}
返回字段 类型 说明
code number 0 表示查询成功
data.on_line number 1 在线,0 离线
3.查询设备信息

简要描述

查询型号、软硬件版本、4G 信号和门禁输入输出状态。设备必须在线。

请求URL

https://wdev.wmj.com.cn/deviceApi/send

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "getdevinfo",
    "info": {}
  }
}

返回示例

{
  "code": 0,
  "data": {
    "device_sn": "{{device_sn}}",
    "cmd_type": "getdevinfo",
    "info": {
      "code": 0,
      "msg": "OK",
      "model": "W76R",
      "hw": "1.0.0",
      "sw": "0.1.11",
      "fwVer": "0.1.11",
      "rssi": -55,
      "csq": 24,
      "ber": 0,
      "doorstate": 0,
      "relayStatus": 0
    }
  }
}
返回字段 类型 说明
data.info.model string 产品型号
data / info / hw string 硬件版本
data.info.sw / fwVer string 固件版本
data.info.rssi number 4G 接收信号强度,单位 dBm
data.info.csq number 蜂窝网络信号质量
data.info.ber number 蜂窝网络误码率指标
data.info.doorstate number 门磁输入状态
data.info.relayStatus number 开门输出状态

响应可能同时包含设备和 SIM 网络标识字段。客户系统应按最小必要原则保存,不应公开这些标识。

4.读取现场标签

简要描述

获取设备最近一次成功读取的 EPC、芯片 TID 和本地授权数量。该接口不会自动注册标签,也不会主动开门。发卡时请确保天线有效读区内只有一张待发标签。

请求URL

https://wdev.wmj.com.cn/deviceApi/send

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "rfid_tag_get",
    "info": {}
  }
}

返回示例

{
  "code": 0,
  "data": {
    "device_sn": "{{device_sn}}",
    "cmd_type": "rfid_tag_get",
    "info": {
      "code": 0,
      "msg": "OK",
      "epc": "{{tag_epc}}",
      "tid": "{{tag_tid}}",
      "card_count": 1250,
      "registry_ready": 1,
      "registry_last_error": 0,
      "storage_free": 40960,
      "auto_authorize_feedback": 1,
      "tid_read_ok": 17,
      "tid_read_failed": 2,
      "tid_retry_recovered": 6,
      "tid_last_attempts": 1,
      "tid_last_status": 0,
      "tid_last_tag_error": 0
    }
  }
}
返回字段 类型 说明
data.info.epc string 标签 EPC,十六进制字符串
data.info.tid string 标签芯片只读 TID,十六进制字符串
data.info.card_count number 当前设备本地授权记录数量
data.info.registry_ready number 卡库可用状态,1 表示可正常读写
data.info.registry_last_error number 最近一次卡库错误码,0 表示正常
data.info.storage_free number 文件系统剩余字节数
data.info.auto_authorize_feedback number 未知标签自动登记提示模式,1 表示已开启
data.info.tid_read_ok number 本次启动后 TID 最终读取成功次数
data.info.tid_read_failed number 本次启动后重试结束仍失败的次数
data.info.tid_retry_recovered number 首次失败、后续重试成功的次数
data.info.tid_last_attempts number 最近一次 TID 读取使用的尝试次数
data.info.tid_last_status number 最近一次 TID 读取状态,0 表示成功
data.info.tid_last_tag_error number 最近一次 M100 标签错误码,0 表示无错误
  • 尚未成功读到标签时,epc 和 tid 为空字符串。
  • EPC、TID 不带 0x、空格或分隔符。
  • 返回的是最近一次成功读取结果,发卡软件应提示操作员核对当前标签。
  • 固件 0.1.16 起会在 M100 盘存功放切换稳定后读取 TID,并对瞬时未响应进行有界重试。固件 0.1.17 起,最终读取失败仅记录诊断,不再播放“标签读取失败”;排障时应结合 tid_read_ok、tid_read_failed、tid_retry_recovered 和最近状态字段判断。
5.改写标签 EPC(可选)

简要描述

按当前 EPC 选中读区内标签并改写 EPC 存储区。多数项目可直接使用标签出厂 EPC,无需改写。

改写 EPC 不会改变 TID,也不会自动授权。写入后必须回读确认,再用原 TID 与新 EPC 调用“新增或更新车辆标签”。

请求URL

https://wdev.wmj.com.cn/deviceApi/send

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "rfid_tag_epc_write",
    "info": {
      "current_epc": "{{current_tag_epc}}",
      "new_epc": "{{new_tag_epc}}",
      "access_password": 0
    }
  }
}
参数名 必填 类型 说明
data.info.current_epc 是 string 当前 EPC,2~16 字节
data.info.new_epc 是 string 新 EPC,必须与当前 EPC 等长
data.info.access_password 否 number 标签访问密码的十进制无符号 32 位数,默认 0

EPC 必须为偶数字节长度的十六进制字符串。写入时读区内只能有一张目标标签。本接口不开放标签锁定、销毁或修改 TID。

返回示例

{
  "code": 0,
  "data": {
    "device_sn": "{{device_sn}}",
    "cmd_type": "rfid_tag_epc_write",
    "info": {
      "code": 0,
      "msg": "OK"
    }
  }
}
6.新增或更新车辆标签

简要描述

以芯片 TID 为唯一键,在目标 W76R 本地新增或更新授权记录。相同请求可以安全重试。

请求URL

https://wdev.wmj.com.cn/deviceApi/send

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "rfid_card_upsert",
    "info": {
      "card_id": "EV-000001",
      "tid": "{{tag_tid}}",
      "epc": "{{tag_epc}}",
      "enabled": 1,
      "valid_from": 0,
      "valid_until": 0
    }
  }
}
参数名 必填 类型 说明
data.info.card_id 是 string 客户业务卡号,最长 19 个字符
data.info.tid 是 string 标签 TID,最长 16 字节
data.info.epc 是 string 标签当前 EPC,最长 16 字节
data.info.enabled 否 number / boolean 1 / true 启用,0 / false 停用;默认启用
data.info.valid_from 否 number 生效时间,Unix 秒;0 表示不限制
data.info.valid_until 否 number 失效时间,Unix 秒;0 表示不限制

valid_from 和 valid_until 同时非零时,开始时间不得晚于结束时间。同一 EPC 不能绑定到另一个 TID。

返回示例

{
  "code": 0,
  "data": {
    "device_sn": "{{device_sn}}",
    "cmd_type": "rfid_card_upsert",
    "info": {
      "code": 0,
      "msg": "OK"
    }
  }
}

多设备部署时,本地授权库不会自动互相复制。客户平台应保存“标签—设备”关系,并向所有允许通行的 W76R 分别下发授权。

7.分页查询车辆标签

简要描述

分页查询目标 W76R 的本地授权记录,用于发卡结果确认、设备迁移和数据核对。

请求URL

https://wdev.wmj.com.cn/deviceApi/send

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "rfid_card_list",
    "info": {
      "offset": 0,
      "limit": 5
    }
  }
}
参数名 必填 类型 说明
data.info.offset 否 number 起始位置,默认 0
data.info.limit 否 number 返回数量,默认 5,最大 5

返回示例

{
  "code": 0,
  "data": {
    "device_sn": "{{device_sn}}",
    "cmd_type": "rfid_card_list",
    "info": {
      "code": 0,
      "msg": "OK",
      "total": 1,
      "offset": 0,
      "limit": 5,
      "cards": [
        {
          "card_id": "EV-000001",
          "tid": "{{tag_tid}}",
          "epc": "{{tag_epc}}",
          "enabled": 1,
          "valid_from": 0,
          "valid_until": 0
        }
      ]
    }
  }
}
返回字段 类型 说明
data.info.total number 本地授权记录总数
data.info.offset number 本页起始位置
data.info.limit number 本页请求数量
data.info.cards array 授权记录数组

offset 或 limit 超出范围、不是整数时,设备返回 data.info.code=-1 和明确的参数错误说明,不会静默改用默认值。此行为要求固件 0.1.8 或更高版本。

8.启用或停用车辆标签

简要描述

按 TID 修改一条授权记录的启用状态,不删除车辆信息。

请求URL

https://wdev.wmj.com.cn/deviceApi/send

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "rfid_card_enable",
    "info": {
      "tid": "{{tag_tid}}",
      "enabled": 0
    }
  }
}
参数名 必填 类型 说明
data.info.tid 是 string 标签只读 TID
data.info.enabled 是 number 1 启用,0 停用

返回示例

{
  "code": 0,
  "data": {
    "device_sn": "{{device_sn}}",
    "cmd_type": "rfid_card_enable",
    "info": {
      "code": 0,
      "msg": "OK"
    }
  }
}
9.删除车辆标签

简要描述

按 TID 删除目标 W76R 中的一条本地授权记录。删除后该标签在该设备上立即失去通行权限。

请求URL

https://wdev.wmj.com.cn/deviceApi/send

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "rfid_card_delete",
    "info": {
      "tid": "{{tag_tid}}"
    }
  }
}

返回示例

{
  "code": 0,
  "data": {
    "device_sn": "{{device_sn}}",
    "cmd_type": "rfid_card_delete",
    "info": {
      "code": 0,
      "msg": "OK"
    }
  }
}
10.设备声音设置

固件 0.1.12 起,设备默认音量提高为 80%,并支持后台持久设置。音量配置保存在设备文件系统中,重启或断网后仍然生效。

设置音量时发送 setting,volume_percent 为 0~100 的整数:

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "setting",
    "info": {"volume_percent": 80}
  }
}

成功响应中的 data.info.volume 是设备实际应用的百分比音量。查询当前值时发送:

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {"cmd_type": "get_play_status", "info": {}}
}

旧字段 volume=1~10 保留十档兼容语义;新系统应使用 volume_percent,避免 1~10 数值产生歧义。播放命令携带的音量只修改当前运行音量,不写入持久配置;设备重启后恢复后台持久设置值。

固件 0.1.14 起,自动登记业务可同时设置未知标签的本地提示方式:

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}",
  "type": 1,
  "data": {
    "cmd_type": "setting",
    "info": {"auto_authorize_feedback": 1}
  }
}

auto_authorize_feedback=1 时,设备首次识别未知标签会播报“标签读取成功”,但仍不输出开门信号;业务平台收到 unknown_card 回调后建档并下发授权,标签再次进入识别区才按正常授权开门。设为 0 时恢复“未授权,禁止通行”。该设置持久保存,重启后继续生效。可用 rfid_tag_get 返回的 auto_authorize_feedback、registry_ready 和 registry_last_error 核对设置与本地卡库状态。

11.本地鉴权和开门逻辑

W76R 识别标签后依次检查:

  1. TID 是否存在于本地授权库;
  2. 当前 EPC 是否与该 TID 保存的 EPC 一致;
  3. 授权记录是否启用;
  4. 当前时间是否处于有效期;
  5. 授权库是否可以正常读取。

全部通过后,设备输出约 1 秒开门信号。未注册、已停用、未生效、已过期、TID/EPC 不一致或定时授权无法取得有效时间时,均不输出开门信号。

固件 0.1.10 起,语音在本地鉴权完成后播放,并与实际结果一致:

鉴权结果 本地语音
允许通行 验证成功,请通行
未登记卡 普通模式:未授权,禁止通行;自动登记提示模式:标签读取成功
卡片停用 卡片已停用,禁止通行
尚未生效 卡片尚未生效
已过期 卡片已过期
TID/EPC 防复制校验失败 卡片安全校验失败
设备时间不可用 设备时间未同步,禁止通行
TID 读取失败 标签读取失败,请重试

这些短语音随固件内置,启动时写入设备文件系统,断网时仍可播放,不需要现场实时合成。固件 0.1.9 起,每次完成本地鉴权后都会按下一节格式上报允许或拒绝结果。

12.通行记录回调

简要描述

W76R 完成本地 RFID 鉴权后,主动向硬件云发布 type=2、cmd_type=rfid_passage 消息。硬件云再以 HTTP POST 转发到开放平台应用配置的回调地址。

回调链路为:

W76R设备 → MQTT → 微门禁硬件云 → HTTP POST → 客户业务系统

设备不会直接请求客户业务系统。允许和拒绝事件都会回调;只有允许事件会输出开门信号。

回调方式

  • 请求方式:POST
  • 请求格式:application/json
  • 回调地址:开放平台应用中配置的 Callback URL
  • 版本要求:W76R 固件 0.1.9 或更高版本

回调示例

{
  "device_sn": "{{device_sn}}",
  "type": 2,
  "msg_id": 125,
  "cmd_type": "rfid_passage",
  "info": {
    "event_uid": "{{device_sn}}-1787220000-84215-125-A1B2C3D4",
    "event_time": 1787220000,
    "card_id": "EV-000001",
    "tag_tid": "{{tag_tid}}",
    "tag_epc": "{{tag_epc}}",
    "rssi": -48,
    "pass_result": 1,
    "auth_result": 0,
    "reason": "granted",
    "relay_output": 1
  }
}

字段说明

字段 类型 说明
device_sn string 产生事件的 W76R 序列号
type number 主动上报固定为 2
msg_id number 本次开机期间递增的事件序号
cmd_type string 固定为 rfid_passage
info.event_uid string 事件唯一标识,业务系统应据此幂等去重
info.event_time number 设备鉴权时间,Unix 秒;设备时间无效时可能为 0
info.card_id string 授权通过时返回业务卡号;未匹配或拒绝时可能为空
info.tag_tid string 标签芯片 TID,十六进制字符串
info.tag_epc string 标签当前 EPC,十六进制字符串
info.rssi number 标签被识别时的射频信号强度
info.pass_result number 1 放行,2 拒绝
info.auth_result number 设备本地鉴权结果码
info.reason string 便于日志展示的鉴权原因
info.relay_output number 1 已触发开门输出,0 未触发

鉴权结果

auth_result reason 说明
0 granted 授权通过
-1 unknown_card TID 未注册或授权库不可用
-2 disabled 授权已停用
-3 not_yet_valid 尚未到生效时间
-4 expired 授权已过期
-5 tid_epc_mismatch TID 与登记 EPC 不一致,疑似复制标签
-6 time_unavailable 定时授权无法取得有效设备时间

业务系统处理要求

  1. 收到事件后应尽快返回 HTTP 2xx,不要在回调请求中执行耗时任务。
  2. 使用 device_sn + event_uid 建立唯一约束;重复事件直接返回成功。
  3. 以 pass_result 判断是否放行,不要以语音提示、card_id 是否为空代替。
  4. event_time=0 时可使用业务系统接收时间,但应保留原始值用于排查。
  5. 本地鉴权和开门不依赖回调。设备离线时仍可本地通行,但当前版本不会持久化补传离线期间的通行事件。
13.安全和多设备部署
  • TID 通常由标签芯片提供且不可改写,EPC 可以改写。W76R 同时校验 TID 和 EPC,降低只复制 EPC 获得权限的风险。
  • EPC 改写后,仍保存旧 EPC 的设备会拒绝通行,必须重新下发授权。
  • RFID 管理命令应通过本文 HTTPS 接口发送,不支持客户直接向设备发送明文管理命令。
  • 发卡区应限制射频覆盖范围,并确保一次只有一张标签。
  • 客户平台应保存原始 TID、当前 EPC、业务卡号、授权设备和有效期,设备更换或恢复时据此重新下发。
  • 3000 张以上标签建议使用后台任务队列逐台、逐条下发,保存每条命令的双层返回,并在完成后分页核对总数与抽样数据。
14.错误处理和常见问题

平台层常见返回

code 说明 建议处理
0 平台处理成功 设备命令继续检查 data.info.code
1000 无权操作设备 先注册设备并核对账号归属
1001 参数错误、发布失败或等待超时 检查请求;超时前不要重复并发下发
1002 设备不在线 等待设备上线后重试
1003 设备尚未激活或不存在 确认设备已上电联网

设备命令失败时,以 data.info.code 和 data.info.msg 为准。管理命令返回 -403 表示未通过受保护通道,请使用本文的 /deviceApi/send,不要绕过硬件云协议。

写入 EPC 成功后为什么不能开门?

写入 EPC 不等于授权。请先回读确认,再把原 TID、新 EPC 写入每台需要放行的 W76R。

一台 W76R 写的标签能否在另一台使用?

可以。写标签设备不限制通行设备,但另一台设备必须保存相同 TID 与 EPC 的有效授权。

设备离线时车辆还能通行吗?

已保存且仍有效的授权可在本地判断。新增、修改、停用或删除授权需要设备重新在线后下发。

读标签接口为什么返回空字符串?

设备还没有成功读取标签,或标签不在有效读区。请调整距离和方向,并确保读区内只有目标标签。

15.解绑设备

简要描述

解除 W76R 与当前账号的绑定。解绑不会清空本地 RFID 授权库,不能用解绑代替删除标签。

请求URL

https://wdev.wmj.com.cn/deviceApi/logout

请求方式

POST

请求格式

json

参数

{
  "app_id": "{{wmjv2appid}}",
  "app_secret": "{{wmjv2appsecret}}",
  "device_sn": "{{device_sn}}"
}

返回示例

{
  "code": 0,
  "msg": "解绑成功"
}
更新日志
日期 内容
2026-09-02 固件 0.1.17 将标签瞬时离场导致的最终读取失败改为静默,仅保留诊断计数和错误码
2026-09-02 固件 0.1.16 优化 M100 盘存后 TID 读取时序和有界重试,并增加 TID 读取诊断字段
2026-09-02 固件 0.1.14 增加自动登记提示模式、卡库状态诊断与计数自愈,并保证 4096 条本地授权库具有可靠写入余量
2026-08-21 固件 0.1.12 提高默认音量并增加后台百分比音量查询、持久设置与重启恢复
2026-08-21 固件 0.1.11 增加 MQTT QoS 1 PUBACK 确认和有界重试,减少瞬时网络波动造成的通行事件丢失
2026-08-21 固件 0.1.10 起按放行和拒绝原因播放不同的离线缓存语音
2026-08-21 增加 type=2 的 rfid_passage 通行记录回调,说明硬件云转发链路、字段、鉴权结果和幂等要求
2026-08-20 首次公开 W76R 注册、在线查询、RFID 发卡、标签管理、本地鉴权和多设备部署接口;分页参数错误改为明确返回
作者:极客师傅  创建时间:2026-08-20 16:50
最后编辑:极客师傅  更新时间:2026-09-14 10:34