Overview
A real-time biosignal platform. A wearable ESP32 device streams nine sensor channels over BLE, a C++ backend bridges them to WebSocket clients, and InfluxDB with Grafana keeps the history.
Core features
- Nine biosignal channels in one 36-byte BLE notification, including ECG, pulse rate, SpO2 and body temperature
- Unavailable channels filtered out, using the
32767.0fsentinel value - C++20 backend that subscribes to the device over BlueZ and processes each characteristic in its own thread
- Live React dashboard fed by WebSocket frames
- Long-term storage in InfluxDB, read back through Grafana
- One command deployment: four services start with
docker compose up -d - You own your data: every frame is written to an InfluxDB bucket on your own machine, behind your own credentials, with no third-party service in the path
- Nothing leaves your network: the wearable, the backend, the dashboard and the database all run on hardware you control, so a session can be recorded, inspected, exported and deleted at any time
- Open building blocks: NimBLE, oatpp, React, InfluxDB and Grafana are all inspectable and replaceable, so no part of the pipeline is a black box
In this project
| Chapter | What it covers |
|---|---|
| Source repository | repository link, monorepo layout, run command |
| System architecture | block diagram, from wearable to Grafana |
| Hardware | sensor set, the nine channels, outstanding work |
| ESP32 firmware architecture | GATT service, notification layout, build |
| C++ high-performance backend | BlueZ, per-characteristic threads, WebSocket |
| React 19 frontend dashboard | live charts over WebSocket |
| InfluxDB time-series storage | line protocol writes, retention |
| Grafana analytics and telemetry | provisioned dashboards |
| Docker Compose deployment | the four services and their configuration |
| Results | what works end to end, and what is unmeasured |
| Diagnostics and troubleshooting | D-Bus, frame and container checks |