From a60344e0ea00aee0f06dd58d7a8a8ea13f816e76 Mon Sep 17 00:00:00 2001 From: Yufeng Wang <yufengwang@google.com> Date: Thu, 13 Jun 2024 12:51:27 -0700 Subject: [PATCH 1/2] Overwrite the default implementation of Administrator Commissioning Cluster --- examples/fabric-bridge-app/linux/main.cpp | 51 +++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/examples/fabric-bridge-app/linux/main.cpp b/examples/fabric-bridge-app/linux/main.cpp index 3ad6a5a1b20fe1..b43680f9037619 100644 --- a/examples/fabric-bridge-app/linux/main.cpp +++ b/examples/fabric-bridge-app/linux/main.cpp @@ -36,6 +36,10 @@ using namespace chip; +using namespace chip::app; +using namespace chip::app::Clusters; +using namespace chip::app::Clusters::AdministratorCommissioning; + #define ZCL_DESCRIPTOR_CLUSTER_REVISION (1u) #define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION (2u) #define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP (0u) @@ -97,10 +101,57 @@ void AttemptRpcClientConnect(System::Layer * systemLayer, void * appState) } #endif // defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE +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; + ChipLogProgress(NotSpecified, "Received command to open commissioning window on Endpoind: %d", endpointId); + + if (handlerContext.mRequestPath.mCommandId != Commands::OpenCommissioningWindow::Id || endpointId == kRootEndpointId) + { + // Proceed with default handling in Administrator Commissioning Server + return; + } + + handlerContext.SetCommandHandled(); + Status status = Status::Success; + +#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE + Device * device = DeviceMgr().GetDevice(endpointId); + if (device != nullptr && OpenCommissioningWindow(device->GetNodeId()) == CHIP_NO_ERROR) + { + ChipLogProgress(NotSpecified, "Commissioning window is now open"); + } + else + { + status = Status::Failure; + ChipLogProgress(NotSpecified, "Commissioning window is failed to open"); + } +#endif // defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE + + handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status); +} + +AdministratorCommissioningCommandHandler gAdministratorCommissioningCommandHandler; + } // namespace void ApplicationInit() { + InteractionModelEngine::GetInstance()->RegisterCommandHandler(&gAdministratorCommissioningCommandHandler); + #if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE InitRpcServer(kFabricBridgeServerPort); AttemptRpcClientConnect(&DeviceLayer::SystemLayer(), nullptr); From 95e801d50958ca8aa42d165ea04f8ece730a93b1 Mon Sep 17 00:00:00 2001 From: Yufeng Wang <yufengwang@google.com> Date: Mon, 17 Jun 2024 10:43:47 -0700 Subject: [PATCH 2/2] Address review comments --- examples/fabric-bridge-app/linux/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/examples/fabric-bridge-app/linux/main.cpp b/examples/fabric-bridge-app/linux/main.cpp index b43680f9037619..f4217a14868972 100644 --- a/examples/fabric-bridge-app/linux/main.cpp +++ b/examples/fabric-bridge-app/linux/main.cpp @@ -130,6 +130,8 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha #if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE Device * device = DeviceMgr().GetDevice(endpointId); + + // TODO: issues:#33784, need to make OpenCommissioningWindow synchronous if (device != nullptr && OpenCommissioningWindow(device->GetNodeId()) == CHIP_NO_ERROR) { ChipLogProgress(NotSpecified, "Commissioning window is now open"); @@ -139,6 +141,9 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha status = Status::Failure; ChipLogProgress(NotSpecified, "Commissioning window is failed to open"); } +#else + status = Status::Failure; + ChipLogProgress(NotSpecified, "Commissioning window failed to open: PW_RPC_FABRIC_BRIDGE_SERVICE not defined"); #endif // defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status);