| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S3 |
|---|
ESP-IDF BLE ACL Latency Test - Central
This example demonstrates how to measure BLE ACL (Asynchronous Connection-Less) link latency. The central device scans for the peripheral, connects to it, and then performs a latency test by sending packets and measuring the round-trip time (RTT).
This demo should be used together with the periph (peripheral) example.
How It Works
- The central scans for a device named
ESP_ACL_LATENCY - Upon finding the peripheral, it connects and performs MTU exchange
- After enabling notifications, the central sends 100 test packets (242 bytes each)
- For each packet, the central records the send time
- When the echoed packet is received via notification, it calculates RTT
- Finally, statistics (average, min, max latency, packet loss) are printed
Test Flow Diagram
┌──────────────┐ ┌──────────────┐
│ Central │ │ Peripheral │
│ (GATT Client)│ │ (GATT Server)│
└──────┬───────┘ └──────┬───────┘
│ │
│ ──────────── Connection Setup ─────────── │
│ │
│ 1. Scan for "ESP_ACL_LATENCY" │
│ ─────────────────────────────────────────> │ Advertising
│ │
│ 2. Connect Request │
│ ─────────────────────────────────────────> │
│ │
│ 3. Connection Established │
│ <─────────────────────────────────────────> │
│ │
│ 4. MTU Exchange (517 bytes) │
│ <─────────────────────────────────────────> │
│ │
│ 5. Connection Parameter Update (7.5ms) │
│ <─────────────────────────────────────────> │
│ │
│ 6. Service Discovery │
│ ─────────────────────────────────────────> │
│ │
│ 7. Enable Notification (CCCD) │
│ ─────────────────────────────────────────> │
│ │
│ ──────────── Latency Test ───────────── │
│ │
│ 8. Write Test Packet [SEQ=0] ──┐ │
│ Record send_time t1│ │
│ ─────────────────────────────────────────> │
│ │ │ Echo back
│ 9. Notification [SEQ=0] │ │ via Notify
│ Record recv_time t2│ │
│ <───────────────────────────────────────── │
│ │ │
│ RTT = t2 - t1 ──┘ │
│ Latency = RTT / 2 │
│ │
│ ... Repeat for SEQ 1-99 ... │
│ │
│ 10. Print Statistics │
│ - Average/Min/Max Latency │
│ - Packet Loss Rate │
│ │
┌──────┴───────┐ ┌──────┴───────┐
│ Central │ │ Peripheral │
└──────────────┘ └──────────────┘
Test Configuration
The following parameters can be modified in gattc_latency.h:
| Parameter | Default Value | Description |
|---|---|---|
| TEST_PACKET_COUNT | 100 | Number of test packets to send |
| TEST_PACKET_INTERVAL_MS | 20 | Interval between packets (ms) |
How to Use Example
Hardware Required
- Two development boards with supported SoC (e.g., ESP32-C3-DevKitC, ESP32-DevKitC, etc.)
- Two USB cables for power supply and programming
See Development Boards for more information.
Configure the Project
Before project configuration and build, be sure to set the correct chip target using:
idf.py set-target <chip_name>
Build and Flash
- First, flash the
periphexample to one board:
cd ../periph
idf.py -p PORT1 flash
- Then, flash this
centexample to another board:
cd ../cent
idf.py -p PORT2 flash
Monitor
Run idf.py -p PORT monitor to view the serial output of the central device.
(To exit the serial monitor, type Ctrl-].)
See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects.
Example Output
I (362) BLE_ACL_LATENCY_CENT: BLE ACL Latency Test - Central
I (372) phy_init: phy_version 310,dde1ba9,Jun 4 2024,16:38:11
I (432) BLE_ACL_LATENCY_CENT: REG_EVT
I (442) BLE_ACL_LATENCY_CENT: scan start success
I (442) BLE_ACL_LATENCY_CENT: Central initialized, scanning for peripheral...
I (622) BLE_ACL_LATENCY_CENT: searched device ESP_ACL_LATENCY
I (622) BLE_ACL_LATENCY_CENT: connect to the remote device.
I (622) BLE_ACL_LATENCY_CENT: stop scan successfully
I (892) BLE_ACL_LATENCY_CENT: ESP_GATTC_CONNECT_EVT conn_id 0, if 4
I (892) BLE_ACL_LATENCY_CENT: REMOTE BDA: 58:cf:79:ea:77:30
I (892) BLE_ACL_LATENCY_CENT: open success
I (1042) BLE_ACL_LATENCY_CENT: update connection params status = 0, min_int = 6, max_int = 6,conn_int = 6,latency = 0, timeout = 500
I (1112) BLE_ACL_LATENCY_CENT: discover service complete conn_id 0
I (1112) BLE_ACL_LATENCY_CENT: service found
I (1122) BLE_ACL_LATENCY_CENT: ESP_GATTC_CFG_MTU_EVT, Status 0, MTU 517, conn_id 0
I (1132) BLE_ACL_LATENCY_CENT: ESP_GATTC_REG_FOR_NOTIFY_EVT
I (1172) BLE_ACL_LATENCY_CENT: write descr success
I (1172) BLE_ACL_LATENCY_CENT: Initializing latency test...
I (1172) LATENCY_TEST: Latency test initialized, conn_id=0, handle=42
I (2182) BLE_ACL_LATENCY_CENT: Starting latency test...
I (2182) LATENCY_TEST: ====================================
I (2182) LATENCY_TEST: Starting latency test...
I (2182) LATENCY_TEST: Packets: 100, Interval: 20 ms
I (2182) LATENCY_TEST: ====================================
SEQ= 0, RTT= 20040 us, Latency= 10020 us (10.02 ms)
SEQ= 1, RTT= 18341 us, Latency= 9170 us (9.17 ms)
SEQ= 2, RTT= 13339 us, Latency= 6669 us (6.67 ms)
...
SEQ= 99, RTT= 15835 us, Latency= 7917 us (7.92 ms)
I (4192) LATENCY_TEST: All packets sent, waiting for responses...
I (6192) LATENCY_TEST:
I (6192) LATENCY_TEST: ========================================
I (6192) LATENCY_TEST: Test Results Summary
I (6192) LATENCY_TEST: ========================================
I (6192) LATENCY_TEST: Total packets: 100
I (6202) LATENCY_TEST: Received: 100
I (6202) LATENCY_TEST: Lost: 0 (0.0%)
I (6202) LATENCY_TEST: ----------------------------------------
I (6212) LATENCY_TEST: Average latency: 7929 us (7.93 ms)
I (6222) LATENCY_TEST: Min latency: 6667 us (6.67 ms)
I (6222) LATENCY_TEST: Max latency: 10020 us (10.02 ms)
I (6232) LATENCY_TEST: ========================================
Connection Parameters
The example uses optimized connection parameters for low latency:
| Parameter | Value | Description |
|---|---|---|
| Connection Interval | 7.5 ms | Minimum allowed by BLE spec |
| Slave Latency | 0 | No skipped connection events |
| Supervision Timeout | 4000 ms | Connection timeout |
| MTU | 517 | Maximum ATT MTU |
Understanding the Results
- RTT (Round-Trip Time): Time from sending a packet until receiving the echo
- Latency: Estimated one-way delay (RTT / 2)
- Expected Results: With 7.5ms connection interval, typical latency is 6-10ms
Troubleshooting
For any technical queries, please open an issue on GitHub. We will get back to you soon.