Skip to content

Commit

Permalink
[ChipTool] Add a command to enumerate the paired devices and show ip/…
Browse files Browse the repository at this point in the history
…port/interface informations for them
  • Loading branch information
vivien-apple committed Oct 15, 2021
1 parent a56c83e commit ce96697
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 2 deletions.
2 changes: 2 additions & 0 deletions examples/chip-tool/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ executable("chip-tool") {
"commands/discover/DiscoverCommissionablesCommand.cpp",
"commands/discover/DiscoverCommissionersCommand.cpp",
"commands/pairing/PairingCommand.cpp",
"commands/pairing/PairingListCommand.cpp",
"commands/pairing/PairingListCommand.h",
"commands/payload/AdditionalDataParseCommand.cpp",
"commands/payload/SetupPayloadParseCommand.cpp",
"commands/reporting/ReportingCommand.cpp",
Expand Down
4 changes: 2 additions & 2 deletions examples/chip-tool/commands/clusters/ModelCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ using namespace ::chip;

CHIP_ERROR ModelCommand::Run(NodeId remoteId)
{
CHIP_ERROR err = CHIP_NO_ERROR;
ChipLogProgress(chipTool, "Sending command to node 0x%" PRIx64, remoteId);

err = mController.GetConnectedDevice(remoteId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback);
CHIP_ERROR err = mController.GetConnectedDevice(remoteId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback);
VerifyOrExit(err == CHIP_NO_ERROR,
ChipLogError(chipTool, "Failed in initiating connection to the device: %" PRIu64 ", error %" CHIP_ERROR_FORMAT,
remoteId, err.Format()));
Expand Down
2 changes: 2 additions & 0 deletions examples/chip-tool/commands/pairing/Commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#pragma once

#include "PairingCommand.h"
#include "PairingListCommand.h"

class Unpair : public PairingCommand
{
Expand Down Expand Up @@ -176,6 +177,7 @@ void registerCommandsPairing(Commands & commands)
make_unique<PairOnNetworkDeviceType>(),
make_unique<PairOnNetworkInstanceName>(),
make_unique<OpenCommissioningWindow>(),
make_unique<PairingListCommand>(),
};

commands.Register(clusterName, clusterCommands);
Expand Down
97 changes: 97 additions & 0 deletions examples/chip-tool/commands/pairing/PairingListCommand.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*
* Copyright (c) 2021 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

#include "PairingListCommand.h"

#include <lib/core/CHIPEncoding.h>
#include <lib/support/PersistentStorageMacros.h>
#include <lib/support/SafeInt.h>
#include <lib/support/Span.h>

CHIP_ERROR PairingListCommand::Run()
{
ReturnLogErrorOnFailure(mStorage.Init());
return PrintInformations();
}

CHIP_ERROR PairingListCommand::PrintInformations()
{
uint64_t buffer[chip::Controller::kNumMaxPairedDevices];
uint16_t bufferSize = sizeof(buffer);
memset(buffer, 0, bufferSize);

PERSISTENT_KEY_OP(static_cast<uint64_t>(0), chip::kPairedDeviceListKeyPrefix, key,
ReturnLogErrorOnFailure(mStorage.SyncGetKeyValue(key, buffer, bufferSize)));

chip::SerializableU64Set<chip::Controller::kNumMaxPairedDevices> devices;
devices.Deserialize(chip::ByteSpan((uint8_t *) buffer, bufferSize));

uint16_t devicesCount = 0;
while (buffer[devicesCount] != 0x0 && devicesCount < chip::Controller::kNumMaxPairedDevices)
{
devicesCount++;
}

if (devicesCount == 0)
{
ChipLogProgress(chipTool, "No paired devices.");
}
else
{
fprintf(stderr, "+---------------------------------------------------------------------------------------------+\n");
fprintf(stderr, "| NodeId | Address | Port | Interface |\n");
fprintf(stderr, "+---------------------------------------------------------------------------------------------+\n");
for (uint16_t i = 0; i < devicesCount; i++)
{
ReturnLogErrorOnFailure(PrintDeviceInformations(buffer[i]));
}
fprintf(stderr, "+---------------------------------------------------------------------------------------------+\n");
}

return CHIP_NO_ERROR;
}

CHIP_ERROR PairingListCommand::PrintDeviceInformations(chip::NodeId deviceId)
{
chip::Controller::SerializedDevice deviceInfo;
uint16_t size = sizeof(deviceInfo.inner);

PERSISTENT_KEY_OP(deviceId, chip::kPairedDeviceKeyPrefix, key,
ReturnLogErrorOnFailure(mStorage.SyncGetKeyValue(key, deviceInfo.inner, size)));
VerifyOrReturnError(size <= sizeof(deviceInfo.inner), CHIP_ERROR_INVALID_DEVICE_DESCRIPTOR);

chip::Controller::SerializableDevice serializable;
constexpr size_t maxlen = BASE64_ENCODED_LEN(sizeof(serializable));
const size_t len = strnlen(chip::Uint8::to_const_char(&deviceInfo.inner[0]), maxlen);

VerifyOrReturnError(len < sizeof(chip::Controller::SerializedDevice), CHIP_ERROR_INVALID_ARGUMENT);
VerifyOrReturnError(chip::CanCastTo<uint16_t>(len), CHIP_ERROR_INVALID_ARGUMENT);

CHIP_ZERO_AT(serializable);
const uint16_t deserializedLen = chip::Base64Decode(chip::Uint8::to_const_char(deviceInfo.inner), static_cast<uint16_t>(len),
chip::Uint8::to_uchar(reinterpret_cast<uint8_t *>(&serializable)));

VerifyOrReturnError(deserializedLen > 0, CHIP_ERROR_INVALID_ARGUMENT);
VerifyOrReturnError(deserializedLen <= sizeof(serializable), CHIP_ERROR_INVALID_ARGUMENT);

const uint16_t port = chip::Encoding::LittleEndian::HostSwap16(serializable.mDevicePort);
fprintf(stderr, "| 0x%-16" PRIx64 " | %-45s | %-5u| %-15s |\n", deviceId, serializable.mDeviceAddr, port,
serializable.mInterfaceName);

return CHIP_NO_ERROR;
}
35 changes: 35 additions & 0 deletions examples/chip-tool/commands/pairing/PairingListCommand.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright (c) 2021 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

#pragma once

#include "../../config/PersistentStorage.h"
#include "../common/Command.h"

class PairingListCommand : public Command
{
public:
PairingListCommand() : Command("list") {}
CHIP_ERROR Run() override;

private:
CHIP_ERROR PrintInformations();
CHIP_ERROR PrintDeviceInformations(chip::NodeId deviceId);

PersistentStorage mStorage;
};

0 comments on commit ce96697

Please sign in to comment.