What Is This Tutorial Series?
The Telephone Bearer Service (TBS) is a Bluetooth LE GATT-based service that exposes phone call control and status over BLE. It is part of the LE Audio ecosystem and replaces the traditional Hands-Free Profile (HFP) role for LE-connected audio peripherals such as wireless earbuds, smart speakers, and conference room systems.
This tutorial series takes you from zero to a working understanding of TBS — covering the specification architecture, every characteristic, the call state machine, call control opcodes, and finally how to implement a TBS GATT server using the BlueZ Linux Bluetooth stack.
Whether you are an embedded systems engineer building a BLE audio device, a firmware developer working on headset firmware, or a Linux developer working with BlueZ, this series gives you the practical depth you need.
Who Should Read This?
Prerequisites
You should be comfortable with BLE fundamentals (GAP, GATT, ATT), have a basic understanding of C programming, and ideally have some exposure to BlueZ or a BLE stack. Understanding of GATT characteristics, descriptors, and notifications will help you get the most from Chapters 3–6.
Topics Covered in This Series
Where TBS Fits in the BLE Stack
| Phone App / VoIP App (Cellular, WhatsApp, Teams) | BLE Headset / Speaker (Client) |
| ↕ GATT Server | ↕ GATT Client |
| TBS / GTBS — Telephone Bearer Service (GATT Profile) | |
| ↕ | |
| GATT — Generic Attribute Profile | |
| ↕ | |
| ATT — Attribute Protocol | |
| ↕ | |
| L2CAP — Logical Link Control and Adaptation Protocol | |
| ↕ | |
| BLE Link Layer / HCI / Controller | |
Course Chapters
Understand why TBS was created, how it compares to HFP, and the foundational GATT concepts it builds on. Covers the two services (TBS and GTBS), application error codes, byte ordering, and all key terminology.
Deep dive into service declaration, how a phone can run multiple TBS instances for different call apps, the role of GTBS as the aggregated single-point entry, and the complete call state machine for a single call.
Covers all bearer information characteristics: Provider Name, UCI, Technology, URI Schemes Supported List, Signal Strength, Reporting Interval, and Bearer List Current Calls. Includes packet formats and BlueZ code.
Explore the characteristics that track live call status: Content Control ID (CCID), Status Flags, Incoming Call Target Bearer URI, the Call State array characteristic, and the Call_Flags bitmask that describes each active call.
The heart of TBS: how the client controls calls via the Call Control Point. Covers all six opcodes (Accept, Terminate, Local Hold, Local Retrieve, Originate, Join), CCP notification result codes, optional opcodes, Termination Reason, Incoming Call, and Call Friendly Name.
Hands-on implementation guide using the BlueZ Linux Bluetooth stack. Covers BlueZ TBS source files, registering TBS as a GATT service, implementing characteristic handlers, sending call state notifications, handling CCP writes, and testing with bluetoothctl and nRF Connect.
Ready to Master BLE Phone Call Control?
Start with Chapter 1 to build your foundation, or jump directly to the chapter relevant to your current work.
