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

255 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```python
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 字节)
```python
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
- **示例(功率 = 8SetReq 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`
- Payload9 字节):
- 偏移 0x00~0x05保留字段`01 00 00 00 20 10`
- 偏移 0x06~0x07EPC Data如 `11 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 Resp`01 0c`
- Internal Length`00 01`
- Payload`00`(选中成功标志)
- Payload Checksum`0e`
#### 4.5.3 写入 EPC
**Card Op Command**`00 49`
##### SetReq
- Internal Length`00 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 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` 等信息,用于确认
## 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 及兼容固件