Skip to main content

Overview

Synheart Wear supports direct Bluetooth LE connections to any standard heart rate monitor. This enables real-time HR streaming without requiring a cloud API or vendor-specific SDK. Supported devices include:
  • WHOOP (Broadcast Heart Rate mode)
  • Polar sensors (H10 chest strap, OH1 / Verity Sense optical arm bands)
  • Wahoo TICKR, TICKR X
  • Garmin HRM-Pro, HRM-Dual
  • Gym equipment with BLE HR broadcast
  • Any device implementing the standard BLE Heart Rate Profile (0x180D)

How It Works

The BLE HRM provider connects to devices advertising the standard Bluetooth Heart Rate Service (0x180D), subscribes to the Heart Rate Measurement characteristic (0x2A37), and parses incoming data per the Bluetooth SIG specification.

Platform Setup

iOS

Add to Info.plist:

Android

Add to AndroidManifest.xml:
Note: Android 12+ requires runtime permission requests for BLUETOOTH_SCAN and BLUETOOTH_CONNECT. Flutter on Android also needs, because the plugin’s minSdk is 28 and it streams through a dataSync foreground service:
Request the Bluetooth permissions at runtime yourself on Android: Flutter’s BleHrmProvider.requestPermission() is iOS-only.

Usage

API Reference

Methods

Flutter also has requestPermission() (iOS only), warmAdapter(), getBondedHrDevices(), and Polar H10 accelerometer streaming: connect(enableMotion: true, motionSampleRateHz: 50) with the onMotion stream.

BleHrmDevice

Returned from scan():

HeartRateSample

Emitted on the heart rate stream: Note: rrIntervalsMs availability depends on the device. Polar chest straps typically include RR intervals; WHOOP Broadcast typically does not.

Error Codes

Errors surface as BleHrmError with a BleHrmErrorCode on Flutter, BleHrmException(errorCode) on Kotlin, and SynheartWearError.bleHrm(code, message) on Swift.

WHOOP Broadcast Setup

To use WHOOP as a BLE heart rate monitor:
  1. Open the WHOOP app on your phone
  2. Go to Device Settings (tap your WHOOP device)
  3. Enable Broadcast Heart Rate
  4. Your WHOOP will now appear in BLE scans as a standard HR monitor
Note: WHOOP Broadcast HR provides BPM only (no RR intervals). For full WHOOP data (recovery, sleep, strain), use the WHOOP cloud provider instead.

Reconnection

The BLE HRM provider automatically handles disconnections:
  • Kotlin and Swift: 3 retry attempts with exponential backoff (1 s, 2 s, 4 s)
  • Flutter: Android retries 5 times, 3 s apart; iOS waits up to 30 s for CoreBluetooth to reconnect
  • After that, a DISCONNECTED error is emitted on the stream
  • Your app can then prompt the user to reconnect

Limitations

  • Single device: Only one BLE HRM device can be connected at a time (v1)
  • Phone-side only: Requires the phone to be in BLE range of the HR monitor
  • No HRV calculation: Raw RR intervals are provided when available, but HRV calculation is not performed by the provider
  • Battery dependent: Battery level monitoring is optional (enableBattery: true during connect)

Architecture

The BLE HRM provider is implemented natively on each platform: All platforms parse HR data identically per the Bluetooth SIG Heart Rate Profile specification (flags byte, uint8/uint16 BPM, optional RR intervals at 1/1024s resolution).