si-m1-face-package/Documentation~/SI-M1人脸识别算法模组_文档功能总结.md

607 lines
19 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.

# SI-M1 人脸识别算法模组通信协议 V2.63:文档功能总结
> 来源文档:`SI-M1人脸识别算法模组通信协议V2.63.pdf`
> 整理目的:把通信协议、功能命令、返回消息、业务流程整理成可读的功能说明,便于后续 Unity 对接实现。
---
## 1. 文档定位
这份文档不是“人脸识别算法原理说明”,而是 **SI-M1 人脸识别算法模组的主控通信协议说明**
核心关系:
```text
Unity / PC 主控程序 <----串口通信链路----> SI-M1 人脸识别算法模组
```
模组处于 **从属设备** 地位:
- 主控负责发送命令;
- 模组负责执行人脸识别、录入、删除、查询、抓拍、二维码识别、特征读写等动作;
- 模组通过 `REPLY``NOTE``ImageOrTemplate` 三类消息主动/被动返回结果。
---
## 2. 通信消息格式
所有消息统一使用以下帧格式:
| 字段 | 长度 | 说明 |
|---|---:|---|
| SyncWord | 2 bytes | 固定同步头:`0xEF 0xAA` |
| MsgID | 1 byte | 消息 ID / 命令 ID / 返回类型 |
| Size | 2 bytes | Data 长度,高字节在前,单位 byte |
| Data | N bytes | 命令参数或返回数据N 可为 0 |
| ParityCheck | 1 byte | 校验码 |
### 2.1 校验规则
校验码计算方式:
```text
ParityCheck = MsgID ^ SizeHigh ^ SizeLow ^ Data[0] ^ Data[1] ^ ... ^ Data[N-1]
```
注意:
- 不包含 `SyncWord`
- `Size` 是大端模式,即高八位在前;
- Data 为空时,只对 `MsgID + SizeHigh + SizeLow` 做 XOR
- RESET 示例:`EF AA 10 00 00 10`
---
## 3. 主控发送给模组的命令功能
### 3.1 基础控制类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 复位 / 取消当前任务 | RESET | `0x10` | 无 | 取消录入、验证等正在执行的任务,使模组回到 Standby |
| 获取状态 | GET STATUS | `0x11` | 无 | 获取模组当前状态 |
| 清除录入状态 | FACE RESET | `0x23` | 无 | 终止录入流程并清除录入状态 |
| 获取版本 | GET VERSION | `0x30` | 无 | 获取软件版本信息 |
| 获取设备序列号 | MID_GET_SN | `0x93` | 无 | 获取设备唯一 SN返回 32 bytes前 8 bytes 有效 |
| Demo 模式 | DEMO MODE | `0xFE` | enable 1 byte | 进入演示模式,所有人可解锁,但仍做活体检测 |
---
### 3.2 人脸验证类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 人脸验证 | VERIFY | `0x12` | `pd_rightaway` + `timeout` + 可选 `Max_Recognition_times` | 启动一次人脸验证 |
| 低功耗自动探测验证 | AUTO_VERIFY | `0x12` | `at_verify` + `timeout` | AI-10 适用,检测到人脸或二维码后自动识别 |
#### VERIFY 参数
| 字段 | 长度 | 说明 |
|---|---:|---|
| pd_rightaway | 1 byte | 文档中作为保留字段,默认 0 |
| timeout | 1 byte | 解锁超时时间,单位秒,最大 255 |
| Max_Recognition_times | 1 byte可选 | 最大识别尝试次数,不发送时默认 30 |
特殊注意:
- 照片注册后,第一次识别成功会补全红外模板并保存到 Flash
- 主控在收到 REPLY 应答或超时后,应延时约 2 秒再断电。
---
### 3.3 人脸录入类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 交互录入 | ENROLL | `0x13` | admin + user_name + face_dir + timeout | 按指定方向录入人脸 |
| 单帧录入 | ENROLL_SINGLE | `0x1D` | admin + user_name + face_dir + timeout | 只需一张正脸即可注册 |
| 集成录入 | MID_ENROLL_ITG | `0x26` | admin + user_name + face_dir + enroll_type + enable_duplicate + timeout + reserved | ENROLL 的扩展版本,支持交互/单帧和重复录入策略 |
| 抓拍人脸后注册 | ENROLL_SNAPFACEIMAGE | `0x73` | admin + user_name + reserved + reserved | 配合 0x72 未搜索到本地用户时使用,不查重 |
#### ENROLL 参数
| 字段 | 长度 | 说明 |
|---|---:|---|
| admin | 1 byte | 是否管理员1 是0 否 |
| user_name | 32 bytes | 用户姓名 |
| face_dir | 1 byte | 录入方向 |
| timeout | 1 byte | 录入超时时间,单位秒 |
#### 人脸方向定义
| 方向 | Code | 说明 |
|---|---:|---|
| FACE_DIRECTION_UP | `0x10` | 朝上 |
| FACE_DIRECTION_DOWN | `0x08` | 朝下 |
| FACE_DIRECTION_LEFT | `0x04` | 朝左 |
| FACE_DIRECTION_RIGHT | `0x02` | 朝右 |
| FACE_DIRECTION_MIDDLE | `0x01` | 正脸 |
| FACE_DIRECTION_UNDEFINE | `0x00` | 未定义,默认正脸 |
#### 交互录入说明
录入过程中:
1. 主控发送指定方向录入命令;
2. 模组通过 NOTE 返回人脸状态、位置、姿态;
3. Unity 根据 NOTE 信息提示用户调整姿态;
4. 模组通过 REPLY 返回最终录入结果;
5. 录入中可通过 FACE RESET 终止;
6. 录入过程中突然断电,之前录入的人脸不会保存。
#### 录入角度说明
| 方向 | 推荐偏转角度 |
|---|---|
| 正脸 | 正对摄像头 |
| 向上 | 正脸向上偏转 5~55 度 |
| 向下 | 正脸向下偏转 5~55 度 |
| 向右 | 正脸向右偏转 8~60 度 |
| 向左 | 正脸向左偏转 8~60 度 |
不建议使用 Roll 倾斜头部方式录入,应缓慢转头并保持偏转。
---
### 3.4 用户管理类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 删除指定用户 | DELETE USER | `0x20` | user_id 高字节 + 低字节 | 删除一个已注册用户 |
| 删除全部用户 | DELETE ALL | `0x21` | 无 | 删除所有注册用户 |
| 查询用户信息 | GET USER INFO | `0x22` | user_id 高字节 + 低字节 | 返回用户 ID、姓名、管理员标志 |
| 获取所有用户 ID | MID_GET_ALL_USERID | `0x24` | alluserid_index | 每包最多 100 个用户 ID |
| 获取所有用户 ID 2 | MID_GET_ALL_USERID2 | `0x25` | alluserid_index | AI-10 适用user_counts 为 2 bytes |
---
### 3.5 加密通信类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 初始化加密 | INIT ENCRYPTION | `0x50` | seed[4] + mode | 主控发送随机数 |
| 设置 Release 加密序列 | MID_SET_RELEASE_ENC_KEY | `0x52` | enc_key_number[16] | 设置正式协议加密序列 |
| 设置 Debug 加密序列 | MID_SET_DEBUG_ENC_KEY | `0x53` | enc_key_number[16] | 设置调试协议加密序列 |
加密流程:
1. 主控给模组上电;
2. 模组发送明文 READY
3. 第一次使用需设置 16 bytes Release 加密序列;
4. 主控生成 4 bytes 随机数发送给模组;
5. 双方基于随机数和私有协议生成 16 bytes 会话密码;
6. 后续通信使用 AES/SMPL 加密;
7. 主控解密设备 ID 并确认设备身份;
8. 后续录入、验证等命令均按加密方式发送和接收。
> 实现注意:文档没有给出完整私有密钥派生算法和 AES/SMPL 细节Unity 侧如需启用加密通信,需要供应商提供 SDK、算法源码或加密协议补充文档。
---
### 3.6 USB / 图像参数类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 读取 USB UVC 参数 | READ_USB_UVC_PARAMETERS | `0xB0` | 无 | 读取传图参数 |
| 设置 USB UVC 参数 | SET_USB_UVC_PARAMETERS | `0xB1` | USB Type + UVC 码率 + MJPG 质量 + 图像属性 | 设置传图模式、码率、质量、镜像/倒转 |
| 设置人脸框显示 | SET_FACE_LOCATION_DISPLAY | `0xB5` | 0/1 | 设置是否显示人脸框 |
USB Type 示例:
| 值 | 含义 |
|---:|---|
| `0x11` | USB1.1 + Bulk |
| `0x20` | USB2.0 + Bulk |
| `0x91` | USB1.1 + ISOC |
| `0xA0` | USB2.0 + ISOC |
图像属性:
| Bit | 说明 |
|---|---|
| BIT0 | 1 启用镜像 |
| BIT1 | 1 启用 180 度倒转 |
---
### 3.7 二维码识别类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 扫描二维码 | MID_SCAN_QR_CODE | `0x70` | 0x00 + timeout | 读取二维码信息 |
| 自动探测二维码 | AUTO_VERIFY | `0x12` | at_verify + timeout | AI-10 低功耗自动探测模式下自动识别二维码 |
二维码 NOTE
- `NID_QR_DATA_FLAGS = 15` 表示 QR 数据;
- 可识别二维码不大于 250 bytes ASCII
- 不包含中文。
---
### 3.8 抓拍与图片上传类
| 功能 | 命令 | Code | 数据包规则 | 说明 |
|---|---|---:|---|---|
| 抓拍普通图片 | MID_SNAP&UPLOAD_IMAGE | `0x71` | 每包 1024 bytes最后一包按实际长度 | 240×320 图片 |
| 抓拍人脸图片 | MID_SNAP&UPLOAD_FACEIMAGE | `0x72` | 每包 1024 bytes最后一包按实际长度 | 320×320 人脸图,本地比对后上传 |
| 抓拍全视角大图 | MID_SNAP&UPLOAD_IMAGE_B | `0x74` | 每包 1024 bytes支持 DPI 参数 | 480×640 / 600×800 / 1200×1600 |
0x74 DPI 参数:
| DPI | 分辨率 |
|---:|---|
| 0 | 480×640 |
| 1 | 600×800 |
| 2 | 1200×1600仅 AI-10 有效 |
---
### 3.9 照片 / 特征下发注册类
| 功能 | 命令 | Code | 说明 |
|---|---|---:|---|
| 照片/特征注册,指定 ID | MID_ENROLL_WITH_PHOTO&ID | `0xD7` | 文档建议优先使用 0xF7 |
| 照片/特征注册 | MID_ENROLL_WITH_PHOTO | `0xF7` | 推荐使用 |
| 设置彩色识别阈值 | RGB_LEVEL | `0xD4` | 彩色识别阈值 0~4默认 2 |
#### MID_ENROLL_WITH_PHOTO 0xF7 流程
1. 第一包:`Seq = 0`
2. Data 包含:
- `00`
- `00`
- 照片/特征长度4 bytes大端
- BioType
- 可选姓名长度;
- 可选姓名字符串;
- 可选重复检查标志;
3. 模组返回 Result 和 Seq
4. Result 成功后,主控从 `Seq = 1` 开始发送数据;
5. 每包数据最大 MTU ≤ 246 bytes
6. 最后一包不足 246 bytes 时按实际长度发送;
7. 发送完成后,模组返回最终注册结果和 UserID。
#### BioType 定义
| 值 | 说明 |
|---:|---|
| 0 | 普通照片 |
| 1 | 加密照片 |
| 2 | 普通特征码2048 bytes 彩色,或 4096 bytes 彩色+红外 |
| 3 | 压缩特征码1024 bytes |
特征文件长度:
| 类型 | 文件总长度 | 内容 |
|---|---:|---|
| 彩色+红外特征 | 4100 bytes | 4096 bytes 特征码 + 4 bytes CRC32 |
| 彩色特征 | 2052 bytes | 2048 bytes 特征码 + 4 bytes CRC32 |
| 压缩特征 | 1028 bytes | 1024 bytes 特征码 + 4 bytes CRC32 |
CRC32 初始向量值:`0xFFFFFFFF`
---
### 3.10 特征读写类AI-10
| 功能 | 命令 | Code | 说明 |
|---|---|---:|---|
| 读取特征 | MID_READ_FEATURE | `0xFA` | 按用户 ID 和特征类型读取模板 |
| 写入特征 | MID_WRITE_FEATURE | `0xFB` | 分包写入模板数据 |
Feature Type
| 值 | 说明 |
|---:|---|
| 1 | 彩色人脸模板 |
| 2 | 彩色 + 红外人脸模板 |
| 3 | 掌纹掌静脉模板 |
分包规则:
- 每包 246 bytes
- 从包序号 1 开始递增;
- 最后一包按实际剩余长度;
- 读取特征时先返回特征长度,再按包上传;
- 写入特征时先发送特征类型,再分包写入。
---
### 3.11 查重配置类
| 功能 | 命令 | Code | Data | 说明 |
|---|---|---:|---|---|
| 设置查重 | MID_DUPLICATE_CHECK | `0xFC` | Checkflag | 设置本地注册是否查重 |
| 查询查重状态 | MID_READ_DUPLICATE_CHECK | `0xFC` | 无 | 不带参数时查询当前查重状态 |
Checkflag
| 值 | 文档说明 |
|---:|---|
| 0 | 查重 |
| 1 | 不查重 |
说明:
- 默认查重;
- 设置后立即生效并保存到 Flash
- 重启后仍有效;
- SI-M1 V2.10 以上支持。
---
### 3.12 固件升级类
| 功能 | 命令 | Code | 说明 |
|---|---|---:|---|
| U 盘升级固件 | MID_UPGRADE_FW | `0xF6` | 启动通过 U 盘升级模组固件 |
返回数据中包含升级进度百分比。
---
## 4. 模组返回给主控的消息
模组主要返回三类消息:
| 类型 | MsgID | 说明 |
|---|---:|---|
| REPLY | `0x00` | 命令最终执行结果 |
| NOTE | `0x01` | 模组主动通知,例如 READY、人脸状态、二维码数据 |
| ImageOrTemplate | 业务 mid | 图片或特征模板数据流 |
---
## 5. REPLY 消息
### 5.1 REPLY 格式
```text
SyncWord MsgID=0x00 Size Data Checksum
Data = mid + result + data[n]
```
| 字段 | 说明 |
|---|---|
| mid | 被回复的命令 ID |
| result | 命令执行结果 |
| data | 不同命令对应的返回数据 |
### 5.2 常见 REPLY 返回数据
| mid | Code | 成功时返回 |
|---|---:|---|
| MID_GETSTATUS | `0x11` | status |
| MID_VERIFY | `0x12` | user_id + user_name + admin + unlockStatus |
| MID_ENROLL | `0x13` | user_id + face_direction |
| MID_ENROLL_SINGLE | `0x1D` | user_id + face_direction |
| MID_GETUSERINFO | `0x22` | user_id + user_name + admin |
| MID_GET_ALL_USERID | `0x24` | user_counts + users_id[] |
| MID_GET_VERSION | `0x30` | version data |
| MID_INIT_ENCRYPTION | `0x50` | device_id[20] |
| MID_GET_SN | `0x93` | Device_SN[32],前 8 bytes 有效 |
| MID_SCAN_QR_CODE | `0x70` | QR CODE |
| MID_SNAP_UPLOAD_IMAGE | `0x71` | result + photo_len 或图片数据 |
| MID_SNAP_UPLOAD_FACEIMAGE | `0x72` | result + photo_len + user_id 或图片数据 |
| MID_ENROLL_WITH_PHOTO | `0xF7` | seq + user_id |
| MID_READ_FEATURE | `0xFA` | result + seq + feature_len 或特征数据 |
| MID_WRITE_FEATURE | `0xFB` | result + seq + user_id |
| MID_READ_DUPLICATE_CHECK | `0xFC` | state + duplicate |
---
## 6. Result 结果码
| Code | 名称 | 说明 |
|---:|---|---|
| 0 | MR_SUCCESS | 成功 |
| 1 | MR_REJECTED | 模组拒绝命令 |
| 2 | MR_ABORTED | 录入/验证算法终止 |
| 4 | MR_FAILED4_CAMERA | 相机打开失败 |
| 5 | MR_FAILED4_UNKNOWNREASON | 未知错误 |
| 6 | MR_FAILED4_INVALIDPARAM | 参数无效 |
| 7 | MR_FAILED4_NOMEMORY | 内存不足 |
| 8 | MR_FAILED4_UNKNOWNUSER | 没有已录入用户 |
| 9 | MR_FAILED4_MAXUSER | 超过最大用户数量 |
| 10 | MR_FAILED4_FACEENROLLED | 人脸已录入 |
| 12 | MR_FAILED4_LIVENESSCHECK | 活体检测失败 |
| 13 | MR_FAILED4_TIMEOUT | 录入或解锁超时 |
| 14 | MR_FAILED4_AUTHORIZATION | 加密芯片授权失败 |
| 19 | MR_FAILED4_READ_FILE | 读文件失败 |
| 20 | MR_FAILED4_WRITE_FILE | 写文件失败 |
| 21 | MR_FAILED4_NO_ENCRYPT | 通信协议未加密 |
| 23 | MR_FAILED4_NO_RGBIMAGE | RGB 图像没有 ready |
| 24 | MR_FAILED4_JPGPHOTO_LARGE | JPG 照片过大 |
| 25 | MR_FAILED4_JPGPHOTO_SMALL | JPG 照片过小 |
| 26 | MR_FAILED4_DETECT_QR | 识别过程中扫描并解码了二维码 |
---
## 7. NOTE 消息
### 7.1 NOTE 格式
```text
SyncWord MsgID=0x01 Size Data Checksum
Data = nid + data[n]
```
### 7.2 NID 定义
| NID | Code | 说明 |
|---|---:|---|
| NID_READY | 0 | 模组已准备好 |
| NID_FACE_STATE | 1 | 返回人脸状态、位置、姿态 |
| NID_UNKNOWNERROR | 2 | 未知错误 |
| NID_OTA_DONE | 3 | OTA 完成 |
| NID_EYE_STATE | 4 | 眼睛状态 |
| NID_AUTO_VERIFY | 10 | 自动检测状态 |
| NID_QR_DATA_FLAGS | 15 | 二维码数据 |
---
## 8. NID_FACE_STATE 人脸状态数据
数据结构:
| 字段 | 类型 | 长度 | 说明 |
|---|---|---:|---|
| state | int16 | 2 bytes | 人脸状态 |
| left | int16 | 2 bytes | 人脸框左侧距离 |
| top | int16 | 2 bytes | 人脸框上方距离 |
| right | int16 | 2 bytes | 人脸框右侧距离 |
| bottom | int16 | 2 bytes | 人脸框下方距离 |
| yaw | int16 | 2 bytes | 左右转头角度,负为左转,正为右转 |
| pitch | int16 | 2 bytes | 上下抬头/低头,负为抬头,正为低头 |
| roll | int16 | 2 bytes | 歪头角度,负为右歪,正为左歪 |
### 8.1 Face State Code
| Code | 名称 | 说明 |
|---:|---|---|
| 0 | FACE_STATE_NORMAL | 人脸正常 |
| 1 | FACE_STATE_NOFACE | 未检测到人脸 |
| 2 | FACE_STATE_TOOUP | 太靠近上边沿 |
| 3 | FACE_STATE_TOODOWN | 太靠近下边沿 |
| 4 | FACE_STATE_TOOLEFT | 太靠近左边沿 |
| 5 | FACE_STATE_TOORIGHT | 太靠近右边沿 |
| 6 | FACE_STATE_FAR | 距离太远 |
| 7 | FACE_STATE_CLOSE | 距离太近 |
| 8 | FACE_STATE_EYEBROW_OCCLUSION | 眉毛遮挡 |
| 9 | FACE_STATE_EYE_OCCLUSION | 眼睛遮挡 |
| 10 | FACE_STATE_FACE_OCCLUSION | 脸部遮挡 |
| 11 | FACE_STATE_DIRECTION_ERROR | 录入方向错误 |
| 12 | FACE_STATE_EYE_CLOSE_STATUS_OPEN_EYE | 闭眼模式检测到睁眼 |
| 13 | FACE_STATE_EYE_CLOSE_STATUS | 闭眼状态 |
| 14 | FACE_STATE_EYE_CLOSE_UNKNOWN_STATUS | 无法判定睁闭眼 |
| 128 | PV_STATE_NORMAL | 检测到手掌信息 |
---
## 9. 核心业务流程
### 9.1 主控接收消息流程
```text
串口接收字节流
查找同步头 EF AA
读取 MsgID
读取 Size 高低字节
读取 Data
读取 Checksum 并校验
根据 MsgID 分发:
- 0x00REPLY
- 0x01NOTE
- 其他ImageOrTemplate
```
### 9.2 一般命令处理流程
```text
主控发送命令
模组执行命令
期间可能持续返回 NOTE
最终返回 REPLY
主控根据 result 判断成功/失败
```
如果超时或无结果:
- 主控可发送 GET STATUS 查询状态;
- 如果模组仍 BUSY可等待、取消或 RESET
- 如果出现 ERROR/INVALID应提示异常或重新上电。
### 9.3 上下电流程
```text
主控给模组上电
模组初始化
模组发送 NOTE:READY
主控开始发送业务命令
模组处理并返回结果
主控确认无消息或超时后可断电
```
### 9.4 录入流程
```text
发送 ENROLL / ENROLL_ITG
模组返回 NOTE:FACE_STATE
Unity 提示用户调整距离、方向、姿态
模组返回 REPLY:ENROLL
成功:记录 user_id 和 face_direction
失败:显示 result 对应原因
```
### 9.5 验证流程
```text
发送 VERIFY
模组返回 NOTE:FACE_STATE
Unity 实时显示检测状态
模组返回 REPLY:VERIFY
成功:得到 user_id / user_name / admin
失败:显示错误原因
```
### 9.6 照片下发注册流程
```text
发送 0xF7 第一包Seq=0 + PhotoLen + BioType + 可选扩展参数
模组 ACK
主控 Seq 从 1 开始分包发送照片/特征数据
每包 MTU ≤ 246 bytes
模组逐包 ACK
最后返回 UserID
```
---
## 10. 文档中的关键实现风险
| 风险 | 说明 | 建议 |
|---|---|---|
| 加密协议不完整 | 文档未给出私有密钥派生算法和 AES/SMPL 细节 | 向供应商索取 SDK 或补充协议 |
| 0x12 同时用于 VERIFY 和 AUTO_VERIFY | 同一 MsgID 下 Data 结构不同 | Unity API 层必须区分调用场景 |
| 0x71 / 0x72 / 0x74 返回数据有两阶段 | 第一阶段返回长度,第二阶段返回图片包 | 需要做图片接收状态机 |
| 0xF7 照片注册需要分包 | 每包 ≤246 bytes需等待 ACK 后继续 | 必须实现可靠分包发送队列 |
| 图片包为二进制流 | Unity 需要缓存 byte[] 并转换 Texture2D | 注意主线程 UI 更新 |
| 中文姓名编码未明确 | 文档仅说明 user_name 32 bytes / NameString 长度 | 建议先按 ASCII/UTF-8 测试,最终以供应商确认为准 |
| UVC 视频预览与串口协议是两条链路 | 文档里有 USB UVC 参数,但协议数据只负责控制 | Unity 视频画面需要单独使用 UVC/USB 摄像头方案 |
---
## 11. 一句话总结
这份文档定义了 **主控与 SI-M1 人脸识别模组之间的二进制通信协议**主控通过固定帧格式发送录入、验证、删除、查询、抓拍、二维码、照片注册、特征读写、加密、UVC 参数、升级等命令;模组通过 REPLY 返回最终结果,通过 NOTE 主动上报状态,通过 ImageOrTemplate 分包上传图片或特征模板。