1. 项目背景与需求分析
在高校教学管理场景中,课堂点名是教师日常工作中不可或缺的环节。传统纸质点名册存在效率低下、数据统计困难、容易代签等问题。根据某高校教务处2023年的调研数据,采用人工点名方式平均每节课浪费教学时间8-12分钟,且考勤数据电子化归档需要额外2-3个工作日。
基于WIFI协议的课堂点名系统通过智能终端设备自动识别学生手机连接的WIFI信号,实现无感化考勤。这种方案相比传统方式具有三个显著优势:
- 实时性:点名结果即时生成可视化报表
- 准确性:MAC地址绑定避免代签行为
- 追溯性:完整记录学生到课时间轨迹
2. 技术架构设计
2.1 整体技术栈选型
采用前后端分离架构,主要技术组件包括:
mermaid复制graph TD
A[前端] -->|Vue3| B(Element Plus)
C[后端] -->|SpringBoot| D(MyBatis-Plus)
D --> E[MySQL 8.0]
F[硬件] -->|ESP32| G(WIFI探针)
2.2 核心模块划分
- 设备感知层:ESP32开发板配置为AP模式,定时发送802.11探测帧
- 数据采集层:基于SpringBoot的WebSocket服务实时接收设备数据
- 业务逻辑层:
- 考勤规则引擎(支持按课程时间自动触发)
- 异常行为检测(频繁断开重连识别)
- 数据展示层:Vue3+ECharts实现多维数据可视化
3. 关键实现细节
3.1 WIFI探针数据采集
ESP32固件开发关键代码片段:
c复制void send_probe_request() {
wifi_pkt_rx_ctrl_t ctrl;
os_memcpy(&ctrl, rx_ctrl, sizeof(wifi_pkt_rx_ctrl_t));
// 提取MAC地址
uint8_t* mac = (uint8_t*)rx_data + 10;
char mac_str[18];
sprintf(mac_str, "%02X:%02X:%02X:%02X:%02X:%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
// 通过UDP发送到服务器
udp_sendto(mac_str);
}
3.2 后端数据处理流程
java复制@RestController
public class AttendanceController {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@MessageMapping("/device/{roomId}")
public void handleDeviceData(@DestinationVariable String roomId,
DeviceData data) {
// 1. MAC地址白名单校验
if(!redisTemplate.opsForSet().isMember("valid_devices", data.getMac())){
return;
}
// 2. 生成考勤记录
AttendanceRecord record = new AttendanceRecord();
record.setStudentId(macMappingService.getStudentId(data.getMac()));
record.setCheckInTime(LocalDateTime.now());
// 3. 持久化存储
attendanceService.save(record);
}
}
4. 数据库设计优化
4.1 核心表结构
sql复制CREATE TABLE `tb_attendance` (
`id` bigint NOT NULL AUTO_INCREMENT,
`course_id` bigint NOT NULL COMMENT '课程ID',
`student_id` varchar(32) NOT NULL COMMENT '学号',
`check_in_time` datetime NOT NULL COMMENT '签到时间',
`device_mac` varchar(20) DEFAULT NULL COMMENT '设备MAC',
`signal_strength` smallint DEFAULT NULL COMMENT '信号强度',
PRIMARY KEY (`id`),
INDEX `idx_course_time` (`course_id`, `check_in_time`),
UNIQUE KEY `uk_student_course` (`student_id`, `course_id`, `check_in_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 性能优化措施
- 采用时间分片表(每月自动创建新表)
- 热点数据缓存策略:
java复制@Cacheable(value = "attendanceStats", key = "#courseId+'_'+#date.format('yyyyMMdd')") public AttendanceStatDTO getDailyStats(Long courseId, LocalDate date) { // 复杂统计查询 }
5. 前端交互实现
5.1 教师端核心功能
- 实时考勤看板:使用WebSocket实现数据推送
vue复制<template> <el-table :data="attendanceData" v-loading="loading"> <el-table-column prop="studentName" label="姓名" /> <el-table-column label="状态"> <template #default="{row}"> <el-tag :type="row.status | statusFilter"> {{ row.status | statusText }} </el-tag> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { socket: null, attendanceData: [] } }, mounted() { this.socket = new WebSocket(`wss://${location.host}/ws/attendance`); this.socket.onmessage = (event) => { this.attendanceData = JSON.parse(event.data); } } } </script>
5.2 学生端异常处理
javascript复制// 处理WIFI连接异常
function checkNetwork() {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
reject(new Error('WIFI连接超时'));
}, 10000);
window.addEventListener('online', () => {
clearTimeout(timer);
resolve();
});
});
}
6. 部署与运维方案
6.1 硬件部署建议
-
教室AP布置原则:
- 每50㎡部署1个探针节点
- 安装高度2.5-3米
- 避免金属遮挡物
-
信号强度校准公式:
code复制RSSI = -(10*n*log10(d) + A)其中:
- n:环境衰减因子(教室环境建议2.5-3.5)
- d:设备距离(米)
- A:1米处参考信号强度(典型值45-55)
6.2 系统监控指标
配置Prometheus监控关键指标:
yaml复制metrics:
attendance:
labels: [course_id, room_id]
type: gauge
description: "当前在线学生数"
device:
labels: [room_id, mac]
type: counter
description: "设备心跳次数"
7. 项目扩展方向
-
行为分析扩展:
- 通过停留时长识别早退行为
- 结合多个探针数据实现室内定位
-
混合验证机制:
mermaid复制graph LR A[WIFI探测] --> B{置信度>90%?} B -->|是| C[自动记录] B -->|否| D[二维码补充验证] -
边缘计算优化:
python复制# 在探针端预处理数据 def process_raw_data(raw): mac = raw[:17] rssi = int(raw[18:22]) if -70 < rssi < -30: # 有效信号范围 return f"{mac},{time.time()},{rssi}" return None
实际开发中发现,当单教室人数超过80人时,需要优化ESP32的扫描间隔参数(建议调整为300-500ms),否则会出现设备过热导致的MAC地址漏采问题。这个经验来自某高校实际部署时的压力测试数据。
