# Bluetooth Low Energy
# Introduction
This document presents the current Bluetooth Smart (a.k.a. Bluetooth Low Energy in Bluetooth 4.0) specification for the 3rd and 4th movisens Sensor generation. This includes the Move3, EcgMove3, EdaMove3, Move4, EcgMove4, EdaMove4 and LightMove4 sensors. Earlier sensors like Move2 and ekgMove do not have a Bluetooth Low Energy functionality.
# Software Development Kits
For the Java programming language the MovisensGattLib (opens new window) provides all UUIDs of the movisens sensors and a convenient way to interpret the characteristics (e.g. MovementAcceleration, RMSSD).
If you want to use the movisens sensors with another programming langue you can still use the Java project (opens new window) as a reference about the available services and characteristics and how to interpret them.
# Other Resources
Since Windows 8 Microsoft has a good API (opens new window) for Bluetooth low energy in C++, C# and Javascript. See the example for the heart rate profile (opens new window).
# Communication with the sensor
# Live vs. Live-Buffered Signals
Most sensor signals are available in two versions:
- A live signal without buffering (e.g. Steps). These signals can be activated via GATT Notification. When the sensor is not connected to a receiving device, then data is discarded.
- A live + buffered signal with the suffix Buffered (e.g. Steps Buffered). These signals can be activated via GATT Indication. As long as the connection is established the sensor transmits data. When the sensor is disconnected, then the data is buffered (maximum 1 day) until the sensor is connected again. As soon as the connection is established and the sampling rate of the signal is reached (e.g. 60s) the sensor sends the buffered data sequentially until all samples are transfered or the connection drops.
WARNING
After a connection dropped exactly the same buffered signals have to be activated, otherwise the sensor stops sending data!
Each signal also has a caracteristic that describes how many historical data points are waiting. These characteristics have the suffix Waiting.WARNING
When a buffered data packet is received it is necessary to check that the timestamp of a received data was not already received.
# Start a Measurement
To start a new measurement, you need to do the following steps (these steps must be carried out in the given order):
- Establish a connection to the Sensor. To connect to a sensor, you can either scan for sensors or you can connect to a sensor directly by using the MAC. You can find the MAC address of a sensor by using e.g. the BLE Scanner (opens new window) Android App.
- Enable notification/indication of all characteristics you are interested in. Please read Live Signals vs. Buffered Signals.
- Write the current time in seconds to the “current_time” characteristic in the “sensor_control_service”.
- Set the Measurement Enabled characteristic in the Sensor Control Service to start a measurement. Or if you want to define the duration of the measurement start the measurement using Start Measurement characteristic.
- Set the Save Energy characteristic in the Sensor Control Service to put the connection into energy saving mode.
# Available Signals per Sensor
The following table describes which sensor type records or transmits which signals.
WARNING
The table shows the signals that are available in Firmwares of version 1.15.0. Earlier versions may not include all signals.
Legend:
Name | Type | Samplerate [Hz] | EcgMove 3 | Move 3 | LightMove 3 | EdaMove 3 | Move 4 | EcgMove 4 | LightMove 4 | EdaMove 4 |
---|---|---|---|---|---|---|---|---|---|---|
acc | Signal | 64 Hz | ||||||||
angularRate | Signal | 64 Hz | ||||||||
bodyPosition_live | Signal | 1/60 Hz | ||||||||
bpmBxb_live | ValueList | 1024 Hz | ||||||||
charging | Signal | 1/60 Hz | ||||||||
ecg | Signal | 1024 Hz | ||||||||
eda | Signal | 32 Hz | ||||||||
edaSclMean_live | Signal | 1/60 Hz | ||||||||
hr_live | Signal | 1/60 Hz | ||||||||
hrvIsValid_live | Signal | 1/60 Hz | ||||||||
hrvRmssd_live | Signal | 1/60 Hz | ||||||||
light | Signal | 1 Hz | ||||||||
lightMean_live | Signal | 1/60 Hz | ||||||||
marker | EventList | 64 Hz | ||||||||
met_live | Signal | 1/60 Hz | ||||||||
metLevel_live | Signal | 1/60 Hz | ||||||||
movementAcceleration_live | Signal | 1/60 Hz | ||||||||
nn_live | ValueList | 1024 Hz | ||||||||
press | Signal | 8 Hz | ||||||||
stateOfCharge | Signal | 1/60 Hz | ||||||||
stepCount_live | Signal | 1/60 Hz | ||||||||
temp | Signal | 1 Hz | ||||||||
tempMean_live | Signal | 1/60 Hz | ||||||||
timeDeviation | ValueList | 1 Hz |
# Services and Characteristics
# Services
# Ambient
UUID: d0f0f790-66c9-4e1f-bf48-1628a7ad89f9Characteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Light | Ambient light (clear, ir) | 375bf82c-41e8-4ca1-9b95-f8634b1ba2f8 | uint32 clear uint32 ir | read notify |
Light Buffered | Buffered ambient light (clear, ir) samplerate is 0.016666666666666666 Hz time:
len:
| 7e5dd77b-67b7-42dd-be7a-822373391b2f | uint32 time uint8 len uint32 clear[1] uint32 ir[1] ... uint32 clear[len] uint32 ir[len] | indicate |
Light RGB | Ambient light (red, green, blue) | db32d0ca-fda0-4298-9d2f-1b109eb95a2f | uint32 red uint32 green uint32 blue | read notify |
Light RGB buffered | Buffered ambient light (red, green, blue) samplerate is 0.016666666666666666 Hz time:
len:
| 2c4abbf8-8da6-4e47-afcd-18034d67c5ee | uint32 time uint8 len uint32 red[1] uint32 green[1] uint32 blue[1] ... uint32 red[len] uint32 green[len] uint32 blue[len] | indicate |
Light RGB waiting | Number of light samples waiting. | c758f5a6-516d-4125-b8de-ae3ebcabeabc | uint32 samplesWaiting | read |
Light Waiting | Number of light samples waiting. | d166790b-9531-44fd-8314-14f303280de1 | uint32 samplesWaiting | read |
Sensor Temperature | Temperature measured inside the sensor housing temperature:
| 2c007893-37a4-473d-8c07-09c41324eea5 | uint16 temperature | read notify |
Sensor Temperature Buffered | Buffered temperature measured inside the sensor housing samplerate is 0.016666666666666666 Hz time:
len:
temperature:
| 869c06de-f52a-4a90-9a3a-ca5fd35d6707 | uint32 time uint8 len uint16 temperature[1] ... uint16 temperature[len] | indicate |
Sensor Temperature Waiting | Number of temp_mean samples waiting. | 433a8af8-9839-4057-94aa-ef02fa0af106 | uint32 samplesWaiting | read |
# Eda
UUID: eb08670d-f244-4511-b43e-04bba968b693Characteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Eda Scl Mean | eda_scl_mean edaSclMean:
| a884dc4b-62d6-44ee-bcbf-d0f725d95213 | uint16 edaSclMean | read notify |
Eda Scl Mean Buffered | Buffered eda_scl_mean samplerate is 0.016666666666666666 Hz time:
len:
edaSclMean:
| 663af1bc-2fa0-43c0-b452-2b8c1efb7f9d | uint32 time uint8 len uint16 edaSclMean[1] ... uint16 edaSclMean[len] | indicate |
Eda Scl Mean Waiting | Number of eda_scl_mean samples waiting. | 47755955-966e-4b75-b79b-ef5c839cb191 | uint32 samplesWaiting | read |
# Hrv
UUID: 0bd51666-e7cb-469b-8e4d-2742f1ba77cdCharacteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Hr Mean | hr_mean hrMean:
| 3b999d71-751b-48fa-8817-b7131f47c2da | int16 hrMean | read notify |
Hr Mean Buffered | hr_mean samplerate is 0.016666666666666666 Hz time:
len:
hrMean:
| 1d9533d1-8c6e-4b6a-b242-d0713be204f0 | uint32 time uint8 len int16 hrMean[1] ... int16 hrMean[len] | indicate |
Hr Mean Waiting | Number of hr_mean samples waiting. | c806ec67-00be-490a-aa79-1011396f38e8 | uint32 samplesWaiting | read |
Hrv Is Valid | hrv_is_valid | 5d9724de-501e-475f-b8e6-d0e77ea4d0c1 | boolean hrvIsValid | read notify |
Hrv Is Valid Buffered | Buffered hrv_is_valid samplerate is 0.016666666666666666 Hz time:
len:
| 0524f2f1-d8da-4ef6-9e3b-43d6ed0ec518 | uint32 time uint8 len boolean hrvIsValid[1] ... boolean hrvIsValid[len] | indicate |
Hrv Is Valid Waiting | Number of hrv_is_valid samples waiting. | b2734e22-5c9e-476c-a317-d3fb706df00c | uint32 samplesWaiting | read |
Rmssd | rmssd rmssd:
| f89edec1-9fea-e145-f614-8ff69aa7da66 | int16 rmssd | read notify |
Rmssd Buffered | Buffered rmssd samplerate is 0.016666666666666666 Hz time:
len:
rmssd:
| 1bc36d57-595b-499e-8f2a-fa2275bcabc3 | uint32 time uint8 len int16 rmssd[1] ... int16 rmssd[len] | indicate |
Rmssd Waiting | Number of rmssd samples waiting. | f89edec0-b569-ee0d-9589-e4abd1f42693 | uint32 samplesWaiting | read |
# Marker
UUID: 32062bba-7843-4ad6-94ea-95c66909edcfCharacteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Tap Marker | Marker set by the user by tapping the sensor. | 207b171c-d7a5-48ef-8e60-6ccb5f0993f4 | uint32 tapMarker | read notify |
# Movisens Battery
UUID: 27b66685-62e5-4e76-8c02-d625600ed2c6Characteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Battery Level Buffered | Buffered battery level. samplerate is 0.016666666666666666 Hz time:
len:
level:
| c7538ae7-b2ec-4905-8ebc-4a0581df4335 | uint32 time uint8 len uint8 level[1] ... uint8 level[len] | indicate |
Battery Level Waiting | Number of battery level values in the buffer. | f84adb7d-a503-44d4-88ba-8583b981b5b2 | uint32 samplesWaiting | read |
Charging | True if the sensor is currently charging. | d34f2d52-5fcd-491c-b782-6b84e439687e | boolean charging | read notify |
Charging Buffered | Buffered charging. samplerate is 0.016666666666666666 Hz time:
len:
| 601d030e-b067-4f80-9a36-09aa9fb21670 | uint32 time uint8 len boolean charging[1] ... boolean charging[len] | indicate |
Charging Waiting | Number of charging samples waiting. | c1432e2e-aa2e-456b-9c4f-c16ddc449371 | uint32 samplesWaiting | read |
# Movisens User Data
UUID: 17e28d0f-5f44-421f-97d5-667655e24460Characteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Age Float | Age of the User in years as decimal number. age:
| 7562060b-4aff-4422-aec7-77770d2a0530 | float32 age | read write |
Sensor Location | The location at which the user wears the sensor. sensorLocation is one of:
| 1ffb6b9d-52a7-4de2-a3bb-58ee97facd59 | uint8 sensorLocation | read write |
# Physical Activity
UUID: 0302c2b2-ce64-4542-b819-666d20d415bdCharacteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Body Position | the position of the users body. Needs characteristic sensor_location to be set in user_data service! bodyPosition is one of:
| 2abf95be-7496-4e72-b880-f9f00aad553b | uint8 bodyPosition | read notify |
Body Position Buffered | Buffered position of the users body. Needs characteristic sensor_location to be set in user_data service! samplerate is 0.016666666666666666 Hz time:
len:
bodyPosition is one of:
| fda6f11e-a1d0-41da-b611-5ab3ec34f6ca | uint32 time uint8 len uint8 bodyPosition[1] ... uint8 bodyPosition[len] | indicate |
Body Position Waiting | Number of body_position samples waiting. | 8fbffb12-23ed-498b-b19c-9c9a67f14b75 | uint32 samplesWaiting | read |
Inclination | Inclination of the sensor x:
y:
z:
| e165b5d0-d83f-4a5c-86a6-306ca1ddf0ef | uint8 x uint8 y uint8 z | read notify |
Inclination Buffered | Buffered inclination samplerate is 0.016666666666666666 Hz time:
len:
x:
y:
z:
| f89edebf-9b5b-486d-054f-b3ce3e226d49 | uint32 time uint8 len uint8 x[1] uint8 y[1] uint8 z[1] ... uint8 x[len] uint8 y[len] uint8 z[len] | indicate |
Inclination Waiting | Number of inclination samples waiting. | f89edeb8-dda5-770a-e42d-005ed49f5e29 | uint32 samplesWaiting | read |
Met | Current value of met (metabolic equivalent of task).
| 088133e4-bf36-4c10-943a-17e07734d4ba | uint16 met | read notify |
Met Buffered | Buffered met. samplerate is 0.016666666666666666 Hz time:
len:
| 82e947c3-48a2-4106-8536-b3bdc6b10453 | uint32 time uint8 len uint16 met[1] ... uint16 met[len] | indicate |
Met Level | Number of seconds the users met value was at one of the met levels (sedentary, light, moderate, vigorous)
sedentary:
light:
moderate:
vigorous:
| 114dc370-a5d0-4d86-a701-030282a0a271 | uint8 sedentary uint8 light uint8 moderate uint8 vigorous | read notify |
Met Level Buffered | Buffered met level. samplerate is 0.016666666666666666 Hz time:
len:
sedentary:
light:
moderate:
vigorous:
| 7ba991c9-dfa6-4776-9002-6c9696f90e14 | uint32 time uint8 len uint8 sedentary[1] uint8 light[1] uint8 moderate[1] uint8 vigorous[1] ... uint8 sedentary[len] uint8 light[len] uint8 moderate[len] uint8 vigorous[len] | indicate |
Met Level Waiting | Number of met level samples waiting. | 547729db-1f9b-422f-a581-ea377ffcadf9 | uint32 samplesWaiting | read |
Met Waiting | Number of met samples waiting. | e19aa0f5-da3d-4dbf-a4a2-6e8ad6c4d0ce | uint32 samplesWaiting | read |
Movement Acceleration | movement_acceleration movementAcceleration:
| d48d48e3-318f-4a11-8dd2-cb4a9051534f | int16 movementAcceleration | read notify |
Movement Acceleration Buffered | buffered movement_acceleration samplerate is 0.016666666666666666 Hz time:
len:
movementAcceleration:
| 9e2da811-041a-43ce-b703-013277f19ae6 | uint32 time uint8 len int16 movementAcceleration[1] ... int16 movementAcceleration[len] | indicate |
Movement Acceleration Waiting | Number of movement_acceleration samples waiting. | 20b6f034-50e5-4fad-92c8-fa20ee4203c6 | uint32 samplesWaiting | read |
Steps | steps | 8ba3207b-6a87-424d-bde0-4f665f500f04 | uint16 steps | read notify |
Steps Buffered | buffered steps samplerate is 0.016666666666666666 Hz time:
len:
| 58c6374e-9927-414a-b90e-475014af65ba | uint32 time uint8 len uint16 steps[1] ... uint16 steps[len] | indicate |
Steps Waiting | Number of steps samples waiting. | 9b72b459-d1e5-48fe-9c91-2fb168261b21 | uint32 samplesWaiting | read |
# Respiration
UUID: da87d1a7-749c-4711-bd54-c625043ecd83Characteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Respiratory Movement | aaabeb9a-abed-4a17-a764-0aaf0ac808fe | int16 values | read notify |
# Sensor Control
UUID: f89edeb6-e4e8-928b-4cfa-ebc07fce1768Characteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Activated Buffered Characteristics | f1cc0780-95e8-4a93-a1d1-6cfac6641b24 | read | ||
Command Result | Result of the last command. error is one of:
| 3cd05e3a-4e2c-4d6c-bee8-f02ffdbc32ea | uint8 error | read notify |
Current Time | Deprecated! Use current_time_ms instead. A number representing the seconds elapsed between 1 January 1970 00:00:00 UTC and the given date in UTC. Must be set before the Measurement is Enabed. | f89edec4-d590-764d-530f-8fff5c181606 | stime currentTime | read write |
Current Time Ms | A number representing the milliseconds elapsed between 1 January 1970 00:00:00 UTC and the given date in UTC. Must be set before the Measurement is Enabed. | 8f717cee-030c-4628-9d76-4e3fd9d74fb6 | mstime time | read write |
Custom Data | Custom data to store general purpose data. | 0086b101-7f7d-4249-bfae-1999065a68c2 | read write | |
Data Available | Returns true if measurement data is available on the sensor. | 10847e7a-d43f-4b9e-b2f2-3e8546215c3c | boolean dataAvailable | read notify |
Delete Data | If set to 1, data of the last measurement is deleted and the next measurement can be started. | f89edec2-9fc2-c29e-ff29-da323b327e44 | boolean deleteData | write |
Measurement Enabled | Must be set to 1 to start a measurement. If the recording stopped the value will be changed and notified as 0. | f89edec7-f7e0-94f2-747d-ee7acaa6d412 | boolean measurementEnabled | read write notify |
Measurement Start Time | Start time of the current measurement or 0 if no measurement is currently active. Time is given in UTC and is represented by milliseconds elapsed since 1 January 1970 00:00:00 UTC. | 2d81487d-08f7-47e1-a060-0659d9b4b766 | mstime time | read |
Measurement Status | status is one of:
| 66f1e70e-54ab-489c-8f5d-0008b67553c7 | uint8 status | read notify |
Save Energy | Must be set to 1 to put the connection into energy saving mode (Recommended after configuration is done). As soon as a new connection is established the save energy mode must be enabled again. | f89edebf-9b5b-486d-054f-b3ce3e226d42 | boolean saveEnergy | write |
Send Buffered Data | If set to 1 and buffered data is available the sensor sends out the data. | 8b7446a0-372a-4841-aa5e-3b97d30a45b3 | boolean sendBufferedData | write |
Start Measurement | send to start a measurement and set duration of measurement in seconds | 5936ef92-62e4-4759-9041-d3461130a4b5 | uint32 duration | write |
Status | Status of the sensor. | f89edec9-b0e0-d44f-45e8-d125177194d5 | uint8 status | read |
Storage Level | The current level of storage used. 100% means that all free space is used (storage full) while 0% means that the whole storage capacity is available. level:
| 8be8b5f3-03fe-4598-96b8-994e41f33979 | uint8 level | read notify |
Time Zone Id | Time zone id of the zone in which the sensor was or will be started | 8c3adbfa-9218-419e-b809-6de9918ba8d5 | timezone zoneId | read write |
Time Zone Offset | Time zone offset in seconds from UTC in which the sensor was or will be started.
| b9b5bd3a-475c-43a6-b25e-bc706eb016ca | int32 zoneOffset | read write |
# Skin Temperature
UUID: 247af432-444c-4211-8b9d-2c8512cfdf4aCharacteristic | Description | Address | Format | Permissions |
---|---|---|---|---|
Skin Temperature | temperature temperature:
| f89edec6-a336-5262-448d-400ca97a1c57 | int16 temperature | read notify |
Skin Temperature 1s Buffered | samplerate is 1.0 Hz time:
len:
temperature:
| 99ebde23-1b3e-4084-85c2-18bca6eb5a1a | uint32 time uint8 len int16 temperature[1] ... int16 temperature[len] | indicate |
Skin Temperature Buffered | samplerate is 0.016666666666666666 Hz time:
len:
temperature:
| 78663ddf-83c3-4665-9d04-003c990acf78 | uint32 time uint8 len int16 temperature[1] ... int16 temperature[len] | indicate |
Skin Temperature Waiting | Number of temperature samples waiting. | f89edeb7-0d8c-b529-baef-2f9ab82f6cc6 | uint32 samplesWaiting | read |