Merge branch 'bugfix/fix_ble_multi_adv_v5.2' into 'release/v5.2'

fix(nimble): Fix ble_multi_adv example to show correct UUIDs information (v5.2)

See merge request espressif/esp-idf!45814
This commit is contained in:
Rahul Tank
2026-02-12 15:48:27 +05:30
4 changed files with 92 additions and 18 deletions
@@ -13,6 +13,13 @@ It starts 4 types of advertising:
* Scannable legacy
* Legacy withe specified duration(5 sec)
## Service UUID Notes
* The example registers two 16-bit GATT services and one custom 128-bit GATT service.
* All advertising instances include the two 16-bit service UUIDs.
* The connectable advertiser also includes the 128-bit service UUID.
* UUID values in advertising payloads are populated from the same UUID definitions used in the GATT server.
## How to Use Example
Before project configuration and build, be sure to set the correct chip target using:
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2017-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2017-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -15,6 +15,16 @@
static uint8_t gatt_svr_chr_val = 0x01; /* Example characteristic value */
#define GATT_SVR_UUID16_1 (0xCDAB)
#define GATT_SVR_UUID16_2 (0x1118)
static const uint16_t gatt_svr_adv_uuids16[] = {
GATT_SVR_UUID16_1,
GATT_SVR_UUID16_2,
};
static const ble_uuid16_t gatt_svr_svc16_uuid_1 = BLE_UUID16_INIT(GATT_SVR_UUID16_1);
static const ble_uuid16_t gatt_svr_svc16_uuid_2 = BLE_UUID16_INIT(GATT_SVR_UUID16_2);
static const ble_uuid128_t gatt_svr_svc_uuid =
BLE_UUID128_INIT(0x2d, 0x71, 0xa2, 0x59, 0xb4, 0x58, 0xc8, 0x12,
0x99, 0x99, 0x43, 0x95, 0x12, 0x2f, 0x46, 0x59);
@@ -37,6 +47,14 @@ gatt_svc_access(uint16_t conn_handle, uint16_t attr_handle,
void *arg);
static const struct ble_gatt_svc_def gatt_svr_svcs[] = {
{
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = &gatt_svr_svc16_uuid_1.u,
},
{
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = &gatt_svr_svc16_uuid_2.u,
},
{
/*** Service ***/
.type = BLE_GATT_SVC_TYPE_PRIMARY,
@@ -184,3 +202,19 @@ gatt_svr_init(void)
return 0;
}
const uint8_t *
gatt_svr_service_uuid128(void)
{
return gatt_svr_svc_uuid.value;
}
const uint16_t *
gatt_svr_service_uuids16(size_t *count)
{
if (count) {
*count = sizeof(gatt_svr_adv_uuids16) / sizeof(gatt_svr_adv_uuids16[0]);
}
return gatt_svr_adv_uuids16;
}
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2017-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -27,38 +27,66 @@ static int ble_scannable_legacy_ext_cb(uint16_t instance);
static int ble_legacy_duration_cb(uint16_t instance);
static int ble_non_conn_ext_cb(uint16_t instance);
static void ble_multi_advertise(ble_addr_t addr);
#define ADV_UUID16_OFFSET (5)
#define CONNECTABLE_ADV_UUID128_OFFSET (11)
/* Advertising patterns */
static uint8_t legacy_dur_adv_pattern[] = {
0x02, 0x01, 0x06,
0x03, 0x03, 0xab, 0xcd,
0x03, 0x03, 0x18, 0x11,
0x12, 0X09, 'n', 'i', 'm', 'b', 'l', 'e', '-', 'l', 'e', 'g', 'a', 'c', 'y', '-', 'd', 'u',
0x02, BLE_HS_ADV_TYPE_FLAGS, 0x06,
0x05, BLE_HS_ADV_TYPE_COMP_UUIDS16, 0x00, 0x00, 0x00, 0x00,
0x12, BLE_HS_ADV_TYPE_COMP_NAME, 'n', 'i', 'm', 'b', 'l', 'e', '-', 'l', 'e', 'g', 'a', 'c', 'y', '-', 'd', 'u',
'r'
};
static uint8_t scannable_legacy_adv_pattern[] = {
0x02, 0x01, 0x06,
0x03, 0x03, 0xab, 0xcd,
0x03, 0x03, 0x18, 0x11,
0x13, 0X09, 'n', 'i', 'm', 'b', 'l', 'e', '-', 's', 'c', 'a', 'n', '-', 'l', 'e', 'g', 'a',
0x02, BLE_HS_ADV_TYPE_FLAGS, 0x06,
0x05, BLE_HS_ADV_TYPE_COMP_UUIDS16, 0x00, 0x00, 0x00, 0x00,
0x13, BLE_HS_ADV_TYPE_COMP_NAME, 'n', 'i', 'm', 'b', 'l', 'e', '-', 's', 'c', 'a', 'n', '-', 'l', 'e', 'g', 'a',
'c', 'y'
};
static uint8_t connectable_adv_pattern[] = {
0x02, 0x01, 0x06,
0x03, 0x03, 0xab, 0xcd,
0x03, 0x03, 0x18, 0x11,
0x12, 0X09, 'n', 'i', 'm', 'b', 'l', 'e', '-', 'c', 'o', 'n', 'n', 'e', 't', 'a', 'b', 'l', 'e'
0x02, BLE_HS_ADV_TYPE_FLAGS, 0x06,
0x05, BLE_HS_ADV_TYPE_COMP_UUIDS16, 0x00, 0x00, 0x00, 0x00,
0x11, BLE_HS_ADV_TYPE_COMP_UUIDS128,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x12, BLE_HS_ADV_TYPE_COMP_NAME, 'n', 'i', 'm', 'b', 'l', 'e', '-', 'c', 'o', 'n', 'n', 'e', 't', 'a', 'b', 'l', 'e'
};
static uint8_t non_conn_adv_pattern[] = {
0x02, 0x01, 0x06,
0x03, 0x03, 0xab, 0xcd,
0x03, 0x03, 0x18, 0x11,
0x10, 0X09, 'n', 'i', 'm', 'b', 'l', 'e', '-', 'n', 'o', 'n', '-', 'c', 'o', 'n', 'n'
0x02, BLE_HS_ADV_TYPE_FLAGS, 0x06,
0x05, BLE_HS_ADV_TYPE_COMP_UUIDS16, 0x00, 0x00, 0x00, 0x00,
0x10, BLE_HS_ADV_TYPE_COMP_NAME, 'n', 'i', 'm', 'b', 'l', 'e', '-', 'n', 'o', 'n', '-', 'c', 'o', 'n', 'n'
};
static void
ble_multi_adv_set_uuid16_field(uint8_t *adv_pattern, uint8_t uuid_offset)
{
size_t uuids16_count;
const uint16_t *uuids16 = gatt_svr_service_uuids16(&uuids16_count);
/* Pattern reserves room for 2 x 16-bit UUIDs. */
assert(uuids16_count >= 2);
adv_pattern[uuid_offset] = uuids16[0] & 0xFF;
adv_pattern[uuid_offset + 1] = (uuids16[0] >> 8) & 0xFF;
adv_pattern[uuid_offset + 2] = uuids16[1] & 0xFF;
adv_pattern[uuid_offset + 3] = (uuids16[1] >> 8) & 0xFF;
}
static void
ble_multi_adv_set_service_uuids(void)
{
ble_multi_adv_set_uuid16_field(legacy_dur_adv_pattern, ADV_UUID16_OFFSET);
ble_multi_adv_set_uuid16_field(scannable_legacy_adv_pattern, ADV_UUID16_OFFSET);
ble_multi_adv_set_uuid16_field(connectable_adv_pattern, ADV_UUID16_OFFSET);
ble_multi_adv_set_uuid16_field(non_conn_adv_pattern, ADV_UUID16_OFFSET);
memcpy(&connectable_adv_pattern[CONNECTABLE_ADV_UUID128_OFFSET],
gatt_svr_service_uuid128(), 16);
}
/**
* Logs information about a connection to the console.
*/
@@ -207,6 +235,7 @@ start_connectable_ext(void)
{
uint8_t instance = 1;
struct ble_gap_ext_adv_params params;
int size_pattern = sizeof(connectable_adv_pattern) / sizeof(connectable_adv_pattern[0]);
memset (&params, 0, sizeof(params));
@@ -438,6 +467,8 @@ ble_multi_adv_on_sync(void)
return;
}
ble_multi_adv_set_service_uuids();
start_non_connectable_ext();
start_connectable_ext();
@@ -27,6 +27,8 @@ struct ble_instance_cb_register {
void gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg);
int gatt_svr_init(void);
const uint16_t *gatt_svr_service_uuids16(size_t *count);
const uint8_t *gatt_svr_service_uuid128(void);
#ifdef __cplusplus
}