examples/bluetooth/bluedroid/ble/ble_acl_latency/cent/README.md
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S3 |
|---|
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.
ESP_ACL_LATENCY ┌──────────────┐ ┌──────────────┐
│ 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 │
└──────────────┘ └──────────────┘
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) |
See Development Boards for more information.
Before project configuration and build, be sure to set the correct chip target using:
idf.py set-target <chip_name>
periph example to one board:cd ../periph
idf.py -p PORT1 flash
cent example to another board:cd ../cent
idf.py -p PORT2 flash
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.
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: ========================================
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 |
For any technical queries, please open an issue on GitHub. We will get back to you soon.