BLE Audio Coordination — Common Audio Profile & Coordinated Set Identification

 

CAP & CSIPS
BLE Audio Coordination — Common Audio Profile & Coordinated Set Identification
🎧
Earbud Sync
🔗
Set Coordination
📻
CAP Procedures
🔑
SIRK & RSI

Key Terms in This Post
CAP CSIPS CSIS BAPS Coordinated Set RSI SIRK Set Member Rank Ordered Access Initiator Acceptor Commander BlueZ BLE Audio

Why CAP and CSIPS Exist

BLE Audio introduced a rich set of specifications collectively called the Generic Audio Framework (GAF). The core workhorse specs — BASS, PACS, ASCS and BAP — handle stream creation and codec negotiation at a granular level. They are deliberately generic so they can cover any audio use case, from hearing aids to conference room speakers.

But that flexibility creates a new problem: how does a phone know the exact right sequence of steps to stream music to a pair of earbuds? Those earbuds are two completely independent Bluetooth devices. Left and right need to switch sources together, apply volume together, and be discovered as a group. Nothing in BAPS alone solves this.

That is precisely the gap that CAP (Common Audio Profile) and CSIPS (Coordinated Set Identification Profile and Service) fill. CSIPS gives a group of devices a shared identity so they can be discovered and treated as one unit. CAP then defines the exact ordered procedure for every common audio action — stream setup, volume change, broadcast — using that group identity.

Think of it this way: if BAPS specifications are the raw ingredients in a kitchen, CAP is the recipe book that tells you the exact quantity, order and technique for every dish.

BLE Audio Generic Audio Framework — Where CAP Sits
+————————————————————-+ | APPLICATION LAYER (HAP, TMAP, PBP …) | +————————————————————-+ | CAP – Common Audio Profile (the “recipe book”) | | Ties together all GAF specs into ordered procedures | +——————–+——————–+——————-+ | BAP | VCP | MICP / MCP | | (Audio Streams) | (Volume Control) | (Mic / Media) | +——————–+——————–+——————-+ | CSIPS – Coordinated Set Identification Profile/Service | | Binds multiple devices into one logical group | +————————————————————-+ | GATT / ATT — GAP — LE Link Layer | +————————————————————-+

Section 1 — CSIPS: The Glue Between Multiple Devices

1.1 The Earbud Problem

Every true-wireless earbud solution before BLE Audio used a vendor-proprietary method to coordinate left and right earbuds — often a secondary Bluetooth link between the buds, or a master-slave relay. This meant you could not mix earbuds from two different manufacturers, and interoperability was impossible.

BLE Audio standardises this with the concept of a Coordinated Set. A Coordinated Set is simply a group of two or more BLE devices that need to behave as one unit for a specific purpose. The specification is not limited to audio — it could equally bind a pair of ECG patches or a set of industrial sensors — but the primary driver is the earbud use case.

What coordination actually delivers for earbuds:

  • Discovering left + right as members of the same set
  • Applying volume and mute simultaneously to both
  • Ensuring both switch their audio source at the same time (e.g., phone call interrupts music)
  • Locking exclusive access to prevent another device grabbing one earbud mid-stream
1.2 CSIPS Roles

CSIPS defines exactly two roles:

CSIPS Role Definitions
Role Who Plays It Responsibility
Set Member Each earbud / Acceptor device Advertises RSI, exposes CSIS characteristics. Passive — just declares group membership.
Set Coordinator Phone / Initiator or Commander Discovers all Set Members, collects their identities, and passes that knowledge to higher procedures like CAP.

The Set Member role is deliberately passive — a device simply states it belongs to a set. All the active work of discovery and bookkeeping belongs to the Set Coordinator.

1.3 RSI — Resolvable Set Identity

Every Set Member must include an RSI AD Type in its advertising payload. RSI is a 6-byte pseudo-random value that changes periodically, similar to how Resolvable Private Addresses (RPAs) work at the device address level.

The rotating nature of the RSI prevents passive tracking — a sniffer cannot correlate advertisements across time to deduce that the same earbud is always nearby. Only a device that holds the SIRK (see below) can decode and verify that two different RSI values belong to the same set.

RSI in BLE Advertisement Payload
AD Structure inside LE Advertisement: +——–+——-+———————————————-+ | Length | Type | Value | +——–+——-+———————————————-+ | 0x07 | 0x2E | RSI[0] RSI[1] RSI[2] RSI[3] RSI[4] RSI[5] | +——–+——-+———————————————-+ ^ AD Type 0x2E = Resolvable Set Identifier RSI = hash(SIRK, prand) — changes periodically SIRK = fixed 128-bit key shared across all members of the set
1.4 SIRK — Set Identity Resolving Key

The SIRK is a 128-bit secret key that is common to every member of a Coordinated Set and is burned in at manufacture. It serves two purposes:

  1. Set verification — a coordinator reads the SIRK from each candidate device and compares values. Matching SIRKs = same set.
  2. RSI decoding — the coordinator uses the SIRK to resolve RSI values, confirming a device belongs to the already-known set even before connecting.

Because the SIRK does not change for the lifetime of the device, there is a natural challenge when replacing a broken earbud: the replacement unit must somehow receive the same SIRK as the surviving earbud. BLE Audio does not specify how to do this — manufacturers must design their own provisioning or pairing ceremony for that scenario.

SIRK Transmission During Bonding
Phone (Set Coordinator) Left Earbud (Set Member) | | |— LE Connect + Pair + Bond —->| |<— Encrypted Link established –| | | |— Read SIRK Characteristic —->| |<— SIRK value (128-bit) ——–| | | |— Read Coordinated Set Size —>| |<— Size = 2 ——————-| | | [Phone now knows: set has 2 members, stores SIRK] [Begins Set Member Discovery for right earbud]
1.5 Set Member Discovery Procedure

Once the coordinator has the SIRK and knows the set size, it runs the Set Members Discovery Procedure to find all remaining members. The algorithm works like this:

Set Member Discovery — Flow
START | v Scan for advertising devices with RSI AD Type (0x2E) | v Found device with RSI? —-NO—-> [Keep scanning / timeout?] | | YES [Timeout → proceed with found members] | v Connect + Pair + Bond with candidate | v Read SIRK characteristic from candidate | v SIRK == known SIRK? —-NO—-> Discard pairing, resume scan | YES | v Mark device as verified Set Member | v All members found? —-NO—-> Continue scanning | YES | v END — Full Coordinated Set assembled

Important edge cases:

  • If discovery times out (typically ~10 seconds), the coordinator can still proceed with whatever members it found — it must keep attempting to find missing members in the background.
  • Devices that advertise RSI but have a different SIRK are members of a different Coordinated Set and must be ignored.

1.6 CSIS Characteristics — All Four Must Be Present

Any device that is part of a Coordinated Set and works with CAP must implement all four CSIS characteristics. Below is the full picture:

CSIS Characteristic Summary
Characteristic UUID Mandatory Properties Optional Purpose
SIRK 0x2B84 Read Notify 128-bit key used to identify and verify set membership
Coordinated Set Size 0x2B85 Read Notify Total number of members in this Coordinated Set
Set Member Lock 0x2B86 Read, Write, Notify None Grants exclusive access to a client; prevents other coordinators from interfering
Set Member Rank 0x2B87 Read Notify Unique integer within the set; controls order of Lock acquisition in Ordered Access procedure

⚠️ Note: Even though no current CAP procedure actively triggers Set Member Lock or Rank on the coordinator side, both characteristics are mandatory to implement on the Acceptor if you are shipping CAP-compliant products. The Lock is available for application-layer use, and Rank is critical for the Ordered Access procedure.

1.7 Set Member Lock and the Ordered Access Procedure

Set Member Lock allows a coordinator to claim temporary exclusive ownership of a device. Once locked, other coordinators cannot run procedures on that Acceptor. When the coordinator finishes its work, it must release the Lock promptly.

Why Rank exists — the race condition problem: Imagine two phones simultaneously trying to lock the same pair of earbuds. Phone A locks the left earbud, Phone B locks the right earbud. Now both phones are stuck — Phone A cannot get the right earbud, Phone B cannot get the left. This is a classic distributed systems deadlock.

The Ordered Access Procedure prevents this by mandating that all coordinators acquire Locks in strictly ascending Rank order:

Ordered Access — Lock Acquisition Protocol
Before running any CAP procedure on a Coordinated Set: Step 1: Read Rank of all known Set Members Left Earbud → Rank = 1 Right Earbud → Rank = 2 Step 2: Check Lock status of Rank-1 member first Is Left Earbud locked by another client? YES → Wait / retry NO → Proceed Step 3: Write Lock = LOCKED on Rank-1 member Then write Lock = LOCKED on Rank-2 member (always ascending order) Step 4: Run the CAP procedure on BOTH members Step 5: Release Lock on all members Write Lock = RELEASED on both earbuds RESULT: No deadlock possible — all coordinators always acquire locks in the same order.

CAP uses the Ordered Access procedure as a mandatory precursor to all its own procedures whenever a Coordinated Set is involved. It checks for existing locks, and only after confirming all members are free does it proceed — applying the procedure to each member in ascending Rank order.

Section 2 — CAP: The Common Audio Profile

CAP is the top-level orchestrator of BLE Audio. It does not define new transport mechanisms or codecs — all of that lives in BAPS. Instead, CAP defines five families of procedures that combine BAPS, CSIPS, VCP, MICP and MCP in the correct order and with the correct parameters for every common audio use case.

Higher-level profiles like HAP (Hearing Aid Profile), TMAP (Telephony and Media) and PBP (Public Broadcast Profile) all build on top of CAP — they simply narrow down CAP’s options for their specific use case and add role-specific requirements.

2.1 The Three CAP Roles

CAP formally defines the three roles used throughout BLE Audio:

CAP Role Overview
Role Typical Device Audio Stream Involvement Key Capability
Initiator Smartphone, laptop Yes — creates and manages unicast streams Sets up, modifies and releases audio streams to Acceptors
Acceptor Earbuds, hearing aids, speakers Yes — renders or captures audio Exposes capabilities and accepts stream configurations
Commander Smartphone, audio controller No — does not carry audio itself Manages broadcast sources; delegates Acceptors to receive broadcast streams; elevates broadcast beyond simple one-way casting

The Commander role is what makes broadcast audio genuinely powerful. Without it, a broadcast source just transmits and any device passively tunes in. With a Commander, a phone can actively direct which earbuds should connect to which broadcast source, coordinate their scanning behaviour, and manage the whole experience.

2.2 CAP Component Matrix — What Each Role Must Support

CAP specifies exactly which GAF components are mandatory (M), optional (O), conditional (C), or excluded (X) for each role. The table below is a simplified view of the most important entries:

CAP Specification Component Matrix (Simplified)
GAF Component Acceptor Initiator Commander
BAP Broadcast Assistant X (excluded) O (optional) C (conditional)
BAP Scan Delegator C (conditional) X (excluded) C (conditional)
VCP Volume Controller X (excluded) — (out of scope) C (conditional)
VCP Volume Renderer O (optional) X (excluded) X (excluded)
CSIS Set Member C (conditional) — (out of scope) — (out of scope)
CSIS Set Coordinator — (out of scope) C (conditional) C (conditional)

M=Mandatory, O=Optional, C=Conditional (required for specific feature combos), X=Excluded, —=Outside CAP scope

Conditional means: if you implement feature A, then feature B becomes mandatory. For example, if an Acceptor is part of a Coordinated Set, it must implement the CSIS Set Member role. The full rules are in Table 3.1 of the CAP specification.

2.3 The Five CAP Procedure Families

CAP organises all BLE Audio actions into five logical groups. Each group defines a precise sequence of operations drawn from BAPS and CSIPS:

CAP Procedure Families
Procedure Family What It Does Key Specs Invoked
Unicast Audio Procedures Set up, update, and release point-to-point audio streams between Initiator and Acceptors BAP, ASCS, PACS, CSIPS
Broadcast Audio Procedures Start, modify and stop one-to-many broadcast audio; Commander directs Acceptors to tune in BAP, BASS, CSIPS
Volume Control Procedures Set absolute volume or change relative volume on one or all Coordinated Set members simultaneously VCP, CSIPS
Microphone Control Procedures Mute / unmute microphone inputs across multiple Acceptors in a coordinated manner MICP, CSIPS
Media and Call Control Pause, play, skip tracks; accept, hold or terminate calls across connected Acceptors MCP, CCP, CSIPS

Section 3 — BlueZ: CSIS and CAP in Practice

3.1 BlueZ Source Layout for CSIS

BlueZ implements CSIS support inside the profiles/audio/ directory. The GATT service and its characteristics are registered through the D-Bus interface. Here is the general layout:

bluez/
├── profiles/
│   └── audio/
│       ├── csis.c         ← Coordinated Set Identification Service
│       ├── csis.h
│       ├── cap.c          ← Common Audio Profile orchestration
│       ├── cap.h
│       └── media.c        ← Media/audio stream handling
├── src/
│   └── shared/
│       ├── csis.c         ← GATT client-side CSIS parsing
│       └── csis.h

When BlueZ registers a CSIS server (Set Member role), it creates a GATT service with the four mandatory characteristics. When acting as a Set Coordinator, the client-side code reads these characteristics after bonding and uses them to verify set membership.

3.2 Reading CSIS Characteristics via bluetoothctl

If you have a BLE Audio device that implements CSIS, you can explore its characteristics manually using bluetoothctl. After connecting and pairing:

# Connect to the earbud
[bluetooth]# connect AA:BB:CC:DD:EE:FF

# Enter the GATT menu
[bluetooth]# menu gatt

# List all attributes — look for CSIS UUIDs
[bluetooth]# list-attributes

# Example output — CSIS service at handle 0x0040
# Primary Service (Handle 0x0040)
#   UUID: 00001846-0000-1000-8000-00805f9b34fb  ← CSIS Service
#
# Characteristic (Handle 0x0042)
#   UUID: 00002b84-0000-1000-8000-00805f9b34fb  ← SIRK
# Characteristic (Handle 0x0044)
#   UUID: 00002b85-0000-1000-8000-00805f9b34fb  ← Coordinated Set Size
# Characteristic (Handle 0x0046)
#   UUID: 00002b86-0000-1000-8000-00805f9b34fb  ← Set Member Lock
# Characteristic (Handle 0x0048)
#   UUID: 00002b87-0000-1000-8000-00805f9b34fb  ← Set Member Rank

# Read Coordinated Set Size
[bluetooth]# select-attribute /org/bluez/hci0/dev_AA_BB_CC_DD_EE_FF/service0040/char0044
[bluetooth]# read
# Output: 02   ← Set has 2 members

# Read Rank
[bluetooth]# select-attribute /org/bluez/hci0/dev_AA_BB_CC_DD_EE_FF/service0040/char0048
[bluetooth]# read
# Output: 01   ← This is Rank 1 (left earbud)
3.3 Python D-Bus: CSIS Set Member Discovery Skeleton

The following Python skeleton shows the conceptual structure of a Set Coordinator discovering and validating members of a Coordinated Set using BlueZ D-Bus APIs:

#!/usr/bin/env python3
"""
CSIS Set Member Discovery — BlueZ D-Bus conceptual skeleton
Demonstrates the Set Members Discovery Procedure logic.

Requires: python-dbus, BlueZ 5.70+ with BLE Audio support
"""

import dbus
import dbus.mainloop.glib
from gi.repository import GLib

BLUEZ_SERVICE  = "org.bluez"
ADAPTER_PATH   = "/org/bluez/hci0"
DBUS_OM_IFACE  = "org.freedesktop.DBus.ObjectManager"
GATT_CHR_IFACE = "org.bluez.GattCharacteristic1"

# CSIS Characteristic UUIDs
SIRK_UUID      = "00002b84-0000-1000-8000-00805f9b34fb"
SET_SIZE_UUID  = "00002b85-0000-1000-8000-00805f9b34fb"
LOCK_UUID      = "00002b86-0000-1000-8000-00805f9b34fb"
RANK_UUID      = "00002b87-0000-1000-8000-00805f9b34fb"

class CSISCoordinator:
    def __init__(self, bus):
        self.bus = bus
        self.om  = dbus.Interface(
            bus.get_object(BLUEZ_SERVICE, "/"),
            DBUS_OM_IFACE
        )
        self.known_sirk    = None   # Set after first member is read
        self.set_size      = 0
        self.members_found = []     # List of verified set member paths

    def read_characteristic(self, dev_path, uuid):
        """Find and read a GATT characteristic by UUID under a device path."""
        objects = self.om.GetManagedObjects()
        for path, ifaces in objects.items():
            if not path.startswith(dev_path):
                continue
            chr_iface = ifaces.get(GATT_CHR_IFACE, {})
            if chr_iface.get("UUID") == uuid:
                char_obj = self.bus.get_object(BLUEZ_SERVICE, path)
                char     = dbus.Interface(char_obj, GATT_CHR_IFACE)
                return bytes(char.ReadValue({}))
        return None

    def verify_and_register_member(self, dev_path):
        """
        After bonding, read SIRK and compare to known value.
        If match → register as verified Set Member.
        """
        sirk_bytes = self.read_characteristic(dev_path, SIRK_UUID)
        if sirk_bytes is None:
            print(f"[!] {dev_path}: No SIRK found, not a CSIS device")
            return False

        if self.known_sirk is None:
            # First member — establish the reference SIRK
            self.known_sirk = sirk_bytes
            size_bytes = self.read_characteristic(dev_path, SET_SIZE_UUID)
            self.set_size = size_bytes[0] if size_bytes else 1
            rank_bytes = self.read_characteristic(dev_path, RANK_UUID)
            rank = rank_bytes[0] if rank_bytes else 0
            print(f"[+] First member found. Set size={self.set_size}, Rank={rank}")
            self.members_found.append({"path": dev_path, "rank": rank})
            return True

        if sirk_bytes == self.known_sirk:
            rank_bytes = self.read_characteristic(dev_path, RANK_UUID)
            rank = rank_bytes[0] if rank_bytes else 0
            print(f"[+] Member verified! Path={dev_path}, Rank={rank}")
            self.members_found.append({"path": dev_path, "rank": rank})
            return True
        else:
            print(f"[-] SIRK mismatch — different Coordinated Set, discarding")
            return False

    def is_set_complete(self):
        return len(self.members_found) >= self.set_size

    def get_ordered_members(self):
        """Return members sorted by ascending Rank — for Ordered Access."""
        return sorted(self.members_found, key=lambda m: m["rank"])

    def acquire_locks_ordered(self):
        """
        Ordered Access Procedure:
        Acquire Set Member Lock on each member in ascending Rank order.
        Prevents deadlock when multiple coordinators compete.
        """
        ordered = self.get_ordered_members()
        for member in ordered:
            lock_bytes = self.read_characteristic(member["path"], LOCK_UUID)
            if lock_bytes and lock_bytes[0] == 0x02:  # 0x02 = Locked by another client
                print(f"[!] Rank {member['rank']} already locked — cannot proceed")
                return False
            # Write 0x01 = Lock
            # (write omitted here — requires WriteValue D-Bus call)
            print(f"[+] Locked Rank {member['rank']}")
        return True

# --- Main ---
if __name__ == "__main__":
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    bus = dbus.SystemBus()
    coordinator = CSISCoordinator(bus)
    print("CSIS Set Coordinator initialised.")
    print("Connect + pair with devices and call coordinator.verify_and_register_member(path)")
3.4 BlueZ btmgmt — Checking Connected Sets

For quick debugging of connected BLE Audio devices and their CSIS advertisement data at the HCI level:

# Enable LE scanning and look for RSI AD Type (0x2E) in advertising reports
# Use hcidump to capture raw HCI events

sudo hcidump -i hci0 -X 2>/dev/null | grep -A 5 "2e:"

# Or use btmon for a more structured view
sudo btmon 2>/dev/null | grep -i "RSI\|CSIS\|Coordinated"

# To see what GATT services a connected BLE Audio device exposes,
# use bluetoothctl after connecting:
bluetoothctl
[bluetooth]# connect AA:BB:CC:DD:EE:FF
[bluetooth]# info AA:BB:CC:DD:EE:FF

# Example relevant output:
#  UUID: Coordinated Set Identification (00001846-...)
#  UUID: Audio Stream Control Service  (0000184e-...)
#  UUID: Published Audio Capabilities  (00001850-...)

# For a full attribute dump:
bluetoothctl
[bluetooth]# menu gatt
[bluetooth]# select-attribute /org/bluez/hci0/dev_AA_BB_CC_DD_EE_FF
[bluetooth]# list-attributes

Section 4 — Putting It All Together

Complete CAP + CSIPS Unicast Stream Setup — Full Procedure Flow
PHONE (Initiator + Set Coordinator) LEFT EARBUD (Set Member, Rank 1) RIGHT EARBUD (Set Member, Rank 2) | | | |====== 1. DEVICE DISCOVERY =============================================> | |— Scan for RSI AD Type (0x2E) ——–>| | |<– Advertisement with RSI ————–| | |— Scan for RSI AD Type (0x2E) —————————————–>| |<– Advertisement with RSI ————————————————-| | | | |====== 2. SET MEMBER IDENTIFICATION =====================================> | |— Connect + Pair + Bond ————–>| | |— Read SIRK (0x2B84) —————–>| | |<– SIRK = 0xABCD…EF ——————| | |— Read Set Size (0x2B85) ————->| | |<– Size = 2 ——————— ——| | | | | |— Connect + Pair + Bond ————————————————->| |— Read SIRK (0x2B84) —————————————————->| |<– SIRK = 0xABCD…EF (MATCH!) ——————————————–| |— Read Rank (0x2B87) —————————————————->| |<– Rank = 2 —————————————————————| | | | | [Set complete: Rank-1=LEFT, Rank-2=RIGHT] | | | | |====== 3. ORDERED ACCESS (Lock) =======================================> | |— Write Lock=LOCKED (0x2B86) ———>| | |<– Lock ACK ——————— ——| | |— Write Lock=LOCKED (0x2B86) —————————————————->| |<– Lock ACK ——————————————————————–| | | | |====== 4. CAP UNICAST AUDIO PROCEDURE ==================================> | |— Read PACS (audio capabilities) —–>| | |— Read PACS (audio capabilities) ————————————————>| |— ASCS: Configure Codec (QoS) ——–>| | |— ASCS: Configure Codec (QoS) ————————————————–>| |— ASCS: Enable Stream ————— >| | |— ASCS: Enable Stream ————————————————————>| | | | | [ISO CIS established — audio flowing] | |~~~ Left Channel Audio ISO ~~~~~~~~~~~~~~>| | |~~~ Right Channel Audio ISO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>| | | | |====== 5. RELEASE LOCKS ================================================> | |— Write Lock=RELEASED (0x2B86) ——->| | |— Write Lock=RELEASED (0x2B86) ————————————————–>|

Key Takeaways
  • CSIPS is the foundation of multi-device coordination in BLE Audio — without it, each earbud is an isolated device.
  • The RSI is a privacy-preserving rotating identifier; only a device holding the SIRK can verify set membership.
  • The SIRK is a 128-bit shared secret burned in at manufacture — it is the “group password” for a Coordinated Set.
  • All four CSIS characteristics (SIRK, Set Size, Lock, Rank) are mandatory for CAP-compliant Acceptors, even if Lock and Rank are not actively used by any current CAP procedure.
  • The Ordered Access procedure uses ascending Rank order for Lock acquisition — this eliminates deadlocks between competing Set Coordinators.
  • CAP is the recipe book: it sequences BAPS, CSIPS, VCP, MICP and MCP into complete procedures for every common audio action.
  • The Commander role elevates broadcast audio from passive casting to an actively managed distribution service.
  • Top-level profiles (HAP, TMAP, PBP) are just CAP with narrower options — they don’t reinvent the wheel.

⚠️ Common Implementation Mistakes
  • Not advertising RSI — If a Set Member does not include the RSI AD Type in its advertisement, a Set Coordinator cannot identify it as a group candidate. This is the single most common reason CSIS discovery silently fails.
  • Mismatched SIRK at provisioning — If a replacement earbud ships with a different default SIRK than the surviving one, the coordinator will reject it as a different set. Manufacturers must plan for a re-pairing ceremony.
  • Skipping Ordered Access — Jumping straight into Lock acquisition without following ascending Rank order opens the door to race conditions in multi-device scenarios (e.g., two phones trying to grab the same set).
  • Not releasing the Lock — A coordinator that crashes or disconnects without releasing the Set Member Lock will leave the Acceptor inaccessible until the lock times out (behavior is implementation-defined).
  • Confusing Initiator and Commander — The Initiator carries audio streams (unicast). The Commander does not carry streams — it manages broadcast. Assigning the wrong role in your GATT database leads to profile conformance failures.

Quick Reference — CAP & CSIPS At a Glance
Concept What It Is Size / Value Set At
SIRK Shared group secret key 128 bits Manufacture
RSI Rotating advertisement identifier 6 bytes Computed from SIRK + prand, changes periodically
Set Size Total members in the set uint8 Manufacture
Set Member Rank Unique order number per member uint8 (non-zero) Manufacture
Set Member Lock Exclusive access flag 0x01=Unlocked, 0x02=Locked Runtime (written by Coordinator)
Ordered Access Lock acquisition order rule Ascending Rank Always before any CAP procedure

Continue Learning BLE Audio

This post is part of the Bluetooth Classic & BLE Audio deep-dive series on EmbeddedPathashala — free, practical content for embedded engineers.

🏠 Back to Home 📡 Bluetooth Series

Leave a Reply

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