Skip to main content
Glama
dncore

efferent-ble-simulator

by dncore

Efferent имитирует периферийные устройства Bluetooth Low Energy (BLE) через реальный радиоканал (Linux BlueZ): умные тренажёры FTMS, велосипедные измерители мощности, датчики скорости/каденса и мониторы сердечного ритма. Он предоставляет MCP-сервер (stdio или HTTP), благодаря чему AI-агенты — и встроенная веб-панель — могут запускать, настраивать и контролировать симуляции так, как если бы управляли реальным тренажёром.


Возможности

  • 4 типа устройств через реальный BLE-радиоканал: умный тренажёр FTMS (0x1826), велосипедная мощность (0x1818), скорость/каденс (0x1816), сердечный ритм (0x180D)

  • Полная поддержка контрольной точки FTMS: Request Control / Start / Stop / Reset / Set Target Power / Set Resistance / Set Indoor Bike Simulation Params

  • Динамическая симуляция: реалистичный дрейф мощности/каденса + физическая модель скорости (вес, уклон, Crr, CdA), 5 сценариев езды, включая скриптовый ride_script

  • Горячее обновление параметров: изменение параметров на лету — подключённый телефон сохраняет соединение и получает новые значения при следующем notify (без повторного сопряжения)

  • Именованные пресеты конфигураций: сохранение / загрузка / переименование / удаление до 20 именованных конфигураций, общих для MCP и панели

  • 17 MCP-инструментов для агентов: управление, настройка, пресеты конфигураций, правила взаимодействия, сессии, логи, живое состояние устройства, версия

  • Веб-панель (React + shadcn/ui): статус, формы, шаблоны езды в один клик, правила взаимодействия, управление сессиями/конфигурациями, боковая панель живых логов

  • Docker Compose — развёртывание одной командой (MCP + панель + файл навыка по HTTP), длительная работа с проверками работоспособности

  • Версионирование: MCP serverInfo.version + ble_get_version позволяют агентам обнаруживать обновления


Related MCP server: pyBTMCP

Среда выполнения

Требование

Подробности

ОС

Только Linux — симулятор управляет хост-сервисом BlueZ через D-Bus

BlueZ

≥ 5.87 (в 5.86 есть ошибка регистрации рекламных объявлений)

Оборудование

Для фактической трансляции требуется адаптер с поддержкой BLE (встроенный или USB-донгл)

Политика D-Bus

/etc/dbus-1/system.d/ble-simulator.conf (устанавливается через npm run setup) — требуется для регистрации GATT без прав root

Docker

Контейнер mcp монтирует сокет D-Bus хоста; BLE-радио всегда остаётся на хосте

Не поддерживается

macOS / Windows нативно (потребовался бы другой BLE-стек); без BLE-адаптера MCP-сервис работает, но ничего не передаётся

Архитектура

┌──────────────┐   MCP protocol    ┌───────────────────────────┐
│ AI Agent /   │ ◄───────────────► │ MCP Server (HTTP :3300)   │
│ MCP Client   │  stdio / :3300    │ Web Dashboard (:3330)     │
│ (Claude,     │                   └────────────┬──────────────┘
│  Codex, pi)  │                                │ BlueZ D-Bus (system bus)
└──────────────┘                                ▼
                                     ┌───────────────────────────┐
                                     │ Host Linux BlueZ          │
                                     │ bluetoothd + BLE adapter  │
                                     │ (D-Bus policy, ≥ 5.87)    │
                                     └────────────┬──────────────┘
                                                  │ HCI / radio
                                                  ▼
                                     ┌───────────────────────────┐
                                     │ BLE advertisement + GATT  │
                                     │ FTMS / Power / CSC / HR   │
                                     └────────────┬──────────────┘
                                                  │
                                     ┌────────────▼──────────────┐
                                     │ Phone / Cycling App       │
                                     │ (Zwift, Garmin, Strava...)│
                                     └───────────────────────────┘

Типы устройств

Тип

BLE-сервис

Характеристики

FTMS умный тренажёр

0x1826

FM Feature, Indoor Bike Data (notify), Control Point (write/indicate), Status, диапазоны Resistance/Power

Велосипедная мощность

0x1818

Измерение мощности/каденса, данные колеса и шатунов

Скорость/каденс (CSC)

0x1816

Счётчики оборотов колеса и шатунов

Сердечный ритм

0x180D

Измерение ЧСС, расположение датчика на теле, батарея


Быстрый старт

Предварительные требования

  • Linux с BlueZ ≥ 5.87 (bluetoothd) и адаптером с поддержкой BLE

    В BlueZ 5.86 есть ошибка регистрации рекламных объявлений; на ядрах со строгой проверкой MGMT каждый RegisterAdvertisement завершается ошибкой. Обновитесь заранее: sudo pacman -S bluez && sudo systemctl restart bluetooth (Arch) / sudo apt install bluez (Debian).

  • Node.js ≥ 18

1. Нативная установка

npm install
npm run setup     # sudo — installs D-Bus policy, enables bluetoothd, verifies GATT
npm run build
npm run start:http   # HTTP mode on :3300 (or npm start for stdio)

npm run setup записывает /etc/dbus-1/system.d/ble-simulator.confобязательно для регистрации GATT без прав root (без него устройство транслируется, но к нему нельзя подключиться).

2. Docker Compose (рекомендуется для серверов)

bash scripts/docker-up.sh     # host prep (sudo, once) + build + start

URL

Назначение

http://<host>:3300/mcp

Конечная точка MCP

http://<host>:3330/

Веб-панель

http://<host>:3330/skill/SKILL.md

Навык работы (для агентов)

http://<host>:3330/help

Справочная страница панели

Сборка без компиляции (готовый бинарник better-sqlite3); в ограниченных сетях используйте зеркало:

NPM_REGISTRY=https://registry.npmmirror.com \
BETTER_SQLITE3_BINARY_HOST_MIRROR=https://registry.npmmirror.com/-/binary/better-sqlite3 \
bash scripts/docker-up.sh

Управление: bash scripts/docker-up.sh status|logs|down


MCP-инструменты (17)

Инструмент

Назначение

ble_start / ble_stop / ble_restart

Запуск / остановка / перезапуск симуляции

ble_status

Состояние контроллера + активная конфигурация + живое состояние устройства (фаза/мощность/каденс/ЧСС)

ble_configure

Обновление конфигурации — горячее обновление на месте, если запущено с тем же типом устройства

ble_get_config

Текущая/последняя конфигурация в JSON (для заполнения форм)

ble_save_config

Сохранение текущих параметров как именованного пресета (макс. 20)

ble_list_configs / ble_get_config_detail

Список / просмотр сохранённых пресетов

ble_rename_config / ble_delete_config

Переименование / удаление пресета

ble_set_interaction / ble_clear_interactions

Пользовательские правила ответов на BLE-записи

ble_list_sessions / ble_get_session

История сессий / подробности

ble_get_logs

Постоянные журналы связи (connect/write/notify/error)

ble_get_version

Версии MCP + навыка, журнал изменений, URL навыка (для обнаружения обновлений)

Пример

{
  "method": "tools/call",
  "params": {
    "name": "ble_start",
    "arguments": {
      "deviceType": "ftms",
      "ftms": { "simulation": { "enabled": true, "scenario": { "type": "ride_script" } } }
    }
  }
}

Динамическая симуляция

Включается через simulation для FTMS / CyclingPower / CSC:

"simulation": {
  "enabled": true,
  "riderWeightKg": 75, "bikeWeightKg": 8, "crr": 0.004, "cdA": 0.35,
  "fatigueFactor": 0.0005, "cadenceCoupling": "proportional", "microPauseProbability": 0.008,
  "autoStart": true,
  "scenario": { "type": "ride_script" }
}

Параметр

По умолчанию

Описание

enabled

false

Главный переключатель

riderWeightKg / bikeWeightKg

75 / 8

Физика скорости (масса велосипедиста + велосипеда)

crr / cdA

0.004 / 0.35

Сопротивление качению / площадь лобового сопротивления

fatigueFactor

0

Спад мощности в минуту (0 = нет)

cadenceCoupling

proportional

proportional / inverse / independent

microPauseProbability

0.005

Паузы-накаты на каждый тик

autoStart

false (для ride_script по умолчанию включён)

Начало езды без команды Start от приложения

scenario

freeride

Сценарий езды (ниже)

Сценарии

  • steady — только естественная микро-вариация

  • freeride (по умолчанию) — базовая мощность дрейфует ±20% каждые 60–180 с

  • intervals — чередование высокой/низкой мощности

  • warmup_main_cooldown — разминка → основная часть → заминка

  • ride_script — скриптовая езда: последовательность действий (start / cruise / climb / sprint / coast / stop), каждое с целевой мощностью, уклоном и опциональным каденсом; автозапуск, зацикливание с repeat: true, stop обнуляет мощность/каденс/скорость. Опустите phases, чтобы использовать встроенный скрипт по умолчанию.


Горячее обновление и стабильный серийный номер

  • Горячее обновление: ble_configure во время работы + тот же тип устройства применяет параметры на месте — подключённый телефон сохраняет соединение и получает обновлённые значения при следующем notify. Смена типа устройства всё равно вызывает перезапуск (новый серийный номер вынуждает повторное обнаружение).

  • Стабильный серийный номер: SIM_SERIAL_STABLE=1 сохраняет серийный номер стабильным между сессиями одного типа (SIM001-FTMS), поэтому телефон может переподключиться после stop/start без удаления устройства.


Переменные окружения

Переменная

По умолчанию

Описание

MCP_TRANSPORT

stdio

stdio или http

MCP_PORT / MCP_HOST

3300 / 0.0.0.0

Адрес прослушивания HTTP

SIM_DEVICE_PREFIX

OPEN_RIDE

Префикс транслируемого имени

SIM_INSTANCE_ID_MODE

Режим идентификатора экземпляра для имени устройства

SIM_SERIAL_STABLE

не задано

1 = стабильный серийный номер для сессий одного типа

SKILL_PUBLIC_URL

/skill/SKILL.md

Публичный URL навыка (возвращается ble_get_version)


Структура исходного кода

src/
├── index.ts             # entry, lifecycle
├── mcp-server.ts        # 17 MCP tool definitions & handlers
├── ble-controller.ts    # BlueZ D-Bus lifecycle, advertisement, hot-update
├── database.ts          # SQLite layer (sessions / saved_configs / logs)
├── config.ts            # config merge & defaults
├── version.ts           # version single-source
├── simulator.ts         # HeartRate / Battery simulators
├── cycling-simulator.ts # power/cadence simulators + physics + ride_script engine
└── devices/             # heart-rate / cycling-power / csc / ftms GATT devices

Доступ к BLE-периферии осуществляется через D-Bus хост-сервиса BlueZ (контейнер монтирует сокет D-Bus хоста). См. docs/design/*.md — записи о проектировании.


Лицензия

MIT © BLE Simulator Contributors

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Bluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.
    15
    BSD 2-Clause "Simplified"
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A BLE fitness device simulator that enables AI agents to control simulated heart rate monitors, treadmills, and cycling trainers via the Model Context Protocol. It integrates ESP32 firmware, an MQTT broker, and a FastAPI backend for comprehensive device management and real-time interaction.
  • A
    license
    A
    quality
    C
    maintenance
    A stateful Bluetooth Low Energy (BLE) MCP server that enables AI agents to scan, connect, read/write characteristics, and subscribe to notifications on BLE devices.
    35
    17
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Exposes Garmin Connect data and workout management to AI agents, supporting tools, resources, and prompts for health data, workout creation, and coaching workflows.
    1

View all related MCP servers

Related MCP Connectors

  • Multi-tenant Telegram gateway for AI agents — HTTP+stdio, 8 tools, MTProto User API

  • Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.

  • Build, validate, and deploy multi-agent AI solutions from any AI environment.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dncore/efferent-ble-simulator'

If you have feedback or need assistance with the MCP directory API, please join our Discord server