一、项目概述 facecheck 是一个嵌入式人脸识别打卡系统,由客户端(ARM 开发板)和服务端(WSL/Linux PC)组成:
客户端 :运行在嵌入式板子上,通过摄像头采集人脸 → 识别身份 → 上报打卡数据到服务器
服务端 :接收 TCP 打卡请求 → 自动判断迟到/早退 → 存入 SQLite 数据库
二、项目结构 1 2 3 4 5 6 7 8 9 10 11 facecheck/ ├── common/ │ └── protocol.h # 通信协议定义(C/S 共用) ├── server/ │ └── server.cpp # 服务端(TCP + SQLite) ├── client/ │ └── client.cpp # 客户端(人脸识别 + 打卡) ├── database/ │ └── schema.sql # 数据库建表 & 常用查询 ├── Makefile └── README.md
三、通信协议设计 3.1 帧格式 1 2 3 4 5 6 ┌────────┬────────┬────────┬───────────┬────────┐ │ 帧头 │ 类型 │ 长度 │ 数据区 │ 帧尾 │ │ 2 Byte │ 1 Byte│ 2 Byte │ N Byte │ 2 Byte │ ├────────┼────────┼────────┼───────────┼────────┤ │0x5AA5 │ TYPE │ N │ payload │0xA55A │ └────────┴────────┴────────┴───────────┴────────┘
3.2 打卡记录数据结构 1 2 3 4 5 6 7 typedef struct { char name[32 ]; time_t timestamp; uint8_t type; uint8_t status; float confidence; } checkin_record_t ;
3.3 消息类型
类型码
含义
方向
0x01
打卡签到
客户端 → 服务端
0x02
服务端回复
服务端 → 客户端
0x03
查询考勤记录
客户端 → 服务端
0x05
心跳保活
双向
3.4 完整通信流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 客户端 服务端 │ │ ├─── TCP 三次握手 ──────────────────┤ │ │ ├── [0x01] 打卡请求 ───────────────→│ │ name="张三" │ │ timestamp=xxx │ ① 验证帧头/帧尾 │ type=0 (上班) │ ② 解析打卡数据 │ confidence=0.92 │ ③ 判断迟到/早退 │ │ ④ 写入 SQLite ├←─ [0x02] 回复 ────────────────────┤ │ code=0 (成功) │ │ msg="张三 打卡成功!" │ │ │ ├── [0x05] 心跳 ─────── 每30秒 ───→│ ├←─ [0x05] alive ──────────────────┤
四、服务端设计 4.1 多线程模型 1 2 3 4 5 while (running) { SOCKET client_fd = accept (...); std::thread (handle_client, client_fd, ip).detach (); }
4.2 迟到/早退判定 1 2 3 4 5 6 7 8 9 10 11 uint8_t check_status (time_t now, uint8_t type) { if (type == TYPE_WORK_ON) { if (hour > 9 || (hour == 9 && min > 0 )) return 1 ; } else { if (hour < 17 ) return 2 ; } return 0 ; }
4.3 SQLite 存储 1 2 3 4 5 6 7 8 CREATE TABLE checkin ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL , timestamp INTEGER NOT NULL , type INTEGER NOT NULL , status INTEGER DEFAULT 0 , confidence REAL );
五、客户端设计 5.1 主流程 1 2 3 4 5 6 7 8 9 10 11 12 main() │ ├─ connect_server() │ └─ while (1 ) ├─ show_menu() ├─ detect_face() │ ├─ 返回 name │ └─ 返回 confidence ├─ 构造 checkin_record └─ send_checkin() └─ 接收 reply 并显示
5.2 人脸识别接口(可替换) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int detect_face (char *name_out, float *confidence) { }
六、编译与部署 服务端(WSL/Linux PC) 1 2 3 cd facecheckmake server build/server 8888
客户端 1 2 3 4 5 6 7 make client build/facecheck_client make client CROSS=1
七、运行效果 服务端启动 1 2 3 4 5 6 7 8 9 10 11 ╔══════════════════════════════════╗ ║ facecheck 打卡服务器 ║ ║ 端口: 8888 ║ ║ 数据库: facecheck.db ║ ║ Ctrl+C 退出 ║ ╚══════════════════════════════════╝ [DB] 数据库初始化完成 [连接] 客户端 192.168.1.200 已连接 [打卡] 张三 | 2026-06-22 09:05 | 上班 | 置信度: 0.92 | 状态: 1(迟到) [打卡] 李四 | 2026-06-22 08:55 | 上班 | 置信度: 0.95 | 状态: 0(正常) [打卡] 王五 | 2026-06-22 17:30 | 下班 | 置信度: 0.88 | 状态: 0(正常)
客户端操作 1 2 3 4 5 6 7 8 9 10 11 12 13 ╔══════════════════════════════════╗ ║ 人脸识别打卡系统 ║ ╠══════════════════════════════════╣ ║ 1. 上班打卡 ║ ║ 2. 下班打卡 ║ ║ 0. 退出 ║ ╚══════════════════════════════════╝ 请选择: 1 [人脸检测] 请正对摄像头... [识别成功] 张三 置信度: 92.50% [打卡] 张三 上班... [服务器回复] 张三 打卡成功!
八、SQL 数据分析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SELECT name, datetime(timestamp , 'unixepoch' , 'localtime' ) as time , CASE type WHEN 0 THEN '上班' ELSE '下班' END as type, CASE status WHEN 0 THEN '正常' WHEN 1 THEN '迟到' WHEN 2 THEN '早退' END FROM checkinWHERE date (timestamp , 'unixepoch' ) = date ('now' )ORDER BY timestamp DESC ;SELECT name, COUNT (* ) as late_timesFROM checkinWHERE type = 0 AND status = 1 AND strftime('%Y-%m' , timestamp , 'unixepoch' ) = strftime('%Y-%m' , 'now' ) GROUP BY nameORDER BY late_times DESC ;
九、后续扩展
方向
说明
人脸录入系统
注册新用户时录入人脸特征向量
Web 管理后台
Django/Flask 搭建考勤管理页面
手机推送
打卡后微信通知直属领导
RFID 双因子
人脸 + 工卡双重验证
实时大屏
会议室大屏显示今日到岗人数
项目地址 :e:/facecheck/
技术栈 :C/C++ · TCP Socket · SQLite3 · 人脸检测 · ARM 交叉编译