返回市场
蓝牙心率监测服务器

蓝牙心率监测服务器

作者:ThinkInAI-Hackathon2 星标更新:2025-06-22

项目介绍

ble-hrm-server

一个MCP服务器,作为BLE心率监测器,用于连接HRM设备。

构建状态

CI

安装

我们推荐使用虚拟环境和uv来管理依赖项。

此项目使用pyproject.toml进行依赖项管理。

# 创建并激活虚拟环境
python3 -m venv .venv
source .venv/bin/activate  # 在Windows上使用`.venv\Scripts\activate`

# 如果尚未安装,请安装uv
pip install uv

# 安装依赖项
uv sync

环境配置

此项目支持通过.env文件进行配置。您可以使用提供的.env.sample作为模板。

cp .env.sample .env

使用的环境变量如下:

  • QINIU_ACCESS_KEY:您的七牛访问密钥。
  • QINIU_SECRET_KEY:您的七牛秘密密钥。
  • QINIU_BUCKET_NAME:七牛存储桶的名称。
  • QINIU_BUCKET_DOMAIN:与七牛存储桶关联的域名。

使用方法

运行服务器

uv run src/hrm/server.py

从PyPI安装后,可以直接运行服务器:

uvx ble-hrm-server

运行测试

uv run pytest

带覆盖率运行测试

uv run coverage run -m pytest
uv run coverage html

MCP定义

资源

蓝牙HRM基于蓝牙协议,我们应该使用bleak来发现设备并连接到它。

  • 发现蓝牙设备并按HRM配置文件过滤(心率服务0x180D)
  • 资源:discover://hrm

工具

  • 工具:监测心率 monitoring_heart_rate

    • 概述:开始监测给定时间段内的设备心率,默认持续时间为30分钟(1800秒)。监测将在后台进行。
    • 输入:
      • device_id: str,要监测的设备UUID
      • duration: int,监测的时间长度,默认为1800秒(30分钟)
    • 输出:无
  • 工具:获取心率 get_heart_rate

    • 概述:获取当前HR,使用最近10秒的数据并返回平均HR
    • 输入:无(假设基准读数)
    • 输出:当前HR(整数),例如{"avg_hr": 60}
  • 工具:评估活动心率 evaluate_active_heart_rate

    • 概述:评估过去60秒的最大心率,在此锻炼期间观察到的最大心率被记录为主动心率。
    • 输入:无(假设基准读数)
    • 输出:最大HR:整数,例如{"max_hr": 100}
  • 工具:获取心率桶 get_heart_rate_bucket

    • 概述:获取过去10秒的心率桶,桶大小为1秒。
    • 输入:
      • since_from: 浮点数,监测的起始时间,默认是10秒前
      • bucket_size: 浮点数,桶的大小,默认是1秒
    • 输出:心率桶:list[dict],例如[{"time": 1715904000, "value": 60}, {"time": 1715904001, "value": 61}]
  • 工具:构建心率图表 build_heart_rate_chart

    • 概述:构建过去600秒的心率图表,桶的大小是动态的,默认大小为1秒。最大桶数量为60,如果桶数量超过60,则桶大小将增加到duration / 60秒。
    • 输入:
      • since_from: 浮点数,监测的起始时间,默认是600秒前
    • 输出:心率图表PNG URL:字符串,例如https://example.com/chart.png

MCP设置

以下是服务器的MCP设置:

{
  "mcpServers": {
    "blue-hrm": {
      "command": "uvx",
      "args": [
        "ble-hrm-server"
      ]
    }
  }
}

以下是DeepSeek V3.1测试的LLM样本提示:

您是一位健康专家,通过心率来检测测试者的心脏健康程度,现在测试者携带了蓝牙的心率带,

以下为检测步骤
- 您通过发现来获取的设备ID,通过rssi获取最接近的设备,再以此设备开始监控。
- 获取当前测试者的静息心率。
- 当测试结束后,提示测试者开始中高强度运动,比如波比跳,当测试者完成运动后,回复后,立刻测试其最高运动心率。
- 之后提示测试者计时休息2分钟,得到确认后,再次获取当前心率,并与最高心率的差额作为恢复心率。

最后通过恢复心率的值和以下列表评估测试者的心脏健康程度,并用健康专家的口吻给测试者一些关于心脏健康方面的建议。
------
- <22: 身体年龄略大于 真实年龄
- 22~52: 身体年龄= 真实年龄 
- 53~58: 身体年龄略小于真实年龄 
- 59~65: 身体年龄比真实年龄小 
- >=66: 身体年龄比真实年龄小很多

代码覆盖率

名称语句数未覆盖语句数覆盖率
src/hrm/init.py00100%
src/hrm/bt_client.py139596%
src/hrm/ts_db.py41198%
总计180697%

赞助

特别感谢七牛云提供存储服务。七牛还提供了LLM推理服务。

七牛Logo