Hi,
I create two extended adverts, one connectable and one none, (nRF Connect 2.0.0) using the following code:
static struct bt_le_ext_adv *ext_adv[CONFIG_BT_EXT_ADV_MAX_ADV_SET];
static const struct bt_le_adv_param *connectable_adv_param =
BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_USE_NAME,
BT_GAP_ADV_FAST_INT_MIN_2, /* 100 ms */
BT_GAP_ADV_FAST_INT_MAX_2, /* 150 ms */
NULL);
static const struct bt_le_adv_param *non_connectable_adv_param =
BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_USE_NAME,
0x140, /* 200 ms */
0x190, /* 250 ms */
NULL);
static ble_network_manufacturer_data_t m_network_manufacturer_data = {
.LismoreID_0 = LI_COMPANY_1,
.LismoreID_1 = LI_COMPANY_2,
.DeviceType = DT_IC1GW,
.ChannelID = 0,
.AddressID = 0,
.EventID = 0,
.UserID = 0,
.PreviousUserID = 0,
.Flags = 0,
.CurrentPriority = 0,
.CalibratedRSSI = 0,
.MinimumRSSI = 0,
.NetworkCRC = 0,
};
static const struct bt_data ext_ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_INTERCALL_P_VAL),
BT_DATA(BT_DATA_MANUFACTURER_DATA, &m_network_manufacturer_data, sizeof(ble_network_manufacturer_data_t)),
};
static int duel_adv_create(void)
{
int err;
err = bt_set_name(DEVICE_NAME);
if (err) {
LOG_INF("Failed to set device name (err %d)", err);
return err;
}
err = advertising_set_create(&ext_adv[NON_CONNECTABLE_ADV_IDX], non_connectable_adv_param,
ext_ad, ARRAY_SIZE(ext_ad));
if (err) {
LOG_INF("Failed to create non-connectable advertising set (err %d)", err);
return err;
}
err = advertising_set_create(&ext_adv[CONNECTABLE_ADV_IDX], connectable_adv_param,
ext_ad, ARRAY_SIZE(ext_ad));
if (err) {
LOG_INF("Failed to create connectable advertising set (err %d)", err);
return err;
}
LOG_INF("Created adverts");
return err;
}
static int advertising_set_create(struct bt_le_ext_adv **adv,
const struct bt_le_adv_param *param,
const struct bt_data *ad, size_t ad_len)
{
int err;
struct bt_le_ext_adv *adv_set;
err = bt_le_ext_adv_create(param, &adv_cb, adv);
if (err) {
return err;
}
adv_set = *adv;
printk("Created adv: %p\n", adv_set);
err = bt_le_ext_adv_set_data(adv_set, ad, ad_len, NULL, 0);
if (err) {
LOG_INF("Failed to set advertising data (err %d)", err);
return err;
}
return bt_le_ext_adv_start(adv_set, BT_LE_EXT_ADV_START_DEFAULT);
}
This works great, but then i want to amend the data in the manufacturer data array and update the adverts data, so i do the array update and then call the following function:
static int update_advert_data(void)
{
int err;
err = bt_le_ext_adv_set_data(&ext_adv[NON_CONNECTABLE_ADV_IDX], &ext_ad, ARRAY_SIZE(ext_ad), NULL, 0);
if (err) {
LOG_INF("Failed to update non connectable adv (err %d)", err);
return err;
}
err = bt_le_ext_adv_set_data(&ext_adv[CONNECTABLE_ADV_IDX], &ext_ad, ARRAY_SIZE(ext_ad), NULL, 0);
if (err) {
LOG_INF("Failed to update connectable adv (err %d)", err);
return err;
}
return err;
}
But i get the following error:
[00:02:58.154,479] <err> bt_adv: Too big advertising data
[00:02:58.154,510] <inf> main: Failed to update non connectable adv (err -22)
How do i go about updating the data held in the adverts while they are live?
Many thanks