Skip to content

Commit

Permalink
[Fabric-Sync] Add VID/PID fields to IPC method CommissionNode (#35116)
Browse files Browse the repository at this point in the history
* Add VID/PID field to IPC methode CommissionNode

* Use QRCodeSetupPayloadGenerator to generate pairing code
  • Loading branch information
yufengwangca authored Aug 21, 2024
1 parent b88eafa commit 9e057a3
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 15 deletions.
4 changes: 3 additions & 1 deletion examples/common/pigweed/protos/fabric_admin_service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ message DeviceCommissioningInfo {
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 {
Expand Down
4 changes: 2 additions & 2 deletions examples/fabric-admin/device_manager/DeviceManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,11 @@ class DeviceManager : public PairingDelegate

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);
Expand Down
14 changes: 8 additions & 6 deletions examples/fabric-admin/rpc/RpcServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -103,16 +103,18 @@ class FabricAdmin final : public rpc::FabricAdmin, public IcdManager::Delegate

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();
Expand All @@ -121,11 +123,11 @@ class FabricAdmin final : public rpc::FabricAdmin, public IcdManager::Delegate
// 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();
Expand Down
3 changes: 2 additions & 1 deletion examples/fabric-bridge-app/linux/CommissionerControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,8 @@ CHIP_ERROR CommissionerControlDelegate::HandleCommissionNode(const Commissioning
.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;
Expand Down
4 changes: 3 additions & 1 deletion examples/fabric-bridge-app/linux/RpcClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,12 +163,14 @@ OpenCommissioningWindow(chip::Controller::CommissioningWindowVerifierParams para
}

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());
Expand Down
16 changes: 12 additions & 4 deletions examples/fabric-bridge-app/linux/include/RpcClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,20 @@ OpenCommissioningWindow(chip::Controller::CommissioningWindowVerifierParams para
/**
* 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);

0 comments on commit 9e057a3

Please sign in to comment.