GATT Profiles — Health Thermometer, Blood Pressure

 

GATT Profiles — Health Thermometer, Blood Pressure & BLE IoT with IPSP

Chapter 15 · Part 2 of 2 · Sections 15.10–15.16.4 · CTS · HTS · HTP · BPS · BLP · Sports Profiles · IPSP · IPv6 · 6LoWPAN

SEO Keywords

BLE Current Time Service CTS timezone notify BLE Health Thermometer Service HTS Temperature Indicate BLE Blood Pressure Service BPS Cuff Pressure Notify BLE IPSP Internet Protocol Support Profile IPv6 BLE 6LoWPAN header compression 6LN 6LBR star topology BLE IPv6 RFC 7668 Router Solicitation ICMPv6 Ping BlueZ IPSP IPv6 BLE IoT L2CAP MTU 1280

15.10 — Current Time Service (CTS) UUID 0x1805 Primary Service

Distributes the current time from a time-aware device (phone, tablet, NTP-synced gateway) to simpler devices that do not keep their own reliable clock. A practical example is a smartwatch that stays time-correct when a user travels across time zones — the phone writes the updated time and timezone offset to the watch automatically.

0x2A2B Read, Notify Mandatory

Current Time — exact date, time, and day-of-week. Can be polled or subscribed to via CCCD notification.
0x2A0F Read Optional

Local Time Information — UTC offset in 15-minute units and Daylight Saving Time offset. Tells the client how far this timezone is from UTC.
0x2A14 Read Optional

Reference Time Information — source of time (manual, NTP, GPS, cellular) and accuracy class. Lets the client decide how much to trust this time value.

15.11 — Health Thermometer Service (HTS) UUID 0x1809 Primary Service

Delivers temperature readings from a thermometer to a collector. The service is designed for healthcare and fitness applications where the collector needs both final temperature values and intermediate readings during the measurement process.

0x2A1C Indicate Mandatory

Temperature Measurement — final temperature value. Bit 0 of the flags byte selects Celsius vs Fahrenheit. Uses Indicate (not Notify) because each reading must be confirmed received.

+ CCCD (0x2902) — mandatory, enables Indication
0x2A1D Read Optional

Temperature Type — body location where temperature is measured (armpit, ear, finger, rectal, wrist, etc.) as a standardised enumeration.
0x2A1E Notify Optional

Intermediate Temperature — live temperature values while the measurement is still stabilising. Sent every 0.25 to 2 seconds. Uses Notify (not Indicate) because missing one intermediate reading is acceptable.

+ CCCD (0x2902) — enables Notification
0x2A21 Read Optional

Measurement Interval — time between successive Temperature Measurement indications.

+ CCCD + Valid Range Descriptor (defines allowed min/max interval values)
/* Enable Temperature Measurement Indications:               */
/* Find CCCD handle after char 0x2A1C:                       */
gatttool -b AA:BB:CC:DD:EE:FF --char-desc \
         --start=0x000b --end=0x0013
/* Find descriptor uuid:0x2902 → write 0x0200 to enable ind  */
gatttool -b AA:BB:CC:DD:EE:FF \
         --char-write-req --handle=0x000d --value=0200

/* Enable Intermediate Temperature Notifications:            */
/* Find CCCD for 0x2A1E → write 0x0100 to enable notify     */
gatttool -b AA:BB:CC:DD:EE:FF \
         --char-write-req --handle=0x0012 --value=0100

15.12 — Health Thermometer Profile (HTP) Uses HTS + DIS
Thermometer (GATT Server)
Performs the temperature measurement, exposes HTS and DIS. Implements GAP Peripheral role. Both HTS and DIS are mandatory.
Collector (GATT Client)
Receives temperature data from the Thermometer. Implements GAP Central role. Typically a mobile phone, tablet, or medical gateway.

15.13 — Blood Pressure Service (BPS) UUID 0x1810 Primary Service

Delivers blood pressure readings including systolic pressure, diastolic pressure, and optionally pulse rate. Uses Indication for final readings (must be confirmed) and Notification for intermediate cuff pressure values during inflation.

0x2A35 Indicate Mandatory

Blood Pressure Measurement — flags byte selects units (mmHg/kPa), followed by Systolic, Diastolic, Mean Arterial Pressure, timestamp, and optionally pulse rate.

+ CCCD (0x2902) — mandatory, enables Indication
0x2A36 Notify Optional

Intermediate Cuff Pressure — live pressure readings while the cuff is inflating and the measurement is in progress.

+ CCCD (0x2902) — enables Notification
0x2A49 Read Mandatory

Blood Pressure Feature — bitmask describing which optional features are supported (body movement detection, cuff fit detection, irregular pulse detection, etc.)

15.14 — Blood Pressure Profile (BLP) Uses BPS + DIS
Blood Pressure Sensor (GATT Server)
Measures blood pressure, exposes BPS and DIS. GAP Peripheral role. Both services are mandatory.
Collector (GATT Client)
Receives blood pressure data. GAP Central role — typically a phone or clinical monitoring device.

15.15 — Health, Sports and Fitness Profiles

Additional Profiles Using the Same GATT Pattern

These profiles all follow the same architecture as HTP and BLP — a sensor acting as GATT Server/GAP Peripheral, a collector as GATT Client/GAP Central, and one or two services with a small set of characteristics.

Profile / Service UUID What It Does
Glucose Service (GLS) 0x1808 Glucose concentration, meal context, sensor status from a glucose meter
Glucose Profile (GLP) Collector interacts with a glucose sensor using GLS
Heart Rate Service (HRS) 0x180D Heart rate measurement, body sensor location, energy expended, RR-intervals
Heart Rate Profile (HRP) Collector interacts with a heart rate sensor using HRS
Cycling Speed & Cadence Service (CSCS) 0x1816 Wheel revolution data, crank revolution data for cycling computers
Cycling Speed & Cadence Profile (CSCP) Collector interacts with a cycling sensor using CSCS
/* Heart Rate Measurement — subscribe to notifications:       */
/* HRS UUID 0x180D → HR Measurement char UUID 0x2A37         */
/* Properties = 0x10 (Notify only)                           */

/* Find HRS:                                                 */
gatttool -b AA:BB:CC:DD:EE:FF --primary --uuid=0x180D

/* Find HR Measurement characteristic:                       */
gatttool -b AA:BB:CC:DD:EE:FF \
         --characteristics --uuid=0x2A37

/* Enable notifications (write 0x0001 to CCCD):             */
gatttool -b AA:BB:CC:DD:EE:FF \
         --char-write-req --handle=0x000d --value=0100

/* Receive heart rate values continuously:                   */
gatttool -b AA:BB:CC:DD:EE:FF --listen

15.16 — Internet Protocol Support Profile (IPSP)

IPv6 Packets Over BLE — Making Sensors Part of the Internet

IPSP was introduced in BLE Specification 4.1 to bring IoT devices directly onto the Internet without intermediate protocol conversion. A BLE sensor running IPSP generates standard IPv6 packets. A smartphone acting as a BLE router forwards these packets onto the internet. Because they are already IPv6, the router performs minimal processing — it just routes them, it does not translate them.

The full specification for IPv6 over BLE transport is RFC 7668. IPSP also relies on RFC 4861 (IPv6 Neighbor Discovery) and RFC 6775 (6LoWPAN-optimised Neighbor Discovery).

Figure 15.7 — Typical IPSP Configuration: Sensor to Internet
Blood Pressure Sensor
Role: Node (6LN)
Internet Protocol Support Service
Peripheral
IPv6 Packets
BLE Link
Smartphone
Role: Router (6LBR)
Routes to Internet
Central
IPv6 Packets
Internet
Internet
Any IPv6 host

What Is IPv6 and Why BLE Needs It

IPv4 addresses are 32 bits long — theoretically 4.3 billion addresses. In practice far fewer are usable because some ranges are reserved and others were allocated to organisations without being deployed. With billions of IoT devices being added each year, IPv4 exhaustion is a real problem.

IPv6 addresses are 128 bits long. This gives approximately 3.4 × 1038 unique addresses — enough to assign a unique address to every sensor, every actuator, every device on the planet many times over. A typical IPv6 address looks like: 2001:0DB8:D3F0:0123:4567:89AB:CDEF:0001

For IPSP, each BLE device derives its 128-bit IPv6 address from its 48-bit BD_ADDR using a deterministic mapping, so no external address assignment is needed.

What Is 6LoWPAN

6LoWPAN stands for IPv6 over Low-power Wireless Personal Area Networks. IPv6 packets can be up to 65,535 bytes. BLE’s default L2CAP MTU is much smaller. 6LoWPAN solves this mismatch by:

Header Compression: IPv6 and UDP/TCP headers contain many redundant fields when communicating over BLE (because both endpoints know the addresses). 6LoWPAN strips these redundant fields, turning a 40-byte IPv6 header into as few as 2 bytes in many cases.
Fragmentation: Large IPv6 packets that do not fit in a single BLE PDU are split into fragments at the 6LoWPAN layer and reassembled at the receiver. This is separate from the L2CAP fragmentation of BLE.

6LoWPAN was originally defined for IEEE 802.15.4 networks but applies equally to BLE. RFC 7668 defines the mapping for BLE specifically.

IPSP Roles: Node and Router

Node (6LN)
Generates or consumes IPv6 packets. Runs the Internet Protocol Support Service (IPSS) so routers can discover it via GATT. Typically a BLE sensor (blood pressure monitor, thermometer, smart shoe). Usually the GAP Peripheral.
Router (6LBR — 6LoWPAN Border Router)
Routes IPv6 packets between the BLE network and the internet (or other IP networks). Performs minimal packet processing. Typically a smartphone or home gateway. Usually the GAP Central.
Figure 15.9 — Star Topology: Multiple Sensors → One Router → Internet
Smartphone (6LBR — Router)

Connected to Internet
Blood Pressure
Sensor (6LN)
Thermometer
(6LN)
Smart Watch
(6LN)
6LNs cannot talk to each other directly — all traffic goes through 6LBR

The 6LBR does not have to be connected to the internet. The 6LN devices and the 6LBR can form a private subnet — for example, a set of wearable devices communicating with each other through a smartphone hub without any external connectivity.

15.16.1–15.16.3 — IPSP Service Declaration and Requirements UUID 0x1820 (IPSS)

The Internet Protocol Support Service (IPSS) runs on the Node device and allows Routers to discover it using standard GATT service discovery. The service itself has no characteristics — its presence alone signals that this device supports IPv6 over BLE.

L2CAP connection-oriented channels: IPSP uses LE credit-based flow control at L2CAP level, not the basic ATT-based channels. This enables proper bidirectional flow control for IPv6 packet streams.
MTU of 1,280 bytes minimum: IPv6 mandates that hosts support at least 1,280-byte datagrams. IPSP requires this MTU at the L2CAP level, achieved by negotiating L2CAP credit-based channel parameters.
IPv6 address derivation: Each device derives its 128-bit IPv6 address from its 48-bit BD_ADDR using a defined mapping. No DHCPv6 or manual address assignment is needed.
Stack requirements: A device implementing IPSS needs: IPSS itself, GATT and ATT (for service discovery by the Router), GAP (for device discovery, connection, and security).
Figure 15.8 — 6LoWPAN and BLE Protocol Stack (Node vs Router)
NODE (6LN)
IPSS  |  Application
GAP  |  UDP / TCP / …
GATT  |  IPv6
ATT  |  6LoWPAN
L2CAP
HCI → Link Layer → Physical Layer
ROUTER (6LBR)
Application  |  GAP
UDP / TCP / …  |  GATT
IPv6  |  ATT
6LoWPAN
L2CAP
HCI → Link Layer → Physical Layer

15.16.4 — IPv6 Discovery Operations Over BLE

Standard IPv6 Messages Used for Network Setup

After the BLE connection is established and the IPSP L2CAP channel is set up, the node and router use standard IPv6 Neighbor Discovery Protocol (NDP) messages to configure the network. These are the same messages used in any IPv6 network — IPSP does not invent new protocols, it just carries standard IPv6 over BLE transport.

Router Solicitation (RS): Sent by a node to request that local routers transmit their network parameters. The router responds with a Router Advertisement.
Router Advertisement (RA): Sent by routers (periodically or in response to RS) to announce the network prefix, default gateway, and other link parameters. Nodes use this to configure their IPv6 address.
Neighbor Solicitation (NS): Sent by a host to discover other hosts on the link or verify that a neighbor is still reachable.
Neighbor Advertisement (NA): The response to NS — carries link-layer address and reachability information.
Redirect: Sent by a router to inform a host of a better next-hop route for a specific destination.
ICMPv6 Echo Request / Reply (Ping): Standard connectivity test. A node sends a Ping to the router or to a remote host. The echo reply confirms that the full IPv6 path — through BLE, through the router, and across the internet — is working end-to-end.
/* Test IPSP connectivity with Ping once IPv6 link is up:    */
ping6 -I hci0 fe80::xxxx:xxxx:xxxx:xxxx

/* Linux kernel 3.16+ supports 6LoWPAN BLE via BlueZ:        */
/* Load the 6LoWPAN module:                                   */
sudo modprobe bluetooth_6lowpan

/* Enable 6LoWPAN on BLE interface:                          */
echo 1 > /sys/kernel/debug/bluetooth/hci0/6lowpan_enable

/* Connect to a 6LN node (public address):                   */
echo "connect AA:BB:CC:DD:EE:FF 0" > \
  /sys/kernel/debug/bluetooth/hci0/6lowpan_control

/* Check IPv6 interface created:                             */
ip -6 addr show bt0
/* inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link            */

/* Neighbour advertisement visible in:                       */
tcpdump -i bt0 icmp6

Chapter 15 Summary — GATT-Based Profiles in Practice

GATT-based profiles demonstrate the power of the GATT model. Each profile is small and focused because all the complexity — discovery, read/write access, notification infrastructure — is already handled by ATT and GATT. A profile only has to define what data to expose.

The profiles in this chapter span the most common BLE use cases: proximity and alerting (IAS, FMP, LLS, TPS, PXP), device management (BAS, DIS), time distribution (CTS), healthcare (HTS, HTP, BPS, BLP, GLS, HRS), sports (CSCS, CSCP), and IoT networking (IPSP). All of them run on the same foundation built across Chapters 12, 13, and 14.

Leave a Reply

Your email address will not be published. Required fields are marked *