# 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 | - | `01` | 固定 `0x01` | | 0x01 | 4 | Fixed | - | `00 00 00 00` | 固定 | | 0x05 | 2 | Frame Length | **大端** | `00 07` | 从Constant到Data的总字节数 | | 0x07 | 2 | Constant | - | `00 02` | 固定 `0x00 0x02` | | 0x09 | 2 | Data Length | **大端** | `00 02` | 后续数据负载的字节数 | | 0x0B | N | Data | - | `cd 01` | 实际数据负载 | | 0x0B+N | 1 | Checksum | - | `ce` | 校验字节,算法见第 3 节 | | 0x0C+N | 1 | End Marker | - | `03` | 固定 `0x03` | | 剩余 | - | Padding | - | `00 ...` | 填充至 **256 字节** | ### 2.2 GetRes(设备 → 主机,Report ID = 0x03) 设备返回的数据帧结构与 SetReq 相同,但 **GetRes 无需填充至 256 字节**。 **Data 段格式**: | 偏移 | 长度 | 字段名 | 说明 | | :--- | :--- | :------------ | :-------------------- | | 0x00 | 1 | Status | `0x00` 成功,非零异常 | | 0x01 | M | Response Data | 实际返回数据 | ## 3. 校验算法 ### 3.1 外层帧校验 **算法**:逐字节异或(XOR) **计算范围**:`Data Length` 两字节+ `Data` 全部字节。 **验证示例**(打开蜂鸣器): - Data Length: `00 02` - Data: `cd 01` - XOR: `00 ^ 02 ^ cd ^ 01 = ce` ✅ ### 3.2 EPC 操作内部校验 #### 3.2.1 Payload Checksum(累加和) **算法**:字节累加模 256 **计算范围**:从 Card Op Command 字段开始,到 Payload 末尾(不含校验字节自身)。 #### 3.2.2 EPC CRC **算法**:CRC-16/GENIBUS **参数**: - 多项式:`0x1021` - 初始值:`0xFFFF` - 输出异或:`0xFFFF` - 输入/输出反转:`false` **计算范围**:`EPC Len Indicator`(1 字节)+ `EPC Status`(1 字节)+ `EPC Data`(N 字节) ## 4. 已知命令集 以下列出所有已分析命令,仅给出 **Data 段**内容(不含外层帧头),实际发送时需按第 2 节格式包装并填充至 256 字节。 ### 4.1 系统与配置类命令 | 功能 | SetReq Data | GetRes Data | 备注 | | :----------- | :--------------------------- | :----------------------------------- | :--------------- | | 读版本号 | `c0` | `00` + ASCII 字符串 | | | 恢复出厂设置 | `cf` | `00 80` | | | 读取格式 | `83` | `00 01 00 00 00 01 01 00 00`(示例) | 返回当前格式参数 | | 设置格式 | `82 0f 00 00 00 01 01 01 00` | `00 80` | 参数含义略 | ### 4.2 蜂鸣器控制 | 功能 | SetReq Data | GetRes Data | | :--------- | :---------- | :---------- | | 打开蜂鸣器 | `cd 01` | `00 80` | | 关闭蜂鸣器 | `cd 00` | `00 80` | ### 4.3 射频电源控制 | 功能 | SetReq Data | GetRes Data | | :------- | :---------- | :---------- | | 打开射频 | `90 01` | `00 80` | | 关闭射频 | `90 00` | `00 80` | ### 4.4 工作模式与功率 | 功能 | SetReq Data | GetRes Data | 参数说明 | | :------------- | :---------- | :---------- | :----------- | | 主动读卡 | `0f 01` | `00 80` | 触发单次寻卡 | | 被动读卡 | `0f 02` | `00 80` | 持续等待标签 | | 设置单标签巡查 | `0f 01` | `00 80` | 模式 1 | | 设置被动模式 | `0f 02` | `00 80` | 模式 2 | | 设置多标签巡查 | `0f 03` | `00 80` | 模式 3 | | 设置功率 = N | `cc N` | `00 80` | N 范围 0~9 | ### 4.5 EPC 操作 所有 EPC 相关命令(读、选中、写)的 SetReq/GetRes Data 段均遵循以下内部结构: | 偏移 | 长度 | 字段名 | 字节序 | 说明 | | :----- | :--- | :--------------- | :------- | :---------------------------------- | | 0x00 | 1 | Command/Status | - | 固定 SetReq=`ce`,GetRes=`00`(成功) | | 0x01 | 1 | Magic | - | 固定 `bb` | | 0x02 | 2 | Card Op Command | - | 操作码(见各子命令) | | 0x04 | 2 | Internal Length | **大端** | 后续 Payload 的字节数 | | 0x06 | N | Payload | - | 具体操作参数 | | 0x06+N | 1 | Payload Checksum | - | 累加和(模 256) | | 0x07+N | 1 | End Marker | - | 固定 `7e` | #### 4.5.1 读取 EPC **Card Op Command**:`00 22` - **SetReq Data**:`ce bb 00 22 00 00 22 7e` - Internal Length = `00 00` - Payload Checksum = `22` - **GetRes Data 段(有卡)**: ``` 00 bb 02 22 00 0b d3 18 00 11 22 33 44 55 66 75 ce c2 7e ``` | 偏移 | 字段 | 值示例 | 说明 | | :--- | :---------------- | :------------------ | :------------------- | | 0x00 | Status | `00` | 成功 | | 0x01 | Magic | `bb` | 固定 | | 0x02 | Card Op Resp | `02 22` | 读卡成功标志 | | 0x04 | Internal Length | `00 0b` | 后续数据长度(大端) | | 0x06 | RSSI | `d3` | 信号强度 | | 0x07 | EPC Len Indicator | `18` | EPC 字节数 = 值 ÷ 4 | | 0x08 | EPC Status | `00` | 成功 | | 0x09 | EPC Data | `11 22 33 44 55 66` | 实际 EPC | | 0x0F | EPC CRC | `75 ce` | CRC-16/GENIBUS | | 0x11 | Payload Checksum | `c2` | 累加和 | | 0x12 | End Marker | `7e` | 固定尾部 | - **无卡时**:Card Op Resp = `01 ff`,Payload 仅含 RSSI 及累加和,无 EPC 数据。 #### 4.5.2 选中卡 **Card Op Command**:`00 0c` - **SetReq Data 示例**(选中 EPC `11 22`): ``` ce bb 00 0c 00 09 01 00 00 00 20 10 00 11 22 79 7e ``` - Internal Length = `00 09` - Payload(7+N 字节):7字节保留字段 + EPC Data - Payload Checksum = `79` - **GetRes Data 段**: ``` 00 bb 01 0c 00 01 00 0e 7e ``` - Card Op Resp = `01 0c` - Internal Length = `00 01` - Payload = `00`(选中成功标志) #### 4.5.3 写入 EPC **Card Op Command**:`00 49` - **SetReq Data 示例**(将 EPC `11 22` 改为 `11 23`): ``` ce bb 00 49 00 0f 00 00 00 00 01 00 00 00 03 ca 9e 08 00 11 23 00 7e ``` - Internal Length = `00 0f` - Payload(15 字节): | 偏移 | 字段 | 值示例 | 说明 | |:---|:---|:---|:---| | 0x00 | Reserved | `00 00 00 00 01 00 00 00` | 保留 | | 0x09 | Word Count | `03` | = 2 + 新 EPC 字节数/2 | | 0x0A | Old EPC CRC | `ca 9e` | 原卡 EPC 的 CRC-16/GENIBUS(大端) | | 0x0C | EPC Len Indicator | `08` | 新 EPC 字节数 = 值 ÷ 4 | | 0x0D | EPC Status | `00` | 固定 | | 0x0E | New EPC Data | `11 23` | 新 EPC | - Payload Checksum = `00` - **GetRes Data 段**: ``` 00 bb 01 49 00 06 04 08 00 11 22 00 8f 7e ``` - Card Op Resp = `01 49` - Payload 偏移0x03中开始原 EPC `11 22` 用于确认不重复 ## 5. 附录:命令速查表(SetReq Data 部分) | 功能 | Data(十六进制) | | :------------------ | :--------------------------------------------------------------------- | | 读版本号 | `c0` | | 恢复出厂设置 | `cf` | | 读取格式 | `83` | | 设置格式 | `82 0f 00 00 00 01 01 01 00` | | 打开蜂鸣器 | `cd 01` | | 关闭蜂鸣器 | `cd 00` | | 打开射频 | `90 01` | | 关闭射频 | `90 00` | | 主动读卡 | `0f 01` | | 被动读卡 | `0f 02` | | 设置单标签巡查 | `0f 01` | | 设置被动模式 | `0f 02` | | 设置多标签巡查 | `0f 03` | | 设置功率 = 8 | `cc 08` | | 读取 EPC | `ce bb 00 22 00 00 22 7e` | | 选中卡(EPC=1122) | `ce bb 00 0c 00 09 01 00 00 00 20 10 00 11 22 79 7e` | | 写 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` | --- **文档版本**:2.3 **最后更新**:2026-04-15 **适用设备**:MT6_RF915_RW_WY 及兼容固件