Skip to content

Commit 692e9e1

Browse files
authored
[ESP32] Enable extended ble announcement for esp32 platform (#32389)
* enable extended ble advertisement for esp32 platform * changed extended advertisement to extended announcement * restlyed * made discoverty timeout range and default dependent on extended announcement. * help section for extended ble announcement * fixed eliding of extended data during extended announcement. * fixed setting of Additional data flag
1 parent 264cc7c commit 692e9e1

File tree

4 files changed

+104
-24
lines changed

4 files changed

+104
-24
lines changed

config/esp32/components/chip/Kconfig

+14-2
Original file line numberDiff line numberDiff line change
@@ -1192,8 +1192,11 @@ menu "CHIP Device Layer"
11921192
menu "Commissioning Window Options"
11931193
config CHIP_DISCOVERY_TIMEOUT_SECS
11941194
int "Commissioning Window Timeout in seconds"
1195-
range 180 900
1196-
default 900
1195+
range 180 900 if !ENABLE_BLE_EXT_ANNOUNCEMENT
1196+
range 901 172800 if ENABLE_BLE_EXT_ANNOUNCEMENT
1197+
default 900 if !ENABLE_BLE_EXT_ANNOUNCEMENT
1198+
default 172800 if ENABLE_BLE_EXT_ANNOUNCEMENT
1199+
11971200
help
11981201
The amount of time (in seconds) after which the CHIP platform will close the Commissioning Window
11991202
endmenu
@@ -1216,4 +1219,13 @@ menu "CHIP Device Layer"
12161219

12171220
endmenu
12181221

1222+
menu "Enable BLE Extended Announcement"
1223+
config ENABLE_BLE_EXT_ANNOUNCEMENT
1224+
bool "Enable BLE Extended Announcement"
1225+
default n
1226+
help
1227+
Enable BLE Extended Announcement.To be used with CHIP_DISCOVERY_TIMEOUT_SECS for extended announcement duration.
1228+
1229+
endmenu
1230+
12191231
endmenu

src/platform/ESP32/BLEManagerImpl.h

+4-7
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ class BLEManagerImpl final : public BLEManager,
234234
kFastAdvertisingEnabled = 0x0200, /**< The application has enabled fast advertising. */
235235
kUseCustomDeviceName = 0x0400, /**< The application has configured a custom BLE device name. */
236236
kAdvertisingRefreshNeeded = 0x0800, /**< The advertising configuration/state in ESP BLE layer needs to be updated. */
237+
kExtAdvertisingEnabled = 0x1000, /**< The application has enabled Extended BLE announcement. */
237238
};
238239

239240
enum
@@ -300,13 +301,9 @@ class BLEManagerImpl final : public BLEManager,
300301
CHIP_ERROR InitESPBleLayer(void);
301302
CHIP_ERROR ConfigureAdvertisingData(void);
302303
CHIP_ERROR StartAdvertising(void);
303-
304-
static constexpr System::Clock::Timeout kFastAdvertiseTimeout =
305-
System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
306-
System::Clock::Timestamp mAdvertiseStartTime;
307-
308-
static void HandleFastAdvertisementTimer(System::Layer * systemLayer, void * context);
309-
void HandleFastAdvertisementTimer();
304+
void StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs);
305+
void CancelBleAdvTimeoutTimer(void);
306+
static void BleAdvTimeoutHandler(TimerHandle_t xTimer);
310307

311308
#if CONFIG_BT_BLUEDROID_ENABLED
312309
void HandleGATTControlEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t * param);

src/platform/ESP32/CHIPDevicePlatformConfig.h

+1
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
#define CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS CONFIG_CHIP_DISCOVERY_TIMEOUT_SECS
106106
#define CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE CONFIG_ENABLE_ESP32_BLE_CONTROLLER
107107
#define CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART
108+
#define CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING CONFIG_ENABLE_BLE_EXT_ANNOUNCEMENT
108109

109110
// Options for background chip task
110111
#define CHIP_DEVICE_CONFIG_ENABLE_BG_EVENT_PROCESSING CONFIG_ENABLE_BG_EVENT_PROCESSING

src/platform/ESP32/nimble/BLEManagerImpl.cpp

+85-15
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ namespace Internal {
7676

7777
namespace {
7878

79+
TimerHandle_t sbleAdvTimeoutTimer; // FreeRTOS sw timer.
7980
#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER
8081
static constexpr uint16_t kNewConnectionScanTimeout = 60;
8182
static constexpr uint16_t kConnectTimeout = 20;
@@ -123,8 +124,6 @@ uint8_t own_addr_type = BLE_OWN_ADDR_RANDOM;
123124
ChipDeviceScanner & mDeviceScanner = Internal::ChipDeviceScanner::GetInstance();
124125
#endif
125126
BLEManagerImpl BLEManagerImpl::sInstance;
126-
constexpr System::Clock::Timeout BLEManagerImpl::kFastAdvertiseTimeout;
127-
128127
const struct ble_gatt_svc_def BLEManagerImpl::CHIPoBLEGATTAttrs[] = {
129128
{ .type = BLE_GATT_SVC_TYPE_PRIMARY,
130129
.uuid = (ble_uuid_t *) (&ShortUUID_CHIPoBLEService),
@@ -221,6 +220,14 @@ CHIP_ERROR BLEManagerImpl::_Init()
221220
#endif
222221
SuccessOrExit(err);
223222

223+
// Create FreeRTOS sw timer for BLE timeouts and interval change.
224+
sbleAdvTimeoutTimer = xTimerCreate("BleAdvTimer", // Just a text name, not used by the RTOS kernel
225+
1, // == default timer period
226+
false, // no timer reload (==one-shot)
227+
(void *) this, // init timer id = ble obj context
228+
BleAdvTimeoutHandler // timer callback handler
229+
);
230+
224231
mRXCharAttrHandle = 0;
225232
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
226233
mC3CharAttrHandle = 0;
@@ -254,8 +261,7 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
254261

255262
if (val)
256263
{
257-
mAdvertiseStartTime = System::SystemClock().GetMonotonicTimestamp();
258-
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(kFastAdvertiseTimeout, HandleFastAdvertisementTimer, this));
264+
StartBleAdvTimeoutTimer(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
259265
}
260266

261267
mFlags.Set(Flags::kFastAdvertisingEnabled, val);
@@ -267,21 +273,31 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
267273
return err;
268274
}
269275

270-
void BLEManagerImpl::HandleFastAdvertisementTimer(System::Layer * systemLayer, void * context)
271-
{
272-
static_cast<BLEManagerImpl *>(context)->HandleFastAdvertisementTimer();
273-
}
274-
275-
void BLEManagerImpl::HandleFastAdvertisementTimer()
276+
void BLEManagerImpl::BleAdvTimeoutHandler(TimerHandle_t xTimer)
276277
{
277-
System::Clock::Timestamp currentTimestamp = System::SystemClock().GetMonotonicTimestamp();
278+
if (BLEMgrImpl().mFlags.Has(Flags::kFastAdvertisingEnabled))
279+
{
280+
ChipLogProgress(DeviceLayer, "bleAdv Timeout : Start slow advertisement");
281+
BLEMgrImpl().mFlags.Set(Flags::kFastAdvertisingEnabled, 0);
282+
BLEMgrImpl().mFlags.Set(Flags::kAdvertisingRefreshNeeded, 1);
278283

279-
if (currentTimestamp - mAdvertiseStartTime >= kFastAdvertiseTimeout)
284+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
285+
BLEMgrImpl().mFlags.Clear(Flags::kExtAdvertisingEnabled);
286+
BLEMgrImpl().StartBleAdvTimeoutTimer(CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS);
287+
#endif
288+
PlatformMgr().ScheduleWork(DriveBLEState, 0);
289+
}
290+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
291+
else
280292
{
281-
mFlags.Set(Flags::kFastAdvertisingEnabled, 0);
282-
mFlags.Set(Flags::kAdvertisingRefreshNeeded, 1);
293+
ChipLogProgress(DeviceLayer, "bleAdv Timeout : Start extended advertisement");
294+
BLEMgrImpl().mFlags.Set(Flags::kAdvertising);
295+
BLEMgrImpl().mFlags.Set(Flags::kExtAdvertisingEnabled);
296+
BLEMgr().SetAdvertisingMode(BLEAdvertisingMode::kSlowAdvertising);
297+
BLEMgrImpl().mFlags.Set(Flags::kAdvertisingRefreshNeeded, 1);
283298
PlatformMgr().ScheduleWork(DriveBLEState, 0);
284299
}
300+
#endif
285301
}
286302

287303
CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode)
@@ -690,6 +706,28 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
690706
return CHIP_ERROR(ChipError::Range::kPlatform, CHIP_DEVICE_CONFIG_ESP32_BLE_ERROR_MIN + bleErr);
691707
}
692708
}
709+
void BLEManagerImpl::CancelBleAdvTimeoutTimer(void)
710+
{
711+
if (xTimerStop(sbleAdvTimeoutTimer, pdMS_TO_TICKS(0)) == pdFAIL)
712+
{
713+
ChipLogError(DeviceLayer, "Failed to stop BledAdv timeout timer");
714+
}
715+
}
716+
void BLEManagerImpl::StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs)
717+
{
718+
if (xTimerIsTimerActive(sbleAdvTimeoutTimer))
719+
{
720+
CancelBleAdvTimeoutTimer();
721+
}
722+
723+
// timer is not active, change its period to required value (== restart).
724+
// FreeRTOS- Block for a maximum of 100 ticks if the change period command
725+
// cannot immediately be sent to the timer command queue.
726+
if (xTimerChangePeriod(sbleAdvTimeoutTimer, pdMS_TO_TICKS(aTimeoutInMs), pdMS_TO_TICKS(100)) != pdPASS)
727+
{
728+
ChipLogError(DeviceLayer, "Failed to start BledAdv timeout timer");
729+
}
730+
}
693731
void BLEManagerImpl::DriveBLEState(void)
694732
{
695733
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -977,8 +1015,25 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
9771015
ExitNow();
9781016
}
9791017

1018+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
1019+
// Check for extended advertisement interval and redact VID/PID if past the initial period.
1020+
if (mFlags.Has(Flags::kExtAdvertisingEnabled))
1021+
{
1022+
deviceIdInfo.SetVendorId(0);
1023+
deviceIdInfo.SetProductId(0);
1024+
deviceIdInfo.SetExtendedAnnouncementFlag(true);
1025+
}
1026+
#endif
1027+
9801028
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
981-
deviceIdInfo.SetAdditionalDataFlag(true);
1029+
if (!mFlags.Has(Flags::kExtAdvertisingEnabled))
1030+
{
1031+
deviceIdInfo.SetAdditionalDataFlag(true);
1032+
}
1033+
else
1034+
{
1035+
deviceIdInfo.SetAdditionalDataFlag(false);
1036+
}
9821037
#endif
9831038

9841039
VerifyOrExit(index + sizeof(deviceIdInfo) <= sizeof(advData), err = CHIP_ERROR_OUTBOUND_MESSAGE_TOO_BIG);
@@ -1565,8 +1620,23 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
15651620
}
15661621
else
15671622
{
1623+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
1624+
if (!mFlags.Has(Flags::kExtAdvertisingEnabled))
1625+
{
1626+
adv_params.itvl_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1627+
adv_params.itvl_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1628+
}
1629+
else
1630+
{
1631+
adv_params.itvl_min = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
1632+
adv_params.itvl_max = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
1633+
}
1634+
#else
1635+
15681636
adv_params.itvl_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
15691637
adv_params.itvl_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1638+
1639+
#endif
15701640
}
15711641

15721642
ChipLogProgress(DeviceLayer, "Configuring CHIPoBLE advertising (interval %" PRIu32 " ms, %sconnectable)",

0 commit comments

Comments
 (0)