小鼠监测系统开发记录 - Gemini辅助
本项目旨在为生物实验提供一套集成了生物体征(体重、体温、RFID 标签)自动化采集、药物剂量精密计算以及实验数据集中记录与管理的数字化解决方案。整个系统采用 C/S (Client-Server) 架构,通过 WebSocket 实现前后端实时通信,并利用 Python/Flask 框架处理硬件接口和数据逻辑。
1. 项目目标与技术选型
核心技术栈:
后端 (Server): Python (Flask, Flask-SocketIO, Serial/MODBUS 库)
前端 (Client): HTML5, CSS3, JavaScript (Socket.IO Client)
通信协议: WebSocket (Socket.IO), 串口通信 (RS232/USB转串口), MODBUS-RTU
2. 服务端开发记录 (Backend Log)
服务端是系统的核心大脑,主要负责硬件设备的连接、数据的稳定采集、业务逻辑计算及数据持久化。
2.1 硬件抽象与连接管理
功能: 统一管理电子秤 (COM3)、温度计 (COM10) 和 UHF RFID 阅读器 (COM8) 的连接状态。
实现: 使用 Python 的串行通信库封装硬件驱动层。在服务器启动时尝试连接并持续监听,并通过 SocketIO 将连接状态和实时数据(体重、温度)推送到前端。
优势: 实现了硬件的插拔管理和连接状态可视化,方便用户在前端进行连接/断开操作(通过调试面板)。
2.2 实时数据采集与推送
逻辑: 电子秤和温度计持续采集数据,并通过 socket.emit('weight_update', ...) 和 socket.emit('temperature_update', ...) 实时广播到所有连接的客户端。
RFID 流程:
客户端发起 socket.emit('start_scan')。
后端启动 RFID 监听,实时将扫描到的 ID 暂存并推送到客户端 (rfid_update)。
成功锁定 ID 后,触发 scanned_id_found 事件,通知客户端扫描成功,并携带最新的体重和时间戳。
2.3 数据持久化与查询
元数据 (mouse_metadata): 存储 RFID_ID、小鼠名称 (Mouse_Name)、基数 (Base_Multiplier) 和所属人 (Owner)。用于首次扫描时的数据填充和元数据的新建/更新。
历史数据 (mouse_data): 存储每次操作的完整记录,包括时间戳、所有生物体征、计算剂量和备注。
业务逻辑:
接收到新的 RFID 后,查询元数据。如果存在,返回元数据和最近 3 次历史记录。
接收到 save_data 请求时,将完整数据写入 mouse_data 文件/数据库。
2.4 数据导出与系统维护
数据导出: 实现了基于 Owner 字段筛选历史记录,并将结果打包成 CSV 文件,通过 Flask 路由 (/download_export) 供用户下载。
日志下载: 提供下载系统运行日志 (/download_log) 的接口,便于远程调试和系统维护。
3. 客户端开发记录 (Frontend Log - templates/index.html)
前端采用单页应用模式,利用 JavaScript 处理所有用户交互和数据实时更新。
3.1 页面结构与布局
采用经典的 双栏网格布局 (top-grid),左侧用于数据采集和剂量计算,右侧用于元数据和备注输入。
实时数据显示区 (realtime-data) 采用三列布局,清晰展示体重、温度和 ID。
底部包含“本次数据”和“历史数据”表格,以及一个实时的“状态栏”用于显示设备连接状态。
3.2 核心功能实现
剂量自动计算: ```javascript
// injection = weight * multiplier
const injection = (weight * multiplier).toFixed(3);
document.getElementById('injection-amount').value = injection;
该函数绑定在基数输入框 (`oninput`) 和体重更新事件 (`weight_update`) 上,实现了剂量数据的实时联动和精密到小数点后三位的计算。数据填充与校验: 扫描成功后,JavaScript 接收后端返回的元数据,自动填充小鼠名称、所属人和基数。在保存时,对新建 ID 强制要求填写名称和所属人。
表格动态更新: updateCurrentDataTable 和 updateHistoryDataTable 函数负责根据 SocketIO 接收到的数据动态重绘表格内容。
4. 关键功能与迭代优化记录
在开发过程中,根据实际使用反馈,对用户界面和显示逻辑进行了两次关键的迭代优化,以确保系统的实用性和体验性。
5. 系统展示与最终能力 (Final Showcase)
经过多次迭代优化,本系统已具备以下功能和界面特性:
A. 精准的实时数据展示
实时体重 (g):
实时温度 (℃):
实时/本次 ID: 仅显示 RFID 的前 8 位字符(易于识别)
B. 智能化的操作流程
用户点击 “扫描小鼠标签”。
系统实时显示 RFID 标签的前 8 位,并自动锁定。
系统查询历史数据,自动填充小鼠名称、所属人和上次使用的基数。
根据当前体重和自动填充的基数,系统实时计算并显示注射剂量(精确到小数点后三位)。
计算公式:注射量 = 体重 × 基数 (Multiplier)
用户填写备注后,点击 “保存记录”,完整数据(包括原始 RFID_ID)被保存,系统重置为待扫描状态。
C. 强大的数据管理工具
本次数据表: 实时反映当前操作的数据和计算结果。
历史数据表: 显示该 RFID 标签最近 3 次的操作记录,所有 ID 均显示完整版本以供溯源。
硬件调试面板: 可手动连接/断开电子秤、温度计和 RFID 阅读器,并支持按“所属人”筛选批量导出历史数据为 CSV 文件。
状态栏: 实时显示所有硬件设备的连接状态(连接/断开),并提示所使用的 COM 端口。
6.前端代码展示
生物体征数字化采集与药物剂量精密控制系统
数据采集与控制
剂量计算
元数据及记录
本次数据
| ID | 名称 | 所属人 | 体重(g) | 温度(℃) | 基数 | 注射量 | 单位 | 药物/备注 | 时间 |
|---|---|---|---|---|---|---|---|---|---|
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
历史数据 (最近 3 次)
| ID | 名称 | 所属人 | 体重(g) | 温度(℃) | 基数 | 注射量 | 单位 | 药物/备注 | 时间 |
|---|---|---|---|---|---|---|---|---|---|
| 请先扫描标签以显示历史记录 | |||||||||
7.使用说明
1.首次使用时,需连接显示器,鼠标,键盘,以便于进行配置
2.首次使用时,只插入系统电源线即自动开机。 #切勿查错电源线!!!#
3.进入系统后,连接wifi,连接完成后,打开设置-网络和internet-WLAN-属性,查看并记住 #IPV4地址# 例如:192.168.100.109 ,查看并记住 #物理地址(MAC)# ,例如:58-CD-C9-C6-4B-11
4.进入路由器将IP地址与MAC地址进行绑定,目的是下次开机时IP地址不改变。#这步也可以不操作,但下次开机后打不开网页就要重新查看IPV4地址#
###################################以上为配置阶段,以下为开机使用阶段#####################################################################
1.首先打开电子秤开关。
2.插入RFID电源线 12V。 #切勿查错电源线!!!查错烧毁#
2.关闭面板上红色开关,处于关闭状态(圆圈按下,灯不亮)
3.插入系统电源线 19V 。 #切勿查错电源线!!!查错烧毁#
4.平板或手机或电脑连接系统所在的的局域网。
5.在浏览器中打开 #IP:5000# 例如 192.168.100.109:5000 #注意:地址栏均是英文符号#
6.网页能打开后,再进行下一步
7.打开面板上红色开关,处于开启状态(竖线按下,灯亮),听到滴滴声音
8.点击扫描,开始使用!
##############################################注意事项#########################################################
注意:点击扫描后须在15秒内完成扫描,如未完成,请将标签移出扫描区域等待10秒,再次点击扫描标签。
若发出连续滴滴声音说明附近有其他标签,需排除!