Skip to content

Commit 8cb1cb7

Browse files
[Python] CommissionOnNetwork blocked if DUT does not have an open commissoning window (#27646)
* [Python] CommissionOnNetwork blocked if DUT does not have an open commissioning window * optimize interfaces * optimize
1 parent 945b7fa commit 8cb1cb7

4 files changed

+36
-9
lines changed

src/controller/python/ChipDeviceController-ScriptBinding.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ PyChipError pychip_DeviceController_DiscoverCommissionableNodesDeviceType(chip::
165165
PyChipError pychip_DeviceController_DiscoverCommissionableNodesCommissioningEnabled(chip::Controller::DeviceCommissioner * devCtrl);
166166

167167
PyChipError pychip_DeviceController_OnNetworkCommission(chip::Controller::DeviceCommissioner * devCtrl, uint64_t nodeId,
168-
uint32_t setupPasscode, const uint8_t filterType, const char * filterParam);
168+
uint32_t setupPasscode, const uint8_t filterType, const char * filterParam,
169+
uint32_t discoveryTimeoutMsec);
169170

170171
PyChipError pychip_DeviceController_PostTaskOnChipThread(ChipThreadTaskRunnerFunct callback, void * pythonContext);
171172

@@ -440,7 +441,8 @@ PyChipError pychip_DeviceController_UnpairDevice(chip::Controller::DeviceCommiss
440441
}
441442

442443
PyChipError pychip_DeviceController_OnNetworkCommission(chip::Controller::DeviceCommissioner * devCtrl, uint64_t nodeId,
443-
uint32_t setupPasscode, const uint8_t filterType, const char * filterParam)
444+
uint32_t setupPasscode, const uint8_t filterType, const char * filterParam,
445+
uint32_t discoveryTimeoutMsec)
444446
{
445447
Dnssd::DiscoveryFilter filter(static_cast<Dnssd::DiscoveryFilterType>(filterType));
446448
switch (static_cast<Dnssd::DiscoveryFilterType>(filterType))
@@ -475,8 +477,10 @@ PyChipError pychip_DeviceController_OnNetworkCommission(chip::Controller::Device
475477
return ToPyChipError(CHIP_ERROR_INVALID_ARGUMENT);
476478
}
477479

478-
sPairingDeviceDiscoveryDelegate.Init(nodeId, setupPasscode, sCommissioningParameters, &sPairingDelegate, devCtrl);
479-
devCtrl->RegisterDeviceDiscoveryDelegate(&sPairingDeviceDiscoveryDelegate);
480+
sPairingDelegate.SetExpectingPairingComplete(true);
481+
CHIP_ERROR err = sPairingDeviceDiscoveryDelegate.Init(nodeId, setupPasscode, sCommissioningParameters, &sPairingDelegate,
482+
devCtrl, discoveryTimeoutMsec);
483+
VerifyOrReturnError(err == CHIP_NO_ERROR, ToPyChipError(err));
480484
return ToPyChipError(devCtrl->DiscoverCommissionableNodes(filter));
481485
}
482486

src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ void ScriptPairingDeviceDiscoveryDelegate::OnDiscoveredDevice(const Dnssd::Disco
3232
nodeData.resolutionData.ipAddress[0].ToString(buf);
3333
ChipLogProgress(chipTool, "Discovered Device: %s:%u", buf, port);
3434

35+
// Cancel discovery timer.
36+
chip::DeviceLayer::SystemLayer().CancelTimer(OnDiscoveredTimeout, this);
37+
3538
// Stop Mdns discovery.
3639
mActiveDeviceCommissioner->RegisterDeviceDiscoveryDelegate(nullptr);
3740

src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.h

+21-2
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,44 @@
2121
#include "ChipDeviceController-ScriptDevicePairingDelegate.h"
2222

2323
#include <controller/CHIPDeviceController.h>
24+
#include <platform/CHIPDeviceLayer.h>
25+
#include <system/SystemClock.h>
2426

2527
namespace chip {
2628
namespace Controller {
2729

2830
class ScriptPairingDeviceDiscoveryDelegate : public DeviceDiscoveryDelegate
2931
{
3032
public:
31-
void Init(NodeId nodeId, uint32_t setupPasscode, CommissioningParameters commissioningParams,
32-
ScriptDevicePairingDelegate * pairingDelegate, DeviceCommissioner * activeDeviceCommissioner)
33+
CHIP_ERROR Init(NodeId nodeId, uint32_t setupPasscode, CommissioningParameters commissioningParams,
34+
ScriptDevicePairingDelegate * pairingDelegate, DeviceCommissioner * activeDeviceCommissioner,
35+
uint32_t discoveryTimeoutMsec)
3336
{
3437
mNodeId = nodeId;
3538
mSetupPasscode = setupPasscode;
3639
mParams = commissioningParams;
3740
mPairingDelegate = pairingDelegate;
3841
mActiveDeviceCommissioner = activeDeviceCommissioner;
42+
VerifyOrReturnError(mActiveDeviceCommissioner != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
43+
mActiveDeviceCommissioner->RegisterDeviceDiscoveryDelegate(this);
44+
return chip::DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(discoveryTimeoutMsec), OnDiscoveredTimeout,
45+
this);
3946
}
4047
void OnDiscoveredDevice(const Dnssd::DiscoveredNodeData & nodeData);
4148

4249
private:
50+
static void OnDiscoveredTimeout(System::Layer * layer, void * context)
51+
{
52+
ChipLogError(Controller, "Mdns discovery timed out");
53+
auto * self = static_cast<ScriptPairingDeviceDiscoveryDelegate *>(context);
54+
55+
// Stop Mdns discovery.
56+
self->mActiveDeviceCommissioner->RegisterDeviceDiscoveryDelegate(nullptr);
57+
58+
if (self->mPairingDelegate != nullptr)
59+
self->mPairingDelegate->OnPairingComplete(CHIP_ERROR_TIMEOUT);
60+
}
61+
4362
ScriptDevicePairingDelegate * mPairingDelegate;
4463
DeviceCommissioner * mActiveDeviceCommissioner = nullptr;
4564

src/controller/python/chip/ChipDeviceCtrl.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1355,7 +1355,8 @@ def _InitLib(self):
13551355
c_void_p, c_uint64]
13561356
self._dmLib.pychip_DeviceController_Commission.restype = PyChipError
13571357

1358-
self._dmLib.pychip_DeviceController_OnNetworkCommission.argtypes = [c_void_p, c_uint64, c_uint32, c_uint8, c_char_p]
1358+
self._dmLib.pychip_DeviceController_OnNetworkCommission.argtypes = [
1359+
c_void_p, c_uint64, c_uint32, c_uint8, c_char_p, c_uint32]
13591360
self._dmLib.pychip_DeviceController_OnNetworkCommission.restype = PyChipError
13601361

13611362
self._dmLib.pychip_DeviceController_DiscoverCommissionableNodes.argtypes = [
@@ -1662,7 +1663,7 @@ def SetTrustedTimeSource(self, nodeId: int, endpoint: int):
16621663
).raise_on_error()
16631664

16641665
def CommissionOnNetwork(self, nodeId: int, setupPinCode: int,
1665-
filterType: DiscoveryFilterType = DiscoveryFilterType.NONE, filter: typing.Any = None) -> PyChipError:
1666+
filterType: DiscoveryFilterType = DiscoveryFilterType.NONE, filter: typing.Any = None, discoveryTimeoutMsec: int = 30000) -> PyChipError:
16661667
'''
16671668
Does the routine for OnNetworkCommissioning, with a filter for mDNS discovery.
16681669
Supported filters are:
@@ -1693,7 +1694,7 @@ def CommissionOnNetwork(self, nodeId: int, setupPinCode: int,
16931694

16941695
self._ChipStack.CallAsync(
16951696
lambda: self._dmLib.pychip_DeviceController_OnNetworkCommission(
1696-
self.devCtrl, nodeId, setupPinCode, int(filterType), str(filter).encode("utf-8") + b"\x00" if filter is not None else None)
1697+
self.devCtrl, nodeId, setupPinCode, int(filterType), str(filter).encode("utf-8") + b"\x00" if filter is not None else None, discoveryTimeoutMsec)
16971698
)
16981699
if not self._ChipStack.commissioningCompleteEvent.isSet():
16991700
# Error 50 is a timeout

0 commit comments

Comments
 (0)