Skip to content

Commit 44c193e

Browse files
[nrf noup] BLE Extended Advertisement option
This commit implements solution for new config CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING which allow device to be visibly longer for the commissioning. Signed-off-by: Patryk Lipinski <patryk.lipinski@nordicsemi.no>
1 parent 854bbf3 commit 44c193e

10 files changed

+114
-33
lines changed

config/zephyr/Kconfig

+17
Original file line numberDiff line numberDiff line change
@@ -520,4 +520,21 @@ config CHIP_OTA_IMAGE_EXTRA_ARGS
520520

521521
endif
522522

523+
config CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
524+
bool "Allow to extend advertising time longer than 15min"
525+
help
526+
Enable BLE extended advertising.
527+
If this config is true,
528+
CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS can be set up to 48h.
529+
530+
config CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_MINUTES
531+
int "Configures commissioning tiemout"
532+
range 15 2880 if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
533+
range 0 15
534+
default 15
535+
help
536+
Specify how long the device will be in the commisioning modes in seconds.
537+
If CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING is set false,
538+
maximal commisioning time is 15 minutes, if true can be extended up to 48h.
539+
523540
endif

src/app/server/CommissioningWindowManager.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ void CommissioningWindowManager::OnSessionEstablished(const SessionHandle & sess
216216
}
217217
}
218218

219-
CHIP_ERROR CommissioningWindowManager::OpenCommissioningWindow(Seconds16 commissioningTimeout)
219+
CHIP_ERROR CommissioningWindowManager::OpenCommissioningWindow(Seconds32 commissioningTimeout)
220220
{
221221
VerifyOrReturnError(commissioningTimeout <= MaxCommissioningTimeout() && commissioningTimeout >= MinCommissioningTimeout(),
222222
CHIP_ERROR_INVALID_ARGUMENT);
@@ -276,7 +276,7 @@ CHIP_ERROR CommissioningWindowManager::AdvertiseAndListenForPASE()
276276
return CHIP_NO_ERROR;
277277
}
278278

279-
CHIP_ERROR CommissioningWindowManager::OpenBasicCommissioningWindow(Seconds16 commissioningTimeout,
279+
CHIP_ERROR CommissioningWindowManager::OpenBasicCommissioningWindow(Seconds32 commissioningTimeout,
280280
CommissioningWindowAdvertisement advertisementMode)
281281
{
282282
RestoreDiscriminator();
@@ -304,7 +304,7 @@ CHIP_ERROR CommissioningWindowManager::OpenBasicCommissioningWindow(Seconds16 co
304304

305305
CHIP_ERROR
306306
CommissioningWindowManager::OpenBasicCommissioningWindowForAdministratorCommissioningCluster(
307-
System::Clock::Seconds16 commissioningTimeout, FabricIndex fabricIndex, VendorId vendorId)
307+
System::Clock::Seconds32 commissioningTimeout, FabricIndex fabricIndex, VendorId vendorId)
308308
{
309309
ReturnErrorOnFailure(OpenBasicCommissioningWindow(commissioningTimeout, CommissioningWindowAdvertisement::kDnssdOnly));
310310

@@ -314,7 +314,7 @@ CommissioningWindowManager::OpenBasicCommissioningWindowForAdministratorCommissi
314314
return CHIP_NO_ERROR;
315315
}
316316

317-
CHIP_ERROR CommissioningWindowManager::OpenEnhancedCommissioningWindow(Seconds16 commissioningTimeout, uint16_t discriminator,
317+
CHIP_ERROR CommissioningWindowManager::OpenEnhancedCommissioningWindow(Seconds32 commissioningTimeout, uint16_t discriminator,
318318
Spake2pVerifier & verifier, uint32_t iterations,
319319
ByteSpan salt, FabricIndex fabricIndex, VendorId vendorId)
320320
{

src/app/server/CommissioningWindowManager.h

+11-11
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,21 @@ class CommissioningWindowManager : public Messaging::UnsolicitedMessageHandler,
5757
return CHIP_NO_ERROR;
5858
}
5959

60-
static constexpr System::Clock::Seconds16 MaxCommissioningTimeout()
60+
static constexpr System::Clock::Seconds32 MaxCommissioningTimeout()
6161
{
6262
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
6363
// Specification section 2.3.1 - Extended Announcement Duration up to 48h
64-
return System::Clock::Seconds16(60 * 60 * 48);
64+
return System::Clock::Seconds32(60 * 60 * 48);
6565
#else
6666
// Specification section 5.4.2.3. Announcement Duration says 15 minutes.
67-
return System::Clock::Seconds16(15 * 60);
67+
return System::Clock::Seconds32(15 * 60);
6868
#endif
6969
}
7070

71-
System::Clock::Seconds16 MinCommissioningTimeout() const
71+
System::Clock::Seconds32 MinCommissioningTimeout() const
7272
{
7373
// Specification section 5.4.2.3. Announcement Duration says 3 minutes.
74-
return mMinCommissioningTimeoutOverride.ValueOr(System::Clock::Seconds16(3 * 60));
74+
return mMinCommissioningTimeoutOverride.ValueOr(System::Clock::Seconds32(3 * 60));
7575
}
7676

7777
void SetAppDelegate(AppDelegate * delegate) { mAppDelegate = delegate; }
@@ -81,18 +81,18 @@ class CommissioningWindowManager : public Messaging::UnsolicitedMessageHandler,
8181
*/
8282
CHIP_ERROR
8383
OpenBasicCommissioningWindow(
84-
System::Clock::Seconds16 commissioningTimeout = System::Clock::Seconds16(CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS),
84+
System::Clock::Seconds32 commissioningTimeout = System::Clock::Seconds32(CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS),
8585
CommissioningWindowAdvertisement advertisementMode = chip::CommissioningWindowAdvertisement::kAllSupported);
8686

8787
/**
8888
* Open the pairing window using default configured parameters, triggered by
8989
* the Administrator Commmissioning cluster implementation.
9090
*/
9191
CHIP_ERROR
92-
OpenBasicCommissioningWindowForAdministratorCommissioningCluster(System::Clock::Seconds16 commissioningTimeout,
92+
OpenBasicCommissioningWindowForAdministratorCommissioningCluster(System::Clock::Seconds32 commissioningTimeout,
9393
FabricIndex fabricIndex, VendorId vendorId);
9494

95-
CHIP_ERROR OpenEnhancedCommissioningWindow(System::Clock::Seconds16 commissioningTimeout, uint16_t discriminator,
95+
CHIP_ERROR OpenEnhancedCommissioningWindow(System::Clock::Seconds32 commissioningTimeout, uint16_t discriminator,
9696
Spake2pVerifier & verifier, uint32_t iterations, chip::ByteSpan salt,
9797
FabricIndex fabricIndex, VendorId vendorId);
9898

@@ -127,7 +127,7 @@ class CommissioningWindowManager : public Messaging::UnsolicitedMessageHandler,
127127

128128
// For tests only, allow overriding the spec-defined minimum value of the
129129
// commissioning window timeout.
130-
void OverrideMinCommissioningTimeout(System::Clock::Seconds16 timeout) { mMinCommissioningTimeoutOverride.SetValue(timeout); }
130+
void OverrideMinCommissioningTimeout(System::Clock::Seconds32 timeout) { mMinCommissioningTimeoutOverride.SetValue(timeout); }
131131

132132
private:
133133
//////////// SessionDelegate Implementation ///////////////
@@ -145,7 +145,7 @@ class CommissioningWindowManager : public Messaging::UnsolicitedMessageHandler,
145145

146146
// Start a timer that will call HandleCommissioningWindowTimeout, and then
147147
// start advertising and listen for PASE.
148-
CHIP_ERROR OpenCommissioningWindow(System::Clock::Seconds16 commissioningTimeout);
148+
CHIP_ERROR OpenCommissioningWindow(System::Clock::Seconds32 commissioningTimeout);
149149

150150
// Start advertising and listening for PASE connections. Should only be
151151
// called when a commissioning window timeout timer is running.
@@ -218,7 +218,7 @@ class CommissioningWindowManager : public Messaging::UnsolicitedMessageHandler,
218218

219219
// For tests only, so that we can test the commissioning window timeout
220220
// without having to wait 3 minutes.
221-
Optional<System::Clock::Seconds16> mMinCommissioningTimeoutOverride;
221+
Optional<System::Clock::Seconds32> mMinCommissioningTimeoutOverride;
222222

223223
// The PASE session we are using, so we can handle CloseSession properly.
224224
SessionHolderWithDelegate mPASESession;

src/app/tests/TestCommissionManager.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ void CheckCommissioningWindowManagerWindowTimeoutTask(intptr_t context)
234234
NL_TEST_ASSERT(suite, !sAdminVendorIdDirty);
235235

236236
CommissioningWindowManager & commissionMgr = Server::GetInstance().GetCommissioningWindowManager();
237-
constexpr auto kTimeoutSeconds = chip::System::Clock::Seconds16(1);
237+
constexpr auto kTimeoutSeconds = chip::System::Clock::Seconds32(1);
238238
constexpr uint16_t kTimeoutMs = 1000;
239239
constexpr unsigned kSleepPadding = 100;
240240
commissionMgr.OverrideMinCommissioningTimeout(kTimeoutSeconds);

src/include/platform/CHIPDeviceConfig.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@
514514
*
515515
*/
516516
#ifndef CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART
517-
#define CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART 1
517+
#define CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART 0
518518
#endif
519519

520520
/**

src/include/platform/ConnectivityManager.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ class ConnectivityManager
147147

148148
enum BLEAdvertisingMode
149149
{
150-
kFastAdvertising = 0,
151-
kSlowAdvertising = 1,
150+
kFastAdvertising = 0,
151+
kSlowAdvertising = 1,
152+
kExtendedAdvertising = 2,
152153
};
153154

154155
enum class SEDIntervalMode

src/platform/Zephyr/BLEManagerImpl.cpp

+58-13
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ BLEManagerImpl BLEManagerImpl::sInstance;
161161
CHIP_ERROR BLEManagerImpl::_Init()
162162
{
163163
int err = 0;
164-
int id = 0;
164+
int id = 0;
165165

166166
mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled;
167167
mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART);
@@ -293,18 +293,39 @@ inline CHIP_ERROR BLEManagerImpl::PrepareAdvertisingRequest()
293293
Encoding::LittleEndian::Put16(serviceData.uuid, UUID16_CHIPoBLEService.val);
294294
ReturnErrorOnFailure(ConfigurationMgr().GetBLEDeviceIdentificationInfo(serviceData.deviceIdInfo));
295295

296+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
297+
if (mFlags.Has(Flags::kExtendedAdvertisingEnabled))
298+
{
299+
serviceData.deviceIdInfo.SetVendorId(DEVICE_HANDLE_NULL);
300+
serviceData.deviceIdInfo.SetProductId(DEVICE_HANDLE_NULL);
301+
serviceData.deviceIdInfo.SetExtendedAnnouncementFlag(true);
302+
}
303+
#endif
304+
296305
advertisingData[0] = BT_DATA(BT_DATA_FLAGS, &kAdvertisingFlags, sizeof(kAdvertisingFlags));
297306
advertisingData[1] = BT_DATA(BT_DATA_SVC_DATA16, &serviceData, sizeof(serviceData));
298307
scanResponseData[0] = BT_DATA(BT_DATA_NAME_COMPLETE, name, nameSize);
299308

300-
mAdvertisingRequest.priority = CHIP_DEVICE_BLE_ADVERTISING_PRIORITY;
301-
mAdvertisingRequest.options = kAdvertisingOptions;
302-
mAdvertisingRequest.minInterval = mFlags.Has(Flags::kFastAdvertisingEnabled)
303-
? CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN
304-
: CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
305-
mAdvertisingRequest.maxInterval = mFlags.Has(Flags::kFastAdvertisingEnabled)
306-
? CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX
307-
: CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
309+
mAdvertisingRequest.priority = CHIP_DEVICE_BLE_ADVERTISING_PRIORITY;
310+
mAdvertisingRequest.options = kAdvertisingOptions;
311+
312+
if (mFlags.Has(Flags::kFastAdvertisingEnabled))
313+
{
314+
mAdvertisingRequest.minInterval = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN;
315+
mAdvertisingRequest.maxInterval = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX;
316+
}
317+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
318+
else if (mFlags.Has(Flags::kExtendedAdvertisingEnabled))
319+
{
320+
mAdvertisingRequest.minInterval = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
321+
mAdvertisingRequest.maxInterval = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
322+
}
323+
#endif
324+
else
325+
{
326+
mAdvertisingRequest.minInterval = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
327+
mAdvertisingRequest.maxInterval = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
328+
}
308329
mAdvertisingRequest.advertisingData = Span<bt_data>(advertisingData);
309330
mAdvertisingRequest.scanResponseData = nameSize ? Span<bt_data>(scanResponseData) : Span<bt_data>{};
310331

@@ -363,10 +384,17 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising()
363384

364385
if (mFlags.Has(Flags::kFastAdvertisingEnabled))
365386
{
366-
// Start timer to change advertising interval.
387+
// Start timer to change advertising interval from fast to slow.
367388
DeviceLayer::SystemLayer().StartTimer(
368389
System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME),
369-
HandleBLEAdvertisementIntervalChange, this);
390+
HandleSlowBLEAdvertisementInterval, this);
391+
392+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
393+
// Start timer to change advertising interval from slow to extended.
394+
DeviceLayer::SystemLayer().StartTimer(
395+
System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS),
396+
HandleExtendedBLEAdvertisementInterval, this);
397+
#endif
370398
}
371399
}
372400

@@ -383,6 +411,10 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising()
383411
mFlags.Clear(Flags::kAdvertising);
384412
mFlags.Set(Flags::kFastAdvertisingEnabled, true);
385413

414+
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
415+
mFlags.Clear(Flags::kExtendedAdvertisingEnabled);
416+
#endif
417+
386418
ChipLogProgress(DeviceLayer, "CHIPoBLE advertising stopped");
387419

388420
// Post a CHIPoBLEAdvertisingChange(Stopped) event.
@@ -394,7 +426,8 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising()
394426
}
395427

396428
// Cancel timer event changing CHIPoBLE advertisement interval
397-
DeviceLayer::SystemLayer().CancelTimer(HandleBLEAdvertisementIntervalChange, this);
429+
DeviceLayer::SystemLayer().CancelTimer(HandleSlowBLEAdvertisementInterval, this);
430+
DeviceLayer::SystemLayer().CancelTimer(HandleExtendedBLEAdvertisementInterval, this);
398431
}
399432

400433
return CHIP_NO_ERROR;
@@ -419,8 +452,14 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode)
419452
{
420453
case BLEAdvertisingMode::kFastAdvertising:
421454
mFlags.Set(Flags::kFastAdvertisingEnabled, true);
455+
mFlags.Set(Flags::kExtendedAdvertisingEnabled, false);
422456
break;
423457
case BLEAdvertisingMode::kSlowAdvertising:
458+
mFlags.Set(Flags::kFastAdvertisingEnabled, false);
459+
mFlags.Set(Flags::kExtendedAdvertisingEnabled, false);
460+
break;
461+
case BLEAdvertisingMode::kExtendedAdvertising:
462+
mFlags.Set(Flags::kExtendedAdvertisingEnabled, true);
424463
mFlags.Set(Flags::kFastAdvertisingEnabled, false);
425464
break;
426465
default:
@@ -607,12 +646,18 @@ CHIP_ERROR BLEManagerImpl::PrepareC3CharData()
607646
}
608647
#endif
609648

610-
void BLEManagerImpl::HandleBLEAdvertisementIntervalChange(System::Layer * layer, void * param)
649+
void BLEManagerImpl::HandleSlowBLEAdvertisementInterval(System::Layer * layer, void * param)
611650
{
612651
BLEMgr().SetAdvertisingMode(BLEAdvertisingMode::kSlowAdvertising);
613652
ChipLogProgress(DeviceLayer, "CHIPoBLE advertising mode changed to slow");
614653
}
615654

655+
void BLEManagerImpl::HandleExtendedBLEAdvertisementInterval(System::Layer * layer, void * param)
656+
{
657+
BLEMgr().SetAdvertisingMode(BLEAdvertisingMode::kExtendedAdvertising);
658+
ChipLogProgress(DeviceLayer, "CHIPoBLE advertising mode changed to extended");
659+
}
660+
616661
void BLEManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
617662
{
618663
CHIP_ERROR err = CHIP_NO_ERROR;

src/platform/Zephyr/BLEManagerImpl.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla
9191
kAdvertisingRefreshNeeded =
9292
0x0010, /**< The advertising state/configuration has changed, but the SoftDevice has yet to be updated. */
9393
kChipoBleGattServiceRegister = 0x0020, /**< The system has currently CHIPoBLE GATT service registered. */
94+
kExtendedAdvertisingEnabled = 0x0040, /**< The appliaction enabled extended advertising*/
9495
};
9596

9697
struct ServiceData;
@@ -131,7 +132,8 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla
131132
static void HandleTXIndicated(bt_conn * conn, bt_gatt_indicate_params * attr, uint8_t err);
132133
static void HandleConnect(bt_conn * conn, uint8_t err);
133134
static void HandleDisconnect(bt_conn * conn, uint8_t reason);
134-
static void HandleBLEAdvertisementIntervalChange(System::Layer * layer, void * param);
135+
static void HandleSlowBLEAdvertisementInterval(System::Layer * layer, void * param);
136+
static void HandleExtendedBLEAdvertisementInterval(System::Layer * layer, void * param);
135137

136138
// ===== Members for internal use by the following friends.
137139

src/platform/Zephyr/CHIPDevicePlatformConfig.h

+8
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,11 @@
130130
#ifdef CONFIG_CHIP_EXTENDED_DISCOVERY
131131
#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1
132132
#endif // CONFIG_CHIP_EXTENDED_DISCOVERY
133+
134+
#ifdef CONFIG_CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
135+
#define CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING 1
136+
#endif // CONFIG_CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
137+
138+
#ifdef CONFIG_CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_MINUTES
139+
#define CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS CONFIG_CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_MINUTES * 60
140+
#endif // CONFIG_CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_MINUTES

src/platform/nrfconnect/CHIPDevicePlatformConfig.h

+8
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,14 @@
270270
#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1
271271
#endif // CONFIG_CHIP_EXTENDED_DISCOVERY
272272

273+
#ifdef CONFIG_CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
274+
#define CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING 1
275+
#endif // CONFIG_CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
276+
277+
#ifdef CONFIG_CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_MINUTES
278+
#define CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS CONFIG_CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_MINUTES * 60
279+
#endif // CONFIG_CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_MINUTES
280+
273281
#ifndef CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH
274282
#ifdef CONFIG_CHIP_FACTORY_DATA
275283
// UID will be copied from the externally programmed factory data, so we don't know the actual length and we need to assume some max

0 commit comments

Comments
 (0)