| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- /*
- *
- * Copyright (c) 2021 Project CHIP Authors
- *
- * 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.
- */
- /**
- * @file Contains shell commands for for performing discovery (eg. of commissionable nodes) related to commissioning.
- */
- #include <AppMain.h>
- #include <ControllerShellCommands.h>
- #include <inttypes.h>
- #include <lib/core/CHIPCore.h>
- #include <lib/shell/Commands.h>
- #include <lib/shell/Engine.h>
- #include <lib/shell/commands/Help.h>
- #include <lib/support/CHIPArgParser.hpp>
- #include <lib/support/CHIPMem.h>
- #include <lib/support/CodeUtils.h>
- #include <platform/CHIPDeviceLayer.h>
- #include <protocols/secure_channel/RendezvousParameters.h>
- #include <protocols/user_directed_commissioning/UserDirectedCommissioning.h>
- namespace chip {
- namespace Shell {
- using namespace chip;
- using namespace ::chip::Controller;
- #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
- static CHIP_ERROR ResetUDC(bool printHeader)
- {
- streamer_t * sout = streamer_get();
- if (printHeader)
- {
- streamer_printf(sout, "udc-reset: ");
- }
- GetDeviceCommissioner()->GetUserDirectedCommissioningServer()->ResetUDCClientProcessingStates();
- streamer_printf(sout, "done\r\n");
- return CHIP_NO_ERROR;
- }
- static CHIP_ERROR PrintUDC(bool printHeader)
- {
- streamer_t * sout = streamer_get();
- if (printHeader)
- {
- streamer_printf(sout, "udc-print: \r\n");
- }
- GetDeviceCommissioner()->GetUserDirectedCommissioningServer()->PrintUDCClients();
- streamer_printf(sout, "done\r\n");
- return CHIP_NO_ERROR;
- }
- static CHIP_ERROR discover(bool printHeader)
- {
- streamer_t * sout = streamer_get();
- if (printHeader)
- {
- streamer_printf(sout, "Discover: ");
- }
- Dnssd::DiscoveryFilter filter(Dnssd::DiscoveryFilterType::kNone, (uint64_t) 0);
- GetDeviceCommissioner()->DiscoverCommissionableNodes(filter);
- streamer_printf(sout, "done\r\n");
- return CHIP_NO_ERROR;
- }
- static CHIP_ERROR discover(bool printHeader, char * instance)
- {
- streamer_t * sout = streamer_get();
- if (printHeader)
- {
- streamer_printf(sout, "Discover Instance: ");
- }
- Dnssd::DiscoveryFilter filter(Dnssd::DiscoveryFilterType::kInstanceName, instance);
- GetDeviceCommissioner()->DiscoverCommissionableNodes(filter);
- streamer_printf(sout, "done\r\n");
- return CHIP_NO_ERROR;
- }
- static CHIP_ERROR display(bool printHeader)
- {
- streamer_t * sout = streamer_get();
- if (printHeader)
- {
- streamer_printf(sout, "Display:\r\n");
- }
- for (int i = 0; i < 10; i++)
- {
- const Dnssd::DiscoveredNodeData * next = GetDeviceCommissioner()->GetDiscoveredDevice(i);
- if (next == nullptr)
- {
- streamer_printf(sout, " Entry %d null\r\n", i);
- }
- else
- {
- streamer_printf(sout, " Entry %d instanceName=%s host=%s longDiscriminator=%d vendorId=%d productId=%d\r\n", i,
- next->commissionData.instanceName, next->resolutionData.hostName,
- next->commissionData.longDiscriminator, next->commissionData.vendorId, next->commissionData.productId);
- }
- }
- streamer_printf(sout, "done\r\n");
- return CHIP_NO_ERROR;
- }
- static CHIP_ERROR pairOnNetwork(bool printHeader, uint32_t pincode, uint16_t disc, Transport::PeerAddress address)
- {
- streamer_t * sout = streamer_get();
- if (printHeader)
- {
- streamer_printf(sout, "onnetwork \r\n");
- }
- CHIP_ERROR err = CommissionerPairOnNetwork(pincode, disc, address);
- streamer_printf(sout, "done\r\n");
- return err;
- }
- CHIP_ERROR pairUDC(bool printHeader, uint32_t pincode, size_t index)
- {
- streamer_t * sout = streamer_get();
- if (printHeader)
- {
- streamer_printf(sout, "udc-commission %ld %ld\r\n", pincode, index);
- }
- CHIP_ERROR err = CommissionerPairUDC(pincode, index);
- streamer_printf(sout, "done\r\n");
- return err;
- }
- #endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
- static CHIP_ERROR PrintAllCommands()
- {
- streamer_t * sout = streamer_get();
- streamer_printf(sout, " help Usage: controller <subcommand>\r\n");
- #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
- streamer_printf(
- sout, " udc-reset Clear all pending UDC sessions from this UDC server. Usage: controller udc-reset\r\n");
- streamer_printf(
- sout, " udc-print Print all pending UDC sessions from this UDC server. Usage: controller udc-print\r\n");
- #endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
- #if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
- streamer_printf(sout, " ux ok|cancel [<pincode>] User input. Usage: controller ux ok 34567890\r\n");
- streamer_printf(sout,
- " udc-commission <pincode> <udc-entry> Commission given udc-entry using given pincode. Usage: controller "
- "udc-commission 34567890 0\r\n");
- streamer_printf(
- sout,
- " discover-commissionable Discover all commissionable nodes. Usage: controller discover-commissionable\r\n");
- streamer_printf(
- sout,
- " discover-commissionable-instance <name> Discover all commissionable node with given instance name. Usage: controller "
- "discover-commissionable-instance DC514873944A5CFF\r\n");
- streamer_printf(
- sout, " discover-display Display all discovered commissionable nodes. Usage: controller discover-display\r\n");
- streamer_printf(
- sout,
- " commission-onnetwork <pincode> <disc> <IP> <port> Pair given device. Usage: controller commission-onnetwork "
- "20202021 3840 127.0.0.1 5540\r\n");
- #endif // CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
- streamer_printf(sout, "\r\n");
- return CHIP_NO_ERROR;
- }
- static CHIP_ERROR ControllerHandler(int argc, char ** argv)
- {
- if (argc == 0 || strcmp(argv[0], "help") == 0)
- {
- return PrintAllCommands();
- }
- #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
- else if (strcmp(argv[0], "udc-reset") == 0)
- {
- return ResetUDC(true);
- }
- else if (strcmp(argv[0], "udc-print") == 0)
- {
- return PrintUDC(true);
- }
- #endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
- #if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
- else if (strcmp(argv[0], "discover-commissionable") == 0)
- {
- return discover(true);
- }
- else if (strcmp(argv[0], "discover-commissionable-instance") == 0)
- {
- return discover(true, argv[1]);
- }
- else if (strcmp(argv[0], "discover-display") == 0)
- {
- return display(true);
- }
- else if (strcmp(argv[0], "commission-onnetwork") == 0)
- {
- // onnetwork pincode disc IP port
- if (argc < 5)
- {
- return PrintAllCommands();
- }
- char * eptr;
- uint32_t pincode = (uint32_t) strtol(argv[1], &eptr, 10);
- uint16_t disc = (uint16_t) strtol(argv[2], &eptr, 10);
- Inet::IPAddress address;
- Inet::IPAddress::FromString(argv[3], address);
- uint16_t port = (uint16_t) strtol(argv[4], &eptr, 10);
- return pairOnNetwork(true, pincode, disc, Transport::PeerAddress::UDP(address, port));
- }
- else if (strcmp(argv[0], "ux") == 0)
- {
- // ux ok|cancel [pincode]
- if (argc < 2)
- {
- return PrintAllCommands();
- }
- char * eptr;
- char * response = argv[1];
- if (strcmp(response, "cancel") == 0)
- {
- GetCommissionerDiscoveryController()->Cancel();
- return CHIP_NO_ERROR;
- }
- else if (strcmp(response, "ok") == 0)
- {
- if (argc >= 3)
- {
- uint32_t pincode = (uint32_t) strtol(argv[2], &eptr, 10);
- GetCommissionerDiscoveryController()->CommissionWithPincode(pincode);
- return CHIP_NO_ERROR;
- }
- GetCommissionerDiscoveryController()->Ok();
- return CHIP_NO_ERROR;
- }
- else
- {
- return PrintAllCommands();
- }
- }
- else if (strcmp(argv[0], "udc-commission") == 0)
- {
- // udc-commission pincode index
- if (argc < 3)
- {
- return PrintAllCommands();
- }
- char * eptr;
- uint32_t pincode = (uint32_t) strtol(argv[1], &eptr, 10);
- size_t index = (size_t) strtol(argv[2], &eptr, 10);
- return pairUDC(true, pincode, index);
- }
- #endif // CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
- return CHIP_ERROR_INVALID_ARGUMENT;
- }
- void RegisterControllerCommands()
- {
- static const shell_command_t sDeviceComand = { &ControllerHandler, "controller",
- "Controller commands. Usage: controller [command_name]" };
- // Register the root `device` command with the top-level shell.
- Engine::Root().RegisterCommands(&sDeviceComand, 1);
- }
- } // namespace Shell
- } // namespace chip
|