SI-M1 人脸识别算法模组通信协议 V2.63:文档功能总结
来源文档:SI-M1人脸识别算法模组通信协议V2.63.pdf
整理目的:把通信协议、功能命令、返回消息、业务流程整理成可读的功能说明,便于后续 Unity 对接实现。
1. 文档定位
这份文档不是“人脸识别算法原理说明”,而是 SI-M1 人脸识别算法模组的主控通信协议说明。
核心关系:
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 校验规则
校验码计算方式:
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 |
未定义,默认正脸 |
交互录入说明
录入过程中:
- 主控发送指定方向录入命令;
- 模组通过 NOTE 返回人脸状态、位置、姿态;
- Unity 根据 NOTE 信息提示用户调整姿态;
- 模组通过 REPLY 返回最终录入结果;
- 录入中可通过 FACE RESET 终止;
- 录入过程中突然断电,之前录入的人脸不会保存。
录入角度说明
| 方向 |
推荐偏转角度 |
| 正脸 |
正对摄像头 |
| 向上 |
正脸向上偏转 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] |
设置调试协议加密序列 |
加密流程:
- 主控给模组上电;
- 模组发送明文 READY;
- 第一次使用需设置 16 bytes Release 加密序列;
- 主控生成 4 bytes 随机数发送给模组;
- 双方基于随机数和私有协议生成 16 bytes 会话密码;
- 后续通信使用 AES/SMPL 加密;
- 主控解密设备 ID 并确认设备身份;
- 后续录入、验证等命令均按加密方式发送和接收。
实现注意:文档没有给出完整私有密钥派生算法和 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 流程
- 第一包:
Seq = 0;
- Data 包含:
00
00
- 照片/特征长度,4 bytes,大端;
- BioType;
- 可选姓名长度;
- 可选姓名字符串;
- 可选重复检查标志;
- 模组返回 Result 和 Seq;
- Result 成功后,主控从
Seq = 1 开始发送数据;
- 每包数据最大 MTU ≤ 246 bytes;
- 最后一包不足 246 bytes 时按实际长度发送;
- 发送完成后,模组返回最终注册结果和 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:
说明:
- 默认查重;
- 设置后立即生效并保存到 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 格式
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 格式
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 主控接收消息流程
串口接收字节流
↓
查找同步头 EF AA
↓
读取 MsgID
↓
读取 Size 高低字节
↓
读取 Data
↓
读取 Checksum 并校验
↓
根据 MsgID 分发:
- 0x00:REPLY
- 0x01:NOTE
- 其他:ImageOrTemplate
9.2 一般命令处理流程
主控发送命令
↓
模组执行命令
↓
期间可能持续返回 NOTE
↓
最终返回 REPLY
↓
主控根据 result 判断成功/失败
如果超时或无结果:
- 主控可发送 GET STATUS 查询状态;
- 如果模组仍 BUSY,可等待、取消或 RESET;
- 如果出现 ERROR/INVALID,应提示异常或重新上电。
9.3 上下电流程
主控给模组上电
↓
模组初始化
↓
模组发送 NOTE:READY
↓
主控开始发送业务命令
↓
模组处理并返回结果
↓
主控确认无消息或超时后可断电
9.4 录入流程
发送 ENROLL / ENROLL_ITG
↓
模组返回 NOTE:FACE_STATE
↓
Unity 提示用户调整距离、方向、姿态
↓
模组返回 REPLY:ENROLL
↓
成功:记录 user_id 和 face_direction
失败:显示 result 对应原因
9.5 验证流程
发送 VERIFY
↓
模组返回 NOTE:FACE_STATE
↓
Unity 实时显示检测状态
↓
模组返回 REPLY:VERIFY
↓
成功:得到 user_id / user_name / admin
失败:显示错误原因
9.6 照片下发注册流程
发送 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 分包上传图片或特征模板。