This is the official repository of Polar's software development kit. With this SDK you are able to develop your own applications for sensors made by Polar.
This SDK uses ReactiveX. You can read more about ReactiveX from their website reactivex
3rd party software license listing ThirdPartySoftwareListing
By exploiting the SDK, you indicate your acceptance of License.
If you wish to collaborate with Polar commercially, click here
You may use, copy and modify the SDK as long as you include the original copyright and license notice in any copy of the software/source and you comply with the license terms. You are allowed to use the SDK for the development of software for your private as well as for commercial use for as long as you use the SDK in compliance with the license terms.
Most accurate Heart rate sensor in the markets. The H10 is used in the Getting started section of this page. Store page
- From version 3.0.35 onwards.
- Heart rate as beats per minute. RR Interval in ms and 1/1024 format.
- Heart rate broadcast.
- Electrocardiography (ECG) data in µV. Default epoch for timestamp is 1.1.2000
- Accelerometer data with sample rates of 25Hz, 50Hz, 100Hz and 200Hz and range of 2G, 4G and 8G. Axis specific acceleration data in mG. Default epoch for timestamp is 1.1.2000
- Start and stop of internal recording and request for internal recording status. Recording supports RR, HR with one second sampletime or HR with five second sampletime.
- List, read and remove for stored internal recording (sensor supports only one recording at the time).
Reliable high quality heart rate chest strap. Store page
- Heart rate as beats per minute. RR Interval in ms and 1/1024 format.
- Heart rate broadcast.
Optical heart rate sensor is a rechargeable device that measures user’s heart rate with LED technology. Store page
- Heart rate as beats per minute.
- Heart rate broadcast.
- Photoplethysmograpy (PPG) values.
- PP interval (milliseconds) representing cardiac pulse-to-pulse interval extracted from PPG signal.
- Accelerometer data with sample rate of 52Hz and range of 8G. Axis specific acceleration data in mG.
- Gyroscope data with sample rate of 52Hz and ranges of 250dps, 500dps, 1000dps and 2000dps. Axis specific gyroscope data in dps.
- Magnetometer data with sample rates of 10Hz, 20Hz, 50HZ and 100Hz and range of +/-50 Gauss. Axis specific magnetometer data in Gauss.
- List, read and remove stored exercise. Recording of exercise requires that sensor is registered to Polar Flow account. Stored sample data contains HR with one second sampletime.
- SDK mode (from version 1.1.5 onwards)
Optical heart rate sensor is a rechargeable device that measures user’s heart rate with LED technology. Store page
- From version 2.0.8 onwards.
- Heart rate as beats per minute.
- Heart rate broadcast.
- Photoplethysmograpy (PPG) values.
- PP interval (milliseconds) representing cardiac pulse-to-pulse interval extracted from PPG signal.
- Accelerometer data with samplerate of 50Hz and range of 8G. Axis specific acceleration data in mG.
- List, read and remove stored exercise. Recording of exercise requires that sensor is registered to Polar Flow account. Stored sample data contains HR with one second sampletime.
- polar-sdk-ios contains compiled iOS sdk, dependencies and documentation
- polar-sdk-android contains compiled Android sdk and documentation
- demos contains Android ecg demo application
- examples contains both android and ios example app utilizing all features from sdk
- gatt specification contains gatt specification for polar measurement data streaming
- H10 ecg technical document
Detailed documentation Full Documentation.
Compiled sdk and dependencies can be found from polar-sdk-android
- In
build.gradle
make sure the minSdkVersion is set to 21 or higher.
android {
...
defaultConfig {
...
minSdkVersion 21
}
}
- Copy the contents of polar-sdk-android folder into your project's libs folder e.g
YourProjectName/app/libs/
TheYourProjectName/app/libs/
should now contain two files
polar-ble-sdk.aar
polar-protobuf-release.aar
- Add the following dependencies to
build.gradle
inside the dependencies clause:
dependencies {
implementation files('libs/polar-ble-sdk.aar')
// Only needed if FEATURE_POLAR_FILE_TRANSFER used
implementation files('libs/polar-protobuf-release.aar')
// Only needed if FEATURE_POLAR_FILE_TRANSFER used
implementation 'commons-io:commons-io:2.8.0'
// Only needed if FEATURE_POLAR_FILE_TRANSFER used
implementation 'com.google.protobuf:protobuf-javalite:3.14.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
}
- Finally, add the following permissions to
AndroidManifest.xml
:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-dontwarn rx.internal.util.**
-dontwarn com.google.protobuf.**
-keep class fi.polar.remote.representation.protobuf.** {public private protected *;}
-keep class protocol.** {public private protected *;}
-keep class data.** {public private protected *;}
-keep class com.androidcommunications.polar.api.ble.model.** {public private protected *;}
-keep class com.androidcommunications.polar.enpoints.ble.bluedroid.host.**
See the example folder for the full project.
String DEVICE_ID
is your Polar device's id.
This is not required if you are using automatic connection.
- Import following packages.
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Function;
import polar.com.sdk.api.PolarBleApi;
import polar.com.sdk.api.PolarBleApiCallback;
import polar.com.sdk.api.PolarBleApiDefaultImpl;
import polar.com.sdk.api.errors.PolarInvalidArgument;
import polar.com.sdk.api.model.PolarAccelerometerData;
import polar.com.sdk.api.model.PolarDeviceInfo;
import polar.com.sdk.api.model.PolarEcgData;
import polar.com.sdk.api.model.PolarExerciseEntry;
import polar.com.sdk.api.model.PolarGyroData;
import polar.com.sdk.api.model.PolarHrData;
import polar.com.sdk.api.model.PolarMagnetometerData;
import polar.com.sdk.api.model.PolarOhrData;
import polar.com.sdk.api.model.PolarOhrPPIData;
import polar.com.sdk.api.model.PolarSensorSetting;
- Load the default api implementation and add callback.
// NOTICE all features are enabled, if only interested on particular feature(s) like info Heart rate and Battery info then
// e.g. PolarBleApiDefaultImpl.defaultImplementation(this, PolarBleApi.FEATURE_HR |
// PolarBleApi.FEATURE_BATTERY_INFO);
// batteryLevelReceived callback is invoked after connection
PolarBleApi api = PolarBleApiDefaultImpl.defaultImplementation(this, PolarBleApi.ALL_FEATURES);
api.setApiCallback(new PolarBleApiCallback() {
@Override
public void blePowerStateChanged(boolean powered) {
Log.d("MyApp","BLE power: " + powered);
}
@Override
public void deviceConnected(@NonNull PolarDeviceInfo polarDeviceInfo) {
Log.d("MyApp","CONNECTED: " + polarDeviceInfo.deviceId);
}
@Override
public void deviceConnecting(@NonNull PolarDeviceInfo polarDeviceInfo) {
Log.d("MyApp","CONNECTING: " + polarDeviceInfo.deviceId);
}
@Override
public void deviceDisconnected(@NonNull PolarDeviceInfo polarDeviceInfo) {
Log.d("MyApp","DISCONNECTED: " + polarDeviceInfo.deviceId);
}
@Override
public void streamingFeaturesReady(@NonNull final String identifier,
@NonNull final Set<PolarBleApi.DeviceStreamingFeature> features) {
for(PolarBleApi.DeviceStreamingFeature feature : features) {
Log.d("MyApp", "Streaming feature " + feature.toString() + " is ready");
}
}
@Override
public void hrFeatureReady(@NonNull String identifier) {
Log.d("MyApp","HR READY: " + identifier);
}
@Override
public void disInformationReceived(@NonNull String identifier, @NonNull UUID uuid, @NonNull String value) {
}
@Override
public void batteryLevelReceived(@NonNull String identifier, int level) {
}
@Override
public void hrNotificationReceived(@NonNull String identifier, @NonNull PolarHrData data) {
Log.d("MyApp","HR: " + data.hr);
}
@Override
public void polarFtpFeatureReady(@NonNull String s) {
}
});
- Request permissions if needed
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
// callback is invoked after granted or denied permissions
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
}
- Add background, foreground and cleanup functionality on desired callbacks e.g.
@Override
public void onPause() {
super.onPause();
api.backgroundEntered();
}
@Override
public void onResume() {
super.onResume();
api.foregroundEntered();
}
@Override
public void onDestroy() {
super.onDestroy();
api.shutDown();
}
- Connect to a Polar device using
api.connectToDevice(DEVICE_ID)
,
api.autoConnectToDevice(-50, null, null).subscribe()
to connect nearby device orapi.searchForDevice()
to scan and select the device
Detailed documentation: Documentation. Minimum iOS version is 12.
- Xcode 12.x
- Swift 5.x
- RxSwift 6.0 or above
If you use CocoaPods to manage your dependencies, add PolarBleSdk to your Podfile
:
# Podfile
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'PolarBleSdk', '~> 3.1'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
end
end
end
Note:
post_install
section is required in thePodfile
. CocoaPods are not yet working fluently with the XCFrameworks. The progress is followed by issue 141
If you use Cathage to manage your dependencies, add PolarBleSdk to your Cartfile
github "polarofficial/polar-ble-sdk" ~> 3.1
$ carthage update --use-xcframeworks
Not supported yet. Reported in issue 132
- PolarBLE SDK: Download the PolarBLE SDK XCFramework from polar-sdk-ios or from the releases.
- RxSwift: To use PolarBLE SDK XCFramework then you need to use RxSwift added to your project as XCFramework too.
For detailed information how to add XCFramework to XCode project, see the tutorial.
In project target settings enable Background Modes, add Uses Bluetooth LE accessories
See the example folder for the full project
deviceId
is your Polar device's id.
This is not required if you are using automatic connection.
- Import needed packages.
import PolarBleSdk
import RxSwift
- Load the default api implementation and implement desired protocols.
class MyController: UIViewController,
PolarBleApiObserver,
PolarBleApiPowerStateObserver,
PolarBleApiDeviceFeaturesObserver,
PolarBleApiDeviceHrObserver {
// NOTICE only FEATURE_HR is enabled, to enable more features like battery info
// e.g. PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: Features.hr.rawValue |
// Features.batteryStatus.rawValue)
// batteryLevelReceived callback is invoked after connection
var api = PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: Features.hr.rawValue)
var deviceId = "0A3BA92B" // TODO replace this with your device id
override func viewDidLoad() {
super.viewDidLoad()
api.observer = self
api.deviceHrObserver = self
api.powerStateObserver = self
api.deviceFeaturesObserver = self
}
func polarDeviceConnecting(_ polarDeviceInfo: PolarDeviceInfo) {
print("DEVICE CONNECTING: \(polarDeviceInfo)")
}
func polarDeviceConnected(_ polarDeviceInfo: PolarDeviceInfo) {
print("DEVICE CONNECTED: \(polarDeviceInfo)")
deviceId = polarDeviceInfo.deviceId
}
func polarDeviceDisconnected(_ polarDeviceInfo: PolarDeviceInfo) {
print("DISCONNECTED: \(polarDeviceInfo)")
}
func batteryLevelReceived(_ identifier: String, batteryLevel: UInt) {
print("battery level updated: \(batteryLevel)")
}
func hrValueReceived(_ identifier: String, data: PolarHrData) {
print("HR notification: \(data.hr) rrs: \(data.rrs)")
}
func hrFeatureReady(_ identifier: String) {
print("HR READY")
}
func streamingFeaturesReady(_ identifier: String, streamingFeatures: Set<DeviceStreamingFeature>) {
for feature in streamingFeatures {
print("Feature \(feature) is ready.")
}
}
func blePowerOn() {
print("BLE ON")
}
func blePowerOff() {
print("BLE OFF")
}
func ftpFeatureReady(_ identifier: String) {
}
}
- Connect to a Polar device using
api.connectToDevice(id)
,api.startAutoConnectToDevice(_ rssi: Int, service: CBUUID?, polarDeviceType: String?)
to connect nearby device orapi.searchForDevice()
to scan and select the device