backup
This commit is contained in:
296
protocol.md
296
protocol.md
@@ -1,4 +1,4 @@
|
||||
# MT6 RFID 读卡器 USB HID 私有协议参考文档
|
||||
# MT6 RFID 读卡器 USB HID 私有协议参考文档(最终修正版)
|
||||
|
||||
## 1. 概述
|
||||
|
||||
@@ -12,50 +12,48 @@
|
||||
|
||||
主机发送的命令帧结构如下(从 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 字节** |
|
||||
| 偏移 | 长度 | 字段名 | 字节序 | 示例(打开蜂鸣器) | 说明 |
|
||||
|:---|:---|:---|:---|:---|:---|
|
||||
| 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 字节**,其实际有效长度由 USB 传输层决定。
|
||||
设备返回的数据帧结构与 SetReq 相同,但 **GetRes 无需填充至 256 字节**。
|
||||
|
||||
**通用 Data 段格式**:
|
||||
**Data 段格式**:
|
||||
|
||||
| 偏移(相对 Data 段起点) | 长度 | 字段名 | 说明 |
|
||||
| 偏移 | 长度 | 字段名 | 说明 |
|
||||
|:---|:---|:---|:---|
|
||||
| 0x00 | 1 | Status | 状态字节。`0x00` 表示成功,非零表示异常 |
|
||||
| 0x01 | M | Response Data | 实际返回数据(长度由 Data Length - 1 决定) |
|
||||
| 0x00 | 1 | Status | `0x00` 成功,非零异常 |
|
||||
| 0x01 | M | Response Data | 实际返回数据 |
|
||||
|
||||
|
||||
## 3. 校验算法
|
||||
|
||||
### 3.1 外层帧校验
|
||||
|
||||
**计算范围**:`Data Length` 字段的 2 个字节 + `Data` 字段的全部 N 个字节。
|
||||
**算法**:逐字节异或(XOR)。
|
||||
**算法**:逐字节异或(XOR)
|
||||
**计算范围**:`Data Length` 两字节+ `Data` 全部字节。
|
||||
|
||||
```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
|
||||
```
|
||||
**验证示例**(打开蜂鸣器):
|
||||
- Data Length: `00 02`
|
||||
- Data: `cd 01`
|
||||
- XOR: `00 ^ 02 ^ cd ^ 01 = ce` ✅
|
||||
|
||||
### 3.2 EPC 操作内部校验
|
||||
|
||||
#### 3.2.1 Payload Checksum(累加和)
|
||||
|
||||
**计算范围**:从 Card Op Command 字段开始,到 Payload 末尾(不含校验字节自身)。
|
||||
**算法**:所有字节累加(无符号 8 位溢出,即模 256)。
|
||||
**算法**:字节累加模 256
|
||||
**计算范围**:从 Card Op Command 字段开始,到 Payload 末尾(不含校验字节自身)。
|
||||
|
||||
#### 3.2.2 EPC CRC
|
||||
|
||||
@@ -64,191 +62,157 @@ def calc_outer_checksum(data_len_bytes: bytes, payload: bytes) -> int:
|
||||
- 多项式:`0x1021`
|
||||
- 初始值:`0xFFFF`
|
||||
- 输出异或:`0xFFFF`
|
||||
- 输入/输出是否反转:`false` / `false`
|
||||
- 输入/输出反转:`false`
|
||||
|
||||
**计算范围**:EPC Len Indicator(1 字节)+ EPC Status(1 字节)+ EPC Data(N 字节)
|
||||
|
||||
```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)
|
||||
```
|
||||
**计算范围**:`EPC Len Indicator`(1 字节)+ `EPC Status`(1 字节)+ `EPC Data`(N 字节)
|
||||
|
||||
## 4. 已知命令集
|
||||
|
||||
### 4.1 读版本号
|
||||
以下列出所有已分析命令,仅给出 **Data 段**内容(不含外层帧头),实际发送时需按第 2 节格式包装并填充至 256 字节。
|
||||
|
||||
- **功能**:获取设备固件版本字符串。
|
||||
- **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.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**(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 | GetRes Data |
|
||||
|:---|:---|:---|
|
||||
| 打开蜂鸣器 | `cd 01` | `00 80` |
|
||||
| 关闭蜂鸣器 | `cd 00` | `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 射频电源控制
|
||||
|
||||
### 4.3 设置功率
|
||||
| 功能 | SetReq Data | GetRes Data |
|
||||
|:---|:---|:---|
|
||||
| 打开射频 | `90 01` | `00 80` |
|
||||
| 关闭射频 | `90 00` | `00 80` |
|
||||
|
||||
- **功能**:设置发射功率等级(取值范围 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 工作模式与功率
|
||||
|
||||
### 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`
|
||||
| 功能 | SetReq Data | GetRes Data | 参数说明 |
|
||||
|:---|:---|:---|:---|
|
||||
| 设置单标签巡查 | `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 Data 段均遵循以下通用结构:
|
||||
所有 EPC 相关命令(读、选中、写)的 SetReq/GetRes 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` |
|
||||
| 偏移 | 长度 | 字段名 | 字节序 | 说明 |
|
||||
|:---|:---|:---|:---|:---|
|
||||
| 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
|
||||
- Internal Length:`00 00`
|
||||
- Payload:(无)
|
||||
- Payload Checksum:`22`
|
||||
- End Marker:`7e`
|
||||
- **完整 Data 段**:`ce bb 00 22 00 00 22 7e`
|
||||
- **SetReq Data**:`ce bb 00 22 00 00 22 7e`
|
||||
- Internal Length = `00 00`
|
||||
- Payload Checksum = `22`
|
||||
|
||||
##### GetRes
|
||||
- Data 段结构(有卡):
|
||||
- **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` | 固定尾部 |
|
||||
|
||||
| 偏移 | 长度 | 字段名 | 示例值 | 说明 |
|
||||
|:---|:---|:---|:---|:---|
|
||||
| 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 及累加和。
|
||||
- **无卡时**:Card Op Resp = `01 ff`,Payload 仅含 RSSI 及累加和,无 EPC 数据。
|
||||
|
||||
#### 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`)
|
||||
- **完整 Data 段示例**:`ce bb 00 0c 00 09 01 00 00 00 20 10 00 11 22 79 7e`
|
||||
- **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 段:
|
||||
- **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 = `01 0c`
|
||||
- Internal Length = `00 01`
|
||||
- Payload = `00`(选中成功标志)
|
||||
|
||||
#### 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 段示例**:
|
||||
- **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 段:
|
||||
- **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 = `01 49`
|
||||
- Payload 偏移0x03中开始原 EPC `11 22` 用于确认
|
||||
|
||||
## 5. 附录:命令速查表
|
||||
## 5. 附录:命令速查表(SetReq Data 部分)
|
||||
|
||||
| 功能 | 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 |
|
||||
| 功能 | 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 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.2
|
||||
**最后更新**:2026-04-14
|
||||
**文档版本**:2.3
|
||||
**最后更新**:2026-04-15
|
||||
**适用设备**:MT6_RF915_RW_WY 及兼容固件
|
||||
|
||||
Reference in New Issue
Block a user