I have seen a few posts including:
- Change advertised name (Bluetooth) - Nordic Q&A - Nordic DevZone - Nordic DevZone (nordicsemi.com)
- NCS bt_set_name() - Nordic Q&A - Nordic DevZone - Nordic DevZone (nordicsemi.com)
- Setting Bluetooth Device Name in Zephyr - Nordic Q&A - Nordic DevZone - Nordic DevZone (nordicsemi.com)
but I still haven't been able to adapt one of the examples to show the name dynamically.
This is the code:
#include <zephyr/kernel.h> #include <zephyr/logging/log.h> #include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/gap.h> #include <zephyr/bluetooth/uuid.h> #include <zephyr/bluetooth/conn.h> #include <dk_buttons_and_leds.h> #include <stdio.h> // For snprintf #include <stdlib.h> #include "ble_manager.h" LOG_MODULE_REGISTER(ble_manager, LOG_LEVEL_DBG); #define DEVICE_NAME CONFIG_BT_DEVICE_NAME #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1) /* STEP 2.1 - Declare the Company identifier (Company ID) */ #define COMPANY_ID_CODE 0x0059 /* STEP 2.2 - Declare the structure for your custom data */ typedef struct adv_mfg_data { uint16_t company_code; /* Company Identifier Code. */ } adv_mfg_data_type; /* STEP 5.1 - Create the advertising parameter for connectable advertising */ static struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM( (BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_USE_IDENTITY), /* Connectable advertising and use identity address */ 800, /* Min Advertising Interval 500ms (800*0.625ms) */ 801, /* Max Advertising Interval 500.625ms (801*0.625ms) */ NULL); /* Set to NULL for undirected advertising */ /* STEP 2.3 - Define and initialize a variable of type adv_mfg_data_type */ static adv_mfg_data_type adv_mfg_data = { COMPANY_ID_CODE, 0x00 }; static const struct bt_data ad[] = { BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR), //BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN), /* STEP 3 - Include the Manufacturer Specific Data in the advertising packet. */ BT_DATA(BT_DATA_MANUFACTURER_DATA, (unsigned char *)&adv_mfg_data, sizeof(adv_mfg_data)), }; static unsigned char url_data[] ={0x17,'/','/','a','c','a','d','e','m','y','.', 'n','o','r','d','i','c','s','e','m','i','.', 'c','o','m'}; static const struct bt_data sd[] = { BT_DATA(BT_DATA_URI, url_data,sizeof(url_data)), }; static void connected(struct bt_conn *conn, uint8_t err) { if (err) { LOG_ERR("Connection failed (err %u)\n", err); return; } LOG_DBG("Connected\n"); } static void disconnected(struct bt_conn *conn, uint8_t reason) { LOG_DBG("Disconnected (reason %u)\n", reason); } BT_CONN_CB_DEFINE(conn_callbacks) = { .connected = connected, .disconnected = disconnected, }; int ble_manager_init() { LOG_DBG("Starting '%s'", DEVICE_NAME); int err; err = bt_enable(NULL); if (err) { LOG_ERR("Bluetooth init failed (err %d)", err); return -1; } LOG_DBG("Bluetooth initialized"); // Generate a random 6-digit number unsigned int random_number = 100000 + rand() % 900000; // Ensures a range from 100000 to 999999 LOG_DBG("Random number: %d", random_number); // Assuming random_number is already defined and holds a random 6-digit number char device_name[18]; // Ensure this is large enough to hold the resulting string // Create a formatted string with the random number snprintf(device_name, sizeof(device_name), "DeviceName %d", random_number); // Set the Bluetooth device name bt_set_name(device_name); LOG_DBG("Bluetooth device name: %s", device_name); err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad),sd, ARRAY_SIZE(sd)); if (err) { LOG_ERR("Advertising failed to start (err %d)", err); return -1; } LOG_DBG("Bluetooth advertising"); return 0; }
And this is the prj.conf:
# Logger module CONFIG_LOG=y # Button and LED library CONFIG_DK_LIBRARY=y # Bluetooth LE CONFIG_BT=y CONFIG_BT_PERIPHERAL=y #CONFIG_BT_DEVICE_NAME="TEST Peripheral" CONFIG_BT_DEVICE_NAME_DYNAMIC=y # Maximum chcaracter of the device name # (Range: 2 to 248) CONFIG_BT_DEVICE_NAME_MAX=17 # Increase stack size for the main thread and System Workqueue CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_MAIN_STACK_SIZE=2048
Is there something else I need to do either in the bt_data
or in the bt_le_adv_start
?