blob: 56cc210de78a593e544b7f12bdb954ccd954ba57 [file] [log] [blame]
/*
* Copyright (c) 2022 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/sys/printk.h>
#include <zephyr/bluetooth/bluetooth.h>
/* Maximum supported AD data length, use a value supported by the Controller,
* Bluetooth Core Specification define minimum of 31 bytes will be supported by
* all Controllers, can be a maximum of 1650 bytes when supported.
*/
#if defined(CONFIG_BT_CTLR_ADV_DATA_LEN_MAX)
#define BT_AD_DATA_LEN_MAX CONFIG_BT_CTLR_ADV_DATA_LEN_MAX
#else
#define BT_AD_DATA_LEN_MAX 31U
#endif
/* Size of AD data format length field in octets */
#define BT_AD_DATA_FORMAT_LEN_SIZE 1U
/* Size of AD data format type field in octets */
#define BT_AD_DATA_FORMAT_TYPE_SIZE 1U
/* Maximum value of AD data format length field (8-bit) */
#define BT_AD_DATA_FORMAT_LEN_MAX 255U
/* Device name length, size minus one null character */
#define BT_DEVICE_NAME_LEN (sizeof(CONFIG_BT_DEVICE_NAME) - 1U)
/* Device name length in AD data format, 2 bytes for length and type overhead */
#define BT_DEVICE_NAME_AD_DATA_LEN (BT_AD_DATA_FORMAT_LEN_SIZE + \
BT_AD_DATA_FORMAT_TYPE_SIZE + \
BT_DEVICE_NAME_LEN)
/* Maximum manufacturer data length, considering ad data format overhead and
* the included device name in ad data format.
*/
#define BT_MFG_DATA_LEN_MAX (MIN((BT_AD_DATA_FORMAT_LEN_MAX - \
BT_AD_DATA_FORMAT_TYPE_SIZE), \
(BT_AD_DATA_LEN_MAX - \
BT_AD_DATA_FORMAT_LEN_SIZE - \
BT_AD_DATA_FORMAT_TYPE_SIZE)))
#define BT_MFG_DATA_LEN (MIN(BT_MFG_DATA_LEN_MAX, \
(BT_AD_DATA_LEN_MAX - \
BT_AD_DATA_FORMAT_LEN_SIZE - \
BT_AD_DATA_FORMAT_TYPE_SIZE - \
BT_DEVICE_NAME_AD_DATA_LEN)))
static uint8_t mfg_data[BT_MFG_DATA_LEN] = { 0xFF, 0xFF, };
static const struct bt_data ad[] = {
BT_DATA(BT_DATA_MANUFACTURER_DATA, mfg_data, sizeof(mfg_data)),
};
static struct bt_le_ext_adv *adv[CONFIG_BT_EXT_ADV_MAX_ADV_SET];
int broadcaster_multiple(void)
{
struct bt_le_adv_param adv_param = {
.id = BT_ID_DEFAULT,
.sid = 0U, /* Supply unique SID when creating advertising set */
.secondary_max_skip = 0U,
.options = (BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_USE_NAME),
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2,
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2,
.peer = NULL,
};
int err;
/* Initialize the Bluetooth Subsystem */
err = bt_enable(NULL);
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return err;
}
for (int index = 0; index < CONFIG_BT_EXT_ADV_MAX_ADV_SET; index++) {
/* Use advertising set instance index as SID */
adv_param.sid = index;
/* Create a non-connectable non-scannable advertising set */
err = bt_le_ext_adv_create(&adv_param, NULL, &adv[index]);
if (err) {
printk("Failed to create advertising set %d (err %d)\n",
index, err);
return err;
}
/* Set extended advertising data */
err = bt_le_ext_adv_set_data(adv[index], ad, ARRAY_SIZE(ad),
NULL, 0);
if (err) {
printk("Failed to set advertising data for set %d "
"(err %d)\n", index, err);
return err;
}
/* Start extended advertising set */
err = bt_le_ext_adv_start(adv[index],
BT_LE_EXT_ADV_START_DEFAULT);
if (err) {
printk("Failed to start extended advertising set %d "
"(err %d)\n", index, err);
return err;
}
printk("Started Extended Advertising Set %d.\n", index);
}
return 0;
}