8.3 KiB
8.3 KiB
MT6 RFID 读卡器 USB HID 私有协议参考文档
1. 概述
本文档描述了一款 MT6 系列 RFID 读卡器(型号 MT6_RF915_RW_WY)通过 USB HID 接口与主机通信的私有协议。所有数据交互均使用 USB HID Feature Report(控制传输),Report 长度为 256 字节。
通信过程遵循固定的四包模型(SetReq / SetRes / GetReq / GetRes),其中 SetReq 和 GetRes 包含有效载荷,另外两个为固定应答包,底层驱动已自动处理。
2. 通用帧格式
2.1 SetReq(主机 → 设备,Report ID = 0x01)
主机发送的命令帧结构如下(从 Report ID 后开始计算偏移)。SetReq 必须填充至 256 字节,不足部分用 0x00 补齐。
| 偏移 | 长度 | 字段名 | 说明 |
|---|---|---|---|
| 0x00 | 1 | Report ID | 固定 0x01 |
| 0x01 | 4 | Fixed | 固定 0x00 0x00 0x00 0x00 |
| 0x05 | 2 | Frame Length | 从下一字段(0x07)到数据末尾(不含校验和结束符)的总字节数,小端序 |
| 0x07 | 2 | Constant | 固定 0x00 0x02 |
| 0x09 | 2 | Data Length | 后续数据负载的字节数,小端序 |
| 0x0B | N | Data | 实际数据负载(命令参数) |
| 0x0B+N | 1 | Checksum | 校验字节,计算方法见第 3 节 |
| 0x0C+N | 1 | End Marker | 固定 0x03 |
| 剩余 | - | Padding | 填充 0x00 至 256 字节 |
2.2 GetRes(设备 → 主机,Report ID = 0x03)
设备返回的数据帧结构与 SetReq 相同,但 GetRes 无需填充至 256 字节,其实际有效长度由 USB 传输层决定。
通用 Data 段格式:
| 偏移(相对 Data 段起点) | 长度 | 字段名 | 说明 |
|---|---|---|---|
| 0x00 | 1 | Status | 状态字节。0x00 表示成功,非零表示异常 |
| 0x01 | M | Response Data | 实际返回数据(长度由 Data Length - 1 决定) |
3. 校验算法
3.1 外层帧校验
计算范围:Data Length 字段的 2 个字节 + Data 字段的全部 N 个字节。
算法:逐字节异或(XOR)。
def calc_outer_checksum(data_len_bytes: bytes, payload: bytes) -> int:
result = 0
for b in data_len_bytes + payload:
result ^= b
return result
3.2 EPC 操作内部校验
3.2.1 Payload Checksum(累加和)
计算范围:从 Card Op Command 字段开始,到 Payload 末尾(不含校验字节自身)。
算法:所有字节累加(无符号 8 位溢出,即模 256)。
3.2.2 EPC CRC
算法:CRC-16/GENIBUS
参数:
- 多项式:
0x1021 - 初始值:
0xFFFF - 输出异或:
0xFFFF - 输入/输出是否反转:
false/false
计算范围:EPC Len Indicator(1 字节)+ EPC Status(1 字节)+ EPC Data(N 字节)
import crcmod
crc16_genibus = crcmod.mkCrcFun(0x11021, rev=False, initCrc=0xFFFF, xorOut=0xFFFF)
def calc_epc_crc(epc_len_indicator: int, epc_status: int, epc_data: bytes) -> int:
data = bytes([epc_len_indicator, epc_status]) + epc_data
return crc16_genibus(data)
4. 已知命令集
4.1 读版本号
- 功能:获取设备固件版本字符串。
- SetReq Data(1 字节):
c0 - SetReq 完整数据段(填充前):
01 00 00 00 00 06 00 00 02 01 00 c0 c1 03 - GetRes Data 段:
注意:版本字符串后的
00 # Status = 成功 4d 54 36 5f 52 46 39 31 35 5f 52 57 ... 20 # ASCII 版本字符串0x20为外层帧校验字节,0x03为帧结束标志。
4.2 蜂鸣器控制
打开蜂鸣器
- SetReq Data(2 字节):
cd 01 - SetReq 数据段:
01 00 00 00 00 07 00 00 02 02 00 cd 01 ce 03 - GetRes Data 段:
00 80
关闭蜂鸣器
- SetReq Data(2 字节):
cd 00 - SetReq 数据段:
01 00 00 00 00 07 00 00 02 02 00 cd 00 cf 03 - GetRes Data 段:
00 80
4.3 设置功率
- 功能:设置发射功率等级(取值范围 0~9)。
- 示例(功率 = 8)SetReq Data(2 字节):
cc 08 - SetReq 数据段:
01 00 00 00 00 07 00 00 02 02 00 cc 08 c6 03 - GetRes Data 段:
00 80
4.4 设置工作模式
- 功能:切换读卡器工作模式。
- SetReq Data(2 字节):
0f 0X,其中X为模式编号。0f 01:单标签巡查0f 02:被动模式0f 03:多标签巡查
- 示例(被动模式)SetReq 数据段:
01 00 00 00 00 07 00 00 02 02 00 0f 02 0f 03 - GetRes Data 段:
00 80
4.5 EPC 操作
所有 EPC 相关命令(读、选中、写)的 SetReq Data 段均遵循以下通用结构:
| 偏移 | 长度 | 字段名 | 说明 |
|---|---|---|---|
| 0x00 | 1 | Command | 固定 ce |
| 0x01 | 1 | Magic | 固定 bb |
| 0x02 | 2 | Card Op Command | 操作码,见各子命令 |
| 0x04 | 2 | Internal Length | 后续 Payload 的字节数(小端) |
| 0x06 | N | Payload | 具体操作参数 |
| 0x06+N | 1 | Payload Checksum | 从 Card Op Command 到 Payload 末尾的累加和(模 256) |
| 0x07+N | 1 | End Marker | 固定 7e |
4.5.1 读取 EPC
Card Op Command:00 22
SetReq
- Internal Length:
00 00 - Payload:(无)
- Payload Checksum:
22 - End Marker:
7e - 完整 Data 段:
ce bb 00 22 00 00 22 7e
GetRes
- Data 段结构(有卡):
| 偏移 | 长度 | 字段名 | 示例值 | 说明 |
|---|---|---|---|---|
| 0x00 | 1 | Status | 00 |
成功 |
| 0x01 | 1 | Magic | bb |
固定 |
| 0x02 | 2 | Card Op Resp | 02 22 |
读卡成功标志 |
| 0x04 | 2 | Internal Length | 00 0b |
后续数据长度 |
| 0x06 | 1 | RSSI | d3 |
信号强度 |
| 0x07 | 1 | EPC Len Indicator | 18 |
EPC 字节数 = 该值 ÷ 4 |
| 0x08 | 1 | EPC Status | 00 |
读取状态 |
| 0x09 | N | EPC Data | 11 22 33 44 55 66 |
实际 EPC |
| 0x09+N | 2 | EPC CRC | 75 ce |
CRC-16/GENIBUS |
| 0x0B+N | 1 | Payload Checksum | c2 |
累加和 |
| 0x0C+N | 1 | End Marker | 7e |
固定尾部 |
- 无卡时 Card Op Resp 为
01 ff,Payload 仅含 RSSI 及累加和。
4.5.2 选中卡
Card Op Command:00 0c
SetReq
- Internal Length:
00 09 - Payload(9 字节):
- 偏移 0x00~0x05:保留字段(
01 00 00 00 20 10) - 偏移 0x06~0x07:EPC Data(如
11 22)
- 偏移 0x00~0x05:保留字段(
- 完整 Data 段示例:
ce bb 00 0c 00 09 01 00 00 00 20 10 00 11 22 79 7e
GetRes
- Data 段:
00 bb 01 0c 00 01 00 0e 7e- Card Op Resp:
01 0c - Internal Length:
00 01 - Payload:
00(选中成功标志) - Payload Checksum:
0e
- Card Op Resp:
4.5.3 写入 EPC
Card Op Command:00 49
SetReq
- Internal Length:
00 0f - Payload(15 字节):
偏移 长度 字段名 示例值 说明 0x00 6 Reserved 00 00 00 00 01 00保留 0x06 1 Word Count 03= 2 + 新 EPC 字节数/2 0x07 2 Old EPC CRC ca 9e原卡 EPC 的 CRC-16/GENIBUS 0x09 1 EPC Len Indicator 08新 EPC 字节数 = 值 ÷ 4 0x0A 1 EPC Status 00固定 0x0B N New EPC Data 11 23新 EPC - Payload Checksum:
00 - End Marker:
7e - 完整 Data 段示例:
ce bb 00 49 00 0f 00 00 00 00 01 00 00 00 03 ca 9e 08 00 11 23 00 7e
GetRes
- Data 段:
00 bb 01 49 00 06 04 08 00 11 22 00 8f 7e- Card Op Resp:
01 49(写卡成功) - Internal Length:
00 06 - Payload:包含原 EPC
11 22等信息,用于确认
- Card Op Resp:
5. 附录:命令速查表
| 功能 | SetReq Data(十六进制) | 说明 |
|---|---|---|
| 读版本号 | c0 |
返回 ASCII 字符串 |
| 打开蜂鸣器 | cd 01 |
|
| 关闭蜂鸣器 | cd 00 |
|
| 设置功率 = 8 | cc 08 |
取值范围 0~9 |
| 设置单标签巡查 | 0f 01 |
|
| 设置被动模式 | 0f 02 |
|
| 设置多标签巡查 | 0f 03 |
|
| 读取 EPC | ce bb 00 22 00 00 22 7e |
返回 EPC 数据 |
| 选中卡(EPC=1122) | ce bb 00 0c 00 09 01 00 00 00 20 10 00 11 22 79 7e |
Payload Checksum 需根据实际计算 |
| 写 EPC(1122→1123) | ce bb 00 49 00 0f 00 00 00 00 01 00 00 00 03 ca 9e 08 00 11 23 00 7e |
注意 Word Count 和 Old EPC CRC |
文档版本:2.2
最后更新:2026-04-14
适用设备:MT6_RF915_RW_WY 及兼容固件