# 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 分发: - 0x00:REPLY - 0x01:NOTE - 其他: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 分包上传图片或特征模板。