Files
app_rf915_dump/protocol.md
2026-04-15 07:53:51 +08:00

8.3 KiB
Raw Blame History

MT6 RFID 读卡器 USB HID 私有协议参考文档

1. 概述

本文档描述了一款 MT6 系列 RFID 读卡器(型号 MT6_RF915_RW_WY)通过 USB HID 接口与主机通信的私有协议。所有数据交互均使用 USB HID Feature Report控制传输Report 长度为 256 字节

通信过程遵循固定的四包模型SetReq / SetRes / GetReq / GetRes其中 SetReqGetRes 包含有效载荷,另外两个为固定应答包,底层驱动已自动处理。

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 填充 0x00256 字节

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 Indicator1 字节)+ EPC Status1 字节)+ EPC DataN 字节)

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 Data1 字节):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 Data2 字节):cd 01
  • SetReq 数据段
    01 00 00 00 00 07 00 00 02 02 00 cd 01 ce 03
    
  • GetRes Data 段00 80

关闭蜂鸣器

  • SetReq Data2 字节):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
  • 示例(功率 = 8SetReq Data2 字节):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 Data2 字节):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 Command00 22

SetReq
  • Internal Length00 00
  • Payload
  • Payload Checksum22
  • End Marker7e
  • 完整 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 ffPayload 仅含 RSSI 及累加和。

4.5.2 选中卡

Card Op Command00 0c

SetReq
  • Internal Length00 09
  • Payload9 字节):
    • 偏移 0x00~0x05保留字段01 00 00 00 20 10
    • 偏移 0x06~0x07EPC Data11 22
  • 完整 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 Resp01 0c
    • Internal Length00 01
    • Payload00(选中成功标志)
    • Payload Checksum0e

4.5.3 写入 EPC

Card Op Command00 49

SetReq
  • Internal Length00 0f
  • Payload15 字节):
    偏移 长度 字段名 示例值 说明
    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 Checksum00
  • End Marker7e
  • 完整 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 Resp01 49(写卡成功)
    • Internal Length00 06
    • Payload包含原 EPC 11 22 等信息,用于确认

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 需根据实际计算
写 EPC1122→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 及兼容固件