Skip to content

Commit c56d0f0

Browse files
authored
[Fabric-Sync] Set remote bridge after reverse pair the bridge device (project-chip#36509)
* Set remote bridge after reverse pair the bridge device * Address review comment
1 parent 83828f5 commit c56d0f0

File tree

6 files changed

+55
-15
lines changed

6 files changed

+55
-15
lines changed

examples/fabric-sync/admin/DeviceManager.cpp

+13-5
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,7 @@ void DeviceManager::UpdateLastUsedNodeId(NodeId nodeId)
7272
void DeviceManager::SetRemoteBridgeNodeId(chip::NodeId nodeId)
7373
{
7474
mRemoteBridgeNodeId = nodeId;
75-
76-
if (mRemoteBridgeNodeId != kUndefinedNodeId)
77-
{
78-
mCommissionerControl.Init(PairingManager::Instance().CurrentCommissioner(), mRemoteBridgeNodeId, kAggregatorEndpointId);
79-
}
75+
ChipLogProgress(NotSpecified, "Set remote bridge NodeId:" ChipLogFormatX64, ChipLogValueX64(mRemoteBridgeNodeId));
8076
}
8177

8278
void DeviceManager::AddSyncedDevice(const SyncedDevice & device)
@@ -131,6 +127,18 @@ void DeviceManager::RemoveSyncedDevice(chip::ScopedNodeId scopedNodeId)
131127
ChipLogValueX64(device->GetNodeId()), device->GetEndpointId());
132128
}
133129

130+
void DeviceManager::InitCommissionerControl()
131+
{
132+
if (mRemoteBridgeNodeId != kUndefinedNodeId)
133+
{
134+
mCommissionerControl.Init(PairingManager::Instance().CurrentCommissioner(), mRemoteBridgeNodeId, kAggregatorEndpointId);
135+
}
136+
else
137+
{
138+
ChipLogError(NotSpecified, "Failed to initialize the Commissioner Control delegate");
139+
}
140+
}
141+
134142
void DeviceManager::OpenLocalBridgeCommissioningWindow(uint32_t iterations, uint16_t commissioningTimeoutSec,
135143
uint16_t discriminator, const ByteSpan & salt, const ByteSpan & verifier)
136144
{

examples/fabric-sync/admin/DeviceManager.h

+5
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ class DeviceManager
7676

7777
void RemoveSyncedDevice(chip::ScopedNodeId scopedNodeId);
7878

79+
/**
80+
* @brief Initializes the CommissionerControl for fabric sync setup process.
81+
*/
82+
void InitCommissionerControl();
83+
7984
/**
8085
* @brief Determines whether a given nodeId corresponds to the remote bridge device.
8186
*

examples/fabric-sync/admin/FabricAdmin.cpp

+25-2
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,14 @@ FabricAdmin::CommissionRemoteBridge(Controller::CommissioningWindowPasscodeParam
8686

8787
if (err == CHIP_NO_ERROR)
8888
{
89-
NodeId nodeId = DeviceManager::Instance().GetNextAvailableNodeId();
89+
mNodeId = DeviceManager::Instance().GetNextAvailableNodeId();
9090

9191
// After responding with RequestCommissioningApproval to the node where the client initiated the
9292
// RequestCommissioningApproval, you need to wait for it to open a commissioning window on its bridge.
9393
usleep(kCommissionPrepareTimeMs * 1000);
9494

95-
DeviceManager::Instance().PairRemoteDevice(nodeId, code.c_str());
95+
PairingManager::Instance().SetPairingDelegate(this);
96+
DeviceManager::Instance().PairRemoteDevice(mNodeId, code.c_str());
9697
}
9798
else
9899
{
@@ -115,6 +116,28 @@ CHIP_ERROR FabricAdmin::KeepActive(ScopedNodeId scopedNodeId, uint32_t stayActiv
115116
return CHIP_NO_ERROR;
116117
}
117118

119+
void FabricAdmin::OnCommissioningComplete(NodeId deviceId, CHIP_ERROR err)
120+
{
121+
if (mNodeId != deviceId)
122+
{
123+
ChipLogError(NotSpecified, "Tried to pair a non-bridge device (0x:" ChipLogFormatX64 ") with result: %" CHIP_ERROR_FORMAT,
124+
ChipLogValueX64(deviceId), err.Format());
125+
return;
126+
}
127+
128+
if (err == CHIP_NO_ERROR)
129+
{
130+
DeviceManager::Instance().SetRemoteBridgeNodeId(deviceId);
131+
}
132+
else
133+
{
134+
ChipLogError(NotSpecified, "Failed to pair bridge device (0x:" ChipLogFormatX64 ") with error: %" CHIP_ERROR_FORMAT,
135+
ChipLogValueX64(deviceId), err.Format());
136+
}
137+
138+
mNodeId = kUndefinedNodeId;
139+
}
140+
118141
void FabricAdmin::ScheduleSendingKeepActiveOnCheckIn(ScopedNodeId scopedNodeId, uint32_t stayActiveDurationMs, uint32_t timeoutMs)
119142
{
120143
// Accessing mPendingCheckIn should only be done while holding ChipStackLock

examples/fabric-sync/admin/FabricAdmin.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ struct ScopedNodeIdHasher
3737
}
3838
};
3939

40-
class FabricAdmin final : public bridge::FabricAdminDelegate
40+
class FabricAdmin final : public bridge::FabricAdminDelegate, public PairingDelegate
4141
{
4242
public:
4343
static FabricAdmin & Instance();
@@ -51,6 +51,8 @@ class FabricAdmin final : public bridge::FabricAdminDelegate
5151

5252
CHIP_ERROR KeepActive(chip::ScopedNodeId scopedNodeId, uint32_t stayActiveDurationMs, uint32_t timeoutMs) override;
5353

54+
void OnCommissioningComplete(chip::NodeId deviceId, CHIP_ERROR err) override;
55+
5456
void ScheduleSendingKeepActiveOnCheckIn(chip::ScopedNodeId scopedNodeId, uint32_t stayActiveDurationMs, uint32_t timeoutMs);
5557

5658
private:
@@ -88,7 +90,8 @@ class FabricAdmin final : public bridge::FabricAdminDelegate
8890

8991
static FabricAdmin sInstance;
9092

91-
bool mInitialized = false;
93+
bool mInitialized = false;
94+
chip::NodeId mNodeId = chip::kUndefinedNodeId;
9295

9396
void Init() { mInitialized = true; }
9497
};

examples/fabric-sync/admin/PairingManager.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,12 @@ void PairingManager::OnPairingDeleted(CHIP_ERROR err)
281281

282282
void PairingManager::OnCommissioningComplete(NodeId nodeId, CHIP_ERROR err)
283283
{
284+
if (mPairingDelegate)
285+
{
286+
mPairingDelegate->OnCommissioningComplete(nodeId, err);
287+
SetPairingDelegate(nullptr);
288+
}
289+
284290
if (err == CHIP_NO_ERROR)
285291
{
286292
// print to console
@@ -294,12 +300,6 @@ void PairingManager::OnCommissioningComplete(NodeId nodeId, CHIP_ERROR err)
294300
{
295301
ChipLogProgress(NotSpecified, "Device commissioning Failure: %s", ErrorStr(err));
296302
}
297-
298-
if (mPairingDelegate)
299-
{
300-
mPairingDelegate->OnCommissioningComplete(nodeId, err);
301-
SetPairingDelegate(nullptr);
302-
}
303303
}
304304

305305
void PairingManager::OnReadCommissioningInfo(const Controller::ReadCommissioningInfo & info)

examples/fabric-sync/shell/AddBridgeCommand.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ void AddBridgeCommand::OnCommissioningComplete(NodeId deviceId, CHIP_ERROR err)
5555

5656
admin::DeviceManager::Instance().UpdateLastUsedNodeId(mBridgeNodeId);
5757
admin::DeviceManager::Instance().SubscribeRemoteFabricBridge();
58+
admin::DeviceManager::Instance().InitCommissionerControl();
5859

5960
// After successful commissioning of the Commissionee, initiate Reverse Commissioning
6061
// via the Commissioner Control Cluster. However, we must first verify that the

0 commit comments

Comments
 (0)