[Fabric-Sync] Fix failing to pair sync device (#36510)
* Fix failing to pair sync device
* Address review comments
* Address review commment
diff --git a/examples/fabric-sync/admin/DeviceManager.cpp b/examples/fabric-sync/admin/DeviceManager.cpp
index 69aa0a5..f968529 100644
--- a/examples/fabric-sync/admin/DeviceManager.cpp
+++ b/examples/fabric-sync/admin/DeviceManager.cpp
@@ -450,13 +450,14 @@
for (const auto & endpoint : addedEndpoints)
{
// print to console
- fprintf(stderr, "A new device is added on Endpoint: %u\n", endpoint);
+ fprintf(stderr, "A new endpoint %u is added on the remote bridge\n", endpoint);
}
// Process removed endpoints
for (const auto & endpoint : removedEndpoints)
{
- ChipLogProgress(NotSpecified, "Endpoint removed: %u", endpoint);
+ // print to console
+ fprintf(stderr, "Endpoint %u removed from the remote bridge\n", endpoint);
SyncedDevice * device = FindDeviceByEndpoint(endpoint);
diff --git a/examples/fabric-sync/admin/PairingManager.cpp b/examples/fabric-sync/admin/PairingManager.cpp
index ba36005..954680f 100644
--- a/examples/fabric-sync/admin/PairingManager.cpp
+++ b/examples/fabric-sync/admin/PairingManager.cpp
@@ -467,6 +467,11 @@
self->mPairingDelegate->OnDeviceRemoved(nodeId, err);
self->SetPairingDelegate(nullptr);
}
+
+ FabricIndex fabricIndex = self->CurrentCommissioner().GetFabricIndex();
+ app::InteractionModelEngine::GetInstance()->ShutdownSubscriptions(fabricIndex, nodeId);
+ ScopedNodeId scopedNodeId(nodeId, fabricIndex);
+ DeviceManager::Instance().RemoveSyncedDevice(scopedNodeId);
}
else
{
diff --git a/examples/fabric-sync/bridge/src/Bridge.cpp b/examples/fabric-sync/bridge/src/Bridge.cpp
index 3d0a4af..7705099 100644
--- a/examples/fabric-sync/bridge/src/Bridge.cpp
+++ b/examples/fabric-sync/bridge/src/Bridge.cpp
@@ -45,6 +45,83 @@
namespace {
+class AdministratorCommissioningCommandHandler : public CommandHandlerInterface
+{
+public:
+ // Register for the AdministratorCommissioning cluster on all endpoints.
+ AdministratorCommissioningCommandHandler() :
+ CommandHandlerInterface(Optional<EndpointId>::Missing(), AdministratorCommissioning::Id)
+ {}
+
+ void InvokeCommand(HandlerContext & handlerContext) override;
+};
+
+void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & handlerContext)
+{
+ using Protocols::InteractionModel::Status;
+
+ EndpointId endpointId = handlerContext.mRequestPath.mEndpointId;
+
+ if (handlerContext.mRequestPath.mCommandId != AdministratorCommissioning::Commands::OpenCommissioningWindow::Id ||
+ endpointId == kRootEndpointId)
+ {
+ // Proceed with default handling in Administrator Commissioning Server
+ return;
+ }
+
+ ChipLogProgress(NotSpecified, "Received command to open commissioning window on Endpoint: %d", endpointId);
+
+ handlerContext.SetCommandHandled();
+
+ AdministratorCommissioning::Commands::OpenCommissioningWindow::DecodableType commandData;
+ if (DataModel::Decode(handlerContext.mPayload, commandData) != CHIP_NO_ERROR)
+ {
+ handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, Status::InvalidCommand);
+ return;
+ }
+
+ Status status = Status::Failure;
+ BridgedDevice * device = BridgedDeviceManager::Instance().GetDevice(endpointId);
+ FabricAdminDelegate * adminDelegate = FabricBridge::Instance().GetDelegate();
+
+ if (!device)
+ {
+ ChipLogError(NotSpecified, "Commissioning window failed to open: device is null");
+ return;
+ }
+
+ if (!adminDelegate)
+ {
+ ChipLogError(NotSpecified, "Commissioning window failed to open: adminDelegate is null");
+ return;
+ }
+
+ auto nodeId = device->GetScopedNodeId().GetNodeId();
+ auto fabricIndex = device->GetScopedNodeId().GetFabricIndex();
+
+ Controller::CommissioningWindowVerifierParams params;
+ params.SetNodeId(nodeId)
+ .SetTimeout(commandData.commissioningTimeout)
+ .SetDiscriminator(commandData.discriminator)
+ .SetIteration(commandData.iterations)
+ .SetSalt(commandData.salt)
+ .SetVerifier(commandData.PAKEPasscodeVerifier);
+
+ CHIP_ERROR err = adminDelegate->OpenCommissioningWindow(params, fabricIndex);
+
+ if (err == CHIP_NO_ERROR)
+ {
+ ChipLogProgress(NotSpecified, "Commissioning window is now open");
+ status = Status::Success;
+ }
+ else
+ {
+ ChipLogError(NotSpecified, "Failed to open commissioning window. Error: %" CHIP_ERROR_FORMAT, err.Format());
+ }
+
+ handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status);
+}
+
class BridgedDeviceInformationCommandHandler : public CommandHandlerInterface
{
public:
@@ -115,6 +192,7 @@
BridgedAdministratorCommissioning gBridgedAdministratorCommissioning;
BridgedDeviceBasicInformationImpl gBridgedDeviceBasicInformationAttributes;
+AdministratorCommissioningCommandHandler gAdministratorCommissioningCommandHandler;
BridgedDeviceInformationCommandHandler gBridgedDeviceInformationCommandHandler;
} // namespace
@@ -122,6 +200,7 @@
CHIP_ERROR BridgeInit(FabricAdminDelegate * delegate)
{
MatterEcosystemInformationPluginServerInitCallback();
+ CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gAdministratorCommissioningCommandHandler);
CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gBridgedDeviceInformationCommandHandler);
AttributeAccessInterfaceRegistry::Instance().Register(&gBridgedDeviceBasicInformationAttributes);