[Fabric-Sync] Add VID/PID fields to IPC method CommissionNode (#35116)
* Add VID/PID field to IPC methode CommissionNode
* Use QRCodeSetupPayloadGenerator to generate pairing code
diff --git a/examples/common/pigweed/protos/fabric_admin_service.proto b/examples/common/pigweed/protos/fabric_admin_service.proto
index 3c31149..3df3e2a 100644
--- a/examples/common/pigweed/protos/fabric_admin_service.proto
+++ b/examples/common/pigweed/protos/fabric_admin_service.proto
@@ -19,7 +19,9 @@
uint32 discriminator = 1;
uint32 iterations = 2;
uint32 setup_pin = 3;
- bytes salt = 4;
+ uint32 vendor_id = 4;
+ uint32 product_id = 5;
+ bytes salt = 6;
}
message KeepActiveParameters {
diff --git a/examples/fabric-admin/device_manager/DeviceManager.h b/examples/fabric-admin/device_manager/DeviceManager.h
index d3b47c4..1fb2ad5 100644
--- a/examples/fabric-admin/device_manager/DeviceManager.h
+++ b/examples/fabric-admin/device_manager/DeviceManager.h
@@ -156,11 +156,11 @@
void HandleCommandResponse(const chip::app::ConcreteCommandPath & path, chip::TLV::TLVReader & data);
- void OnDeviceRemoved(chip::NodeId deviceId, CHIP_ERROR err) override;
-
private:
friend DeviceManager & DeviceMgr();
+ void OnDeviceRemoved(chip::NodeId deviceId, CHIP_ERROR err) override;
+
void RequestCommissioningApproval();
void HandleReadSupportedDeviceCategories(chip::TLV::TLVReader & data);
diff --git a/examples/fabric-admin/rpc/RpcServer.cpp b/examples/fabric-admin/rpc/RpcServer.cpp
index f240fed..d563995 100644
--- a/examples/fabric-admin/rpc/RpcServer.cpp
+++ b/examples/fabric-admin/rpc/RpcServer.cpp
@@ -29,7 +29,7 @@
#include <commands/fabric-sync/FabricSyncCommand.h>
#include <commands/interactive/InteractiveCommands.h>
#include <device_manager/DeviceManager.h>
-#include <setup_payload/ManualSetupPayloadGenerator.h>
+#include <setup_payload/QRCodeSetupPayloadGenerator.h>
#include <system/SystemClock.h>
#if defined(PW_RPC_FABRIC_ADMIN_SERVICE) && PW_RPC_FABRIC_ADMIN_SERVICE
@@ -103,16 +103,18 @@
setupPayload.setUpPINCode = request.setup_pin;
setupPayload.version = 0;
+ setupPayload.vendorID = request.vendor_id;
+ setupPayload.productID = request.product_id;
setupPayload.rendezvousInformation.SetValue(RendezvousInformationFlag::kOnNetwork);
SetupDiscriminator discriminator{};
discriminator.SetLongValue(request.discriminator);
setupPayload.discriminator = discriminator;
- char payloadBuffer[kMaxManualCodeLength + 1];
- MutableCharSpan manualCode(payloadBuffer);
+ QRCodeSetupPayloadGenerator generator(setupPayload);
+ std::string code;
+ CHIP_ERROR error = generator.payloadBase38RepresentationWithAutoTLVBuffer(code);
- CHIP_ERROR error = ManualSetupPayloadGenerator(setupPayload).payloadDecimalStringRepresentation(manualCode);
if (error == CHIP_NO_ERROR)
{
NodeId nodeId = DeviceMgr().GetNextAvailableNodeId();
@@ -121,11 +123,11 @@
// RequestCommissioningApproval, you need to wait for it to open a commissioning window on its bridge.
usleep(kCommissionPrepareTimeMs * 1000);
- DeviceMgr().PairRemoteDevice(nodeId, payloadBuffer);
+ DeviceMgr().PairRemoteDevice(nodeId, code.c_str());
}
else
{
- ChipLogError(NotSpecified, "Unable to generate manual code for setup payload: %" CHIP_ERROR_FORMAT, error.Format());
+ ChipLogError(NotSpecified, "Unable to generate pairing code for setup payload: %" CHIP_ERROR_FORMAT, error.Format());
}
return pw::OkStatus();
diff --git a/examples/fabric-bridge-app/linux/CommissionerControl.cpp b/examples/fabric-bridge-app/linux/CommissionerControl.cpp
index 9f31806..3613aee 100644
--- a/examples/fabric-bridge-app/linux/CommissionerControl.cpp
+++ b/examples/fabric-bridge-app/linux/CommissionerControl.cpp
@@ -137,7 +137,8 @@
.SetTimeout(params.commissioningTimeout)
.SetDiscriminator(params.discriminator)
.SetIteration(params.iterations)
- .SetSalt(params.salt));
+ .SetSalt(params.salt),
+ mVendorId, mProductId);
#else
ChipLogProgress(NotSpecified, "Failed to reverse commission bridge: PW_RPC_FABRIC_BRIDGE_SERVICE not defined");
return CHIP_ERROR_NOT_IMPLEMENTED;
diff --git a/examples/fabric-bridge-app/linux/RpcClient.cpp b/examples/fabric-bridge-app/linux/RpcClient.cpp
index b3c8230..817479d 100644
--- a/examples/fabric-bridge-app/linux/RpcClient.cpp
+++ b/examples/fabric-bridge-app/linux/RpcClient.cpp
@@ -163,12 +163,14 @@
}
CHIP_ERROR
-CommissionNode(chip::Controller::CommissioningWindowPasscodeParams params)
+CommissionNode(chip::Controller::CommissioningWindowPasscodeParams params, VendorId vendorId, uint16_t productId)
{
chip_rpc_DeviceCommissioningInfo device;
device.setup_pin = params.GetSetupPIN();
device.discriminator = params.GetDiscriminator();
device.iterations = params.GetIteration();
+ device.vendor_id = vendorId;
+ device.product_id = productId;
VerifyOrReturnError(params.GetSalt().size() <= sizeof(device.salt.bytes), CHIP_ERROR_BUFFER_TOO_SMALL);
memcpy(device.salt.bytes, params.GetSalt().data(), params.GetSalt().size());
diff --git a/examples/fabric-bridge-app/linux/include/RpcClient.h b/examples/fabric-bridge-app/linux/include/RpcClient.h
index 87ccba2..c7628a8 100644
--- a/examples/fabric-bridge-app/linux/include/RpcClient.h
+++ b/examples/fabric-bridge-app/linux/include/RpcClient.h
@@ -60,12 +60,20 @@
/**
* Commission a node using the specified parameters.
*
- * @param params Params for commissioning the device using passcode.
+ * This function initiates the commissioning process for a node, utilizing
+ * the provided passcode parameters, vendor ID, and product ID.
+ *
+ * @param params Parameters required for commissioning the device using passcode.
+ * @param vendorId The Vendor ID (VID) of the device being commissioned. This identifies
+ * the manufacturer of the device.
+ * @param productId The Product ID (PID) of the device being commissioned. This identifies
+ * the specific product within the vendor's lineup.
+ *
* @return CHIP_ERROR An error code indicating the success or failure of the operation.
- * - CHIP_NO_ERROR: The RPC command was successfully sent.
- * - CHIP_ERROR_INTERNAL: An internal error occurred.
+ * - CHIP_NO_ERROR: The RPC command was successfully sent and the commissioning process was initiated.
+ * - CHIP_ERROR_INTERNAL: An internal error occurred during the preparation or sending of the command.
*/
CHIP_ERROR
-CommissionNode(chip::Controller::CommissioningWindowPasscodeParams params);
+CommissionNode(chip::Controller::CommissioningWindowPasscodeParams params, chip::VendorId vendorId, uint16_t productId);
CHIP_ERROR KeepActive(chip::NodeId nodeId, uint32_t stayActiveDurationMs);