ESP32 BLE : Dynamic data advertisment
ESP32 BLE : Dynamic data advertisment
Hi,
I'm trying to use ESP32 BLE GATT server code to advertise a data with my specific manufacture data. So I need to update manufacture data every seconds using a timer.
This is my manuafacture data looks like.
uint8_t advtimer_value = 0x22;
"uint8_t manufacture_specific_data[8] = {0x0b, advtimer_value, 0x02, 0x00};"
Till her it works and if i change the value in between then iam not able to update this advtimer_value in esp32. It says not a const . How should overcome this. Or is there any other way which i can achieve my goal.
Please help.
I'm trying to use ESP32 BLE GATT server code to advertise a data with my specific manufacture data. So I need to update manufacture data every seconds using a timer.
This is my manuafacture data looks like.
uint8_t advtimer_value = 0x22;
"uint8_t manufacture_specific_data[8] = {0x0b, advtimer_value, 0x02, 0x00};"
Till her it works and if i change the value in between then iam not able to update this advtimer_value in esp32. It says not a const . How should overcome this. Or is there any other way which i can achieve my goal.
Please help.
Re: ESP32 BLE : Dynamic data advertisment
Code: Select all
uint8_t advtimer_value = 0x22;
uint8_t manufacture_specific_data[8] = {0x0b, 0x0, 0x02, 0x00};
manufacture_specific_data[1] = advtimer_value;
Re: ESP32 BLE : Dynamic data advertisment
chegewara wrote: ↑Tue May 19, 2020 4:15 amCode: Select all
uint8_t advtimer_value = 0x22; uint8_t manufacture_specific_data[8] = {0x0b, 0x0, 0x02, 0x00}; manufacture_specific_data[1] = advtimer_value;
Hi , do i need to do anything on the below functions to get the changes reflected in my advertising frames.
case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
adv_config_done &= (~ADV_CONFIG_FLAG);
manufacture_specific_data[1] = advtimer_value;
if (adv_config_done == 0)
{
esp_ble_gap_start_advertising(&adv_params);
}
break;
case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT:
adv_config_done &= (~SCAN_RSP_CONFIG_FLAG);
if (adv_config_done == 0)
{
esp_ble_gap_start_advertising(&adv_params);
}
break;
And my "advtimer_value" will be inside a timer, so do i just need to change the value there or do i need to make any changes in the BLE code.
Last edited by Swagger on Wed May 20, 2020 8:30 am, edited 1 time in total.
Re: ESP32 BLE : Dynamic data advertisment
chegewara wrote: ↑Tue May 19, 2020 4:15 amCode: Select all
uint8_t advtimer_value = 0x22; uint8_t manufacture_specific_data[8] = {0x0b, 0x0, 0x02, 0x00}; manufacture_specific_data[1] = advtimer_value;
Hi thanks for the quick reply,
Do i need to make any changes in the belwo functions to reflect the changes in my advertsing frames,
case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
adv_config_done &= (~ADV_CONFIG_FLAG);
manufacture_specific_data[1] = advtimer_value;
if (adv_config_done == 0)
{
esp_ble_gap_start_advertising(&adv_params);
}
break;
case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT:
adv_config_done &= (~SCAN_RSP_CONFIG_FLAG);
if (adv_config_done == 0)
{
esp_ble_gap_start_advertising(&adv_params);
}
break;
My "advtimer_value" will be updated inside a timer functions, so do i just neeed to update the advtimer_value value ther or do i need to make any changes in the BLE functions.
Re: ESP32 BLE : Dynamic data advertisment
When advtimer_val is updated somewhere else, then you have to stop advertising, update manufacturer data and start advertising again.
Re: ESP32 BLE : Dynamic data advertisment
hi , thanks for your response.
uint8_t manufacture_specific_data[4] = {0x0b, 0xFF, 0x02, 0x00};
// scan response data
static esp_ble_adv_data_t scan_rsp_data = {
.set_scan_rsp = true,
.include_name = true,
.include_txpower = false,
.min_interval = 0x0006,
.max_interval = 0x0010,
.appearance = 0x00,
.manufacturer_len = sizeof(manufacture_specific_data),
.p_manufacturer_data = manufacture_specific_data,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = ESP_UUID_LEN_128,
.p_service_uuid = service_uuid,
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
I want to change the manufacture_specific_data[2]= advtimer_value ;
advtimer_value will be updated every second based on a timer.
But the advertising value is not getting any changes even if the " advtimer_value " in the time is changing every second. every time I change the value I am stopping the advertisement as you said and after changing the value restarting the advertisement.
What I am doing wrong.
uint8_t manufacture_specific_data[4] = {0x0b, 0xFF, 0x02, 0x00};
// scan response data
static esp_ble_adv_data_t scan_rsp_data = {
.set_scan_rsp = true,
.include_name = true,
.include_txpower = false,
.min_interval = 0x0006,
.max_interval = 0x0010,
.appearance = 0x00,
.manufacturer_len = sizeof(manufacture_specific_data),
.p_manufacturer_data = manufacture_specific_data,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = ESP_UUID_LEN_128,
.p_service_uuid = service_uuid,
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
I want to change the manufacture_specific_data[2]= advtimer_value ;
advtimer_value will be updated every second based on a timer.
But the advertising value is not getting any changes even if the " advtimer_value " in the time is changing every second. every time I change the value I am stopping the advertisement as you said and after changing the value restarting the advertisement.
What I am doing wrong.
Re: ESP32 BLE : Dynamic data advertisment
I dont have IDF example now, but here is simplest arduino example to show you idea:
Code: Select all
#include <BLEDevice.h>
#include <BLEServer.h>
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
uint8_t val;
void setup() {
BLEDevice::init("esp32");
BLEServer *pServer = BLEDevice::createServer();
}
void loop() {
String _val = String(val++);
BLEAdvertisementData data;
data.setFlags(0x6);
data.setManufacturerData(_val.c_str());
pAdvertising->setAdvertisementData(data);
pAdvertising->start();
delay(1000);
}
Re: ESP32 BLE : Dynamic data advertisment
Iam using esp gatt server demo code
:https://github.com/espressif/esp-idf/bl ... tts_demo.c
uint8_t manufacture_specific_data[8] = { 0x0b, 0xFF, 0x02, 0x00};
uint8_t checkNum = 0;
/* The length of adv data must be less than 31 bytes */
static esp_ble_adv_data_t adv_data = {
.set_scan_rsp = false,
.include_name = false,
.include_txpower = false,
.min_interval = 0x20,
.max_interval = 0x40, //slave connection max interval, Time = max_interval * 1.25 msec
.appearance = 0x00,
// .manufacturer_len = sizeof(manufacture_specific_data),
// .p_manufacturer_data = &manufacture_specific_data,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = ESP_UUID_LEN_128,
.p_service_uuid = Huilan_service_uuid,
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
// scan response data
static esp_ble_adv_data_t scan_rsp_data = {
.set_scan_rsp = true,
.include_name = true,
.include_txpower = false,
.min_interval = 0x0006,
.max_interval = 0x0010,
.appearance = 0x00,
.manufacturer_len = sizeof(manufacture_specific_data),
.p_manufacturer_data = manufacture_specific_data,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = ESP_UUID_LEN_128,
.p_service_uuid = Huilan_service_uuid,
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
static esp_ble_adv_params_t adv_params = {
.adv_int_min = 0x20,
.adv_int_max = 0x40,
.adv_type = ADV_TYPE_IND,
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
.channel_map = ADV_CHNL_ALL,
.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};
///////////////////////////////////////////////////////////////////////////////////////////////////////
This is the timer call back where I updated the manufacture data
void periodic_timer_callback(void *arg)
{
checkNum++;
int64_t time_since_boot = esp_timer_get_time();
ESP_LOGI(timer_tag, "Periodic timer called, time since boot: %lld us", time_since_boot);
if (checkNum != 250)
{
dyn_adv_update(false);
manufacture_specific_data[2] = checkNum;
dyn_adv_update(true);
}
else
{
ESP_ERROR_CHECK(esp_timer_stop(periodic_timer));
ESP_ERROR_CHECK(esp_timer_delete(periodic_timer));
ESP_LOGI(timer_tag, "Stopped and deleted timers");
}
}
void dyn_adv_update(bool param)
{
if (param == false)
esp_ble_gap_stop_advertising();
if (param == true)
esp_ble_gap_start_advertising(&adv_params);
}
so that each time the periodic timer is called the manufacture data needs to be updated. The timer works fine. But the data is not getting updated when advertising.
:https://github.com/espressif/esp-idf/bl ... tts_demo.c
uint8_t manufacture_specific_data[8] = { 0x0b, 0xFF, 0x02, 0x00};
uint8_t checkNum = 0;
/* The length of adv data must be less than 31 bytes */
static esp_ble_adv_data_t adv_data = {
.set_scan_rsp = false,
.include_name = false,
.include_txpower = false,
.min_interval = 0x20,
.max_interval = 0x40, //slave connection max interval, Time = max_interval * 1.25 msec
.appearance = 0x00,
// .manufacturer_len = sizeof(manufacture_specific_data),
// .p_manufacturer_data = &manufacture_specific_data,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = ESP_UUID_LEN_128,
.p_service_uuid = Huilan_service_uuid,
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
// scan response data
static esp_ble_adv_data_t scan_rsp_data = {
.set_scan_rsp = true,
.include_name = true,
.include_txpower = false,
.min_interval = 0x0006,
.max_interval = 0x0010,
.appearance = 0x00,
.manufacturer_len = sizeof(manufacture_specific_data),
.p_manufacturer_data = manufacture_specific_data,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = ESP_UUID_LEN_128,
.p_service_uuid = Huilan_service_uuid,
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
static esp_ble_adv_params_t adv_params = {
.adv_int_min = 0x20,
.adv_int_max = 0x40,
.adv_type = ADV_TYPE_IND,
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
.channel_map = ADV_CHNL_ALL,
.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};
///////////////////////////////////////////////////////////////////////////////////////////////////////
This is the timer call back where I updated the manufacture data
void periodic_timer_callback(void *arg)
{
checkNum++;
int64_t time_since_boot = esp_timer_get_time();
ESP_LOGI(timer_tag, "Periodic timer called, time since boot: %lld us", time_since_boot);
if (checkNum != 250)
{
dyn_adv_update(false);
manufacture_specific_data[2] = checkNum;
dyn_adv_update(true);
}
else
{
ESP_ERROR_CHECK(esp_timer_stop(periodic_timer));
ESP_ERROR_CHECK(esp_timer_delete(periodic_timer));
ESP_LOGI(timer_tag, "Stopped and deleted timers");
}
}
void dyn_adv_update(bool param)
{
if (param == false)
esp_ble_gap_stop_advertising();
if (param == true)
esp_ble_gap_start_advertising(&adv_params);
}
so that each time the periodic timer is called the manufacture data needs to be updated. The timer works fine. But the data is not getting updated when advertising.
Re: ESP32 BLE : Dynamic data advertisment
Hi ,
I am also trying the same code from esp32 gatt server demo.
is there anything to do with the initialization of manufacture specifi data.
I am also trying the same code from esp32 gatt server demo.
is there anything to do with the initialization of manufacture specifi data.
Re: ESP32 BLE : Dynamic data advertisment
You need to call this function only, and code you already have will take care of rest (will start advertising thru events):
https://github.com/espressif/esp-idf/bl ... emo.c#L208
https://github.com/espressif/esp-idf/bl ... emo.c#L202
Code: Select all
esp_ble_gap_config_adv_data()
https://github.com/espressif/esp-idf/bl ... emo.c#L202
Who is online
Users browsing this forum: Corand and 108 guests