本项目旨在为生物实验提供一套集成了生物体征(体重、体温、RFID 标签)自动化采集、药物剂量精密计算以及实验数据集中记录与管理的数字化解决方案。整个系统采用 C/S (Client-Server) 架构,通过 WebSocket 实现前后端实时通信,并利用 Python/Flask 框架处理硬件接口和数据逻辑。


1. 项目目标与技术选型

目标维度

具体目标

实现方案

数据采集

实时获取动物体重、体温及唯一身份标识(RFID)。

后端通过 Python 串行通信 (Serial) 或 MODBUS 协议连接硬件(电子秤、温度计、UHF RFID 阅读器)。

精密控制

基于实时体重和预设基数(倍数)自动计算精确的注射/喂养剂量。

前端 JavaScript 实时计算,确保数据同步。

数据管理

记录每次操作的生物体征数据、剂量、元数据(名称、所属人)和备注。

后端使用 CSV/数据库存储元数据 (mouse_metadata) 和历史记录 (mouse_data),支持查询和导出。

用户体验

提供简洁、高效、实时反馈的 Web 界面。

前端采用 HTML/CSS 布局,JavaScript 驱动,通过 SocketIO 实现无刷新实时通信。

核心技术栈:

  • 后端 (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 流程:

    1. 客户端发起 socket.emit('start_scan')。

    2. 后端启动 RFID 监听,实时将扫描到的 ID 暂存并推送到客户端 (rfid_update)。

    3. 成功锁定 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. 关键功能与迭代优化记录

在开发过程中,根据实际使用反馈,对用户界面和显示逻辑进行了两次关键的迭代优化,以确保系统的实用性和体验性。


ID 显示截断:对于长 RFID 标签,希望在显示框中只显示前 8 位。

JavaScript 字符串截断: 在 SocketIO 事件 (rfid_update 和 updateCurrentDataTable) 中,使用 data.id.slice(0, 8) 对显示内容进行截断。

最终实现: 前台显示区域只显示前 8 位(提高可读性),但后台内存 (currentScannedData.id) 和数据记录表格中保持完整的 RFID_ID(确保数据完整性)。

5. 系统展示与最终能力 (Final Showcase)

经过多次迭代优化,本系统已具备以下功能和界面特性:

A. 精准的实时数据展示

  • 实时体重 (g):

  • 实时温度 (℃):

  • 实时/本次 ID: 仅显示 RFID 的前 8 位字符(易于识别)

B. 智能化的操作流程

  1. 用户点击 “扫描小鼠标签”。

  2. 系统实时显示 RFID 标签的前 8 位,并自动锁定。

  3. 系统查询历史数据,自动填充小鼠名称、所属人和上次使用的基数。

  4. 根据当前体重和自动填充的基数,系统实时计算并显示注射剂量(精确到小数点后三位)。

    • 计算公式:注射量 = 体重 × 基数 (Multiplier)

  5. 用户填写备注后,点击 “保存记录”,完整数据(包括原始 RFID_ID)被保存,系统重置为待扫描状态。

C. 强大的数据管理工具

  • 本次数据表: 实时反映当前操作的数据和计算结果。

  • 历史数据表: 显示该 RFID 标签最近 3 次的操作记录,所有 ID 均显示完整版本以供溯源。

  • 硬件调试面板: 可手动连接/断开电子秤、温度计和 RFID 阅读器,并支持按“所属人”筛选批量导出历史数据为 CSV 文件。

  • 状态栏: 实时显示所有硬件设备的连接状态(连接/断开),并提示所使用的 COM 端口。

6.前端代码展示

生物体征数字化采集与药物剂量精密控制系统

生物体征数字化采集与药物剂量精密控制系统

数据采集与控制

等待数据...
等待数据...
等待扫描...

剂量计算

元数据及记录

本次数据

ID名称所属人体重(g)温度(℃)基数注射量单位药物/备注时间
N/AN/AN/AN/AN/AN/AN/AN/AN/AN/A

历史数据 (最近 3 次)

ID名称所属人体重(g)温度(℃)基数注射量单位药物/备注时间
请先扫描标签以显示历史记录
调试工具:
UHF RFID (COM8) 连接: 检查中...
电子秤 (COM3) 连接: 检查中...
温度计 (COM10) 连接: 检查中...

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秒,再次点击扫描标签。

若发出连续滴滴声音说明附近有其他标签,需排除!