Skip to content

Commit

Permalink
add shell commands and hooks from casting app for UDC options
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisdecenzo committed Jan 16, 2024
1 parent 54e55bf commit 54815bf
Show file tree
Hide file tree
Showing 8 changed files with 274 additions and 63 deletions.
95 changes: 92 additions & 3 deletions examples/platform/linux/CommissioneeShellCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ namespace chip {
namespace Shell {

#if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
static CHIP_ERROR SendUDC(bool printHeader, chip::Transport::PeerAddress commissioner)
static CHIP_ERROR SendUDC(bool printHeader, chip::Transport::PeerAddress commissioner,
Protocols::UserDirectedCommissioning::IdentificationDeclaration id)
{
streamer_t * sout = streamer_get();

Expand All @@ -46,7 +47,7 @@ static CHIP_ERROR SendUDC(bool printHeader, chip::Transport::PeerAddress commiss
streamer_printf(sout, "SendUDC: ");
}

Server::GetInstance().SendUserDirectedCommissioningRequest(commissioner);
Server::GetInstance().SendUserDirectedCommissioningRequest(commissioner, id);

streamer_printf(sout, "done\r\n");

Expand All @@ -60,6 +61,13 @@ static CHIP_ERROR PrintAllCommands()
streamer_printf(sout, " help Usage: commissionee <subcommand>\r\n");
#if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
streamer_printf(sout, " sendudc <address> <port> Send UDC message to address. Usage: commissionee sendudc ::1 5543\r\n");
streamer_printf(sout, " udccancel <address> <port> Send UDC cancel message to address. Usage: cast udccancel ::1 5543\r\n");
streamer_printf(sout,
" udccommissionerpasscode <address> <port> [CommissionerPasscodeReady] [PairingHint] [PairingInst] Send UDC "
"commissioner passcode message to address. Usage: udccommissionerpasscode ::1 5543 t 5 HelloWorld\r\n");
streamer_printf(sout,
" testudc <address> <port> [NoPasscode] [CdUponPasscodeDialog] [vid] [PairingHint] [PairingInst] Send UDC "
"message to address. Usage: cast testudc ::1 5543 t t 5 HelloWorld\r\n");
#endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
// TODO: Figure out whether setdiscoverytimeout is a reasonable thing to do
// at all, and if so what semantics it should have. Presumably it should
Expand Down Expand Up @@ -92,12 +100,93 @@ static CHIP_ERROR CommissioneeHandler(int argc, char ** argv)
}
#if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
if (strcmp(argv[0], "sendudc") == 0)
{
Protocols::UserDirectedCommissioning::IdentificationDeclaration id;

char * eptr;
chip::Inet::IPAddress commissioner;
chip::Inet::IPAddress::FromString(argv[1], commissioner);
uint16_t port = (uint16_t) strtol(argv[2], &eptr, 10);

return SendUDC(true, chip::Transport::PeerAddress::UDP(commissioner, port), id);
}
if (strcmp(argv[0], "udccancel") == 0)
{
char * eptr;
chip::Inet::IPAddress commissioner;
chip::Inet::IPAddress::FromString(argv[1], commissioner);
uint16_t port = (uint16_t) strtol(argv[2], &eptr, 10);

Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
id.SetCancelPasscode(true);
return Server::GetInstance().SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress::UDP(commissioner, port),
id);
}
if (strcmp(argv[0], "udccommissionerpasscode") == 0)
{
char * eptr;
chip::Inet::IPAddress commissioner;
chip::Inet::IPAddress::FromString(argv[1], commissioner);
uint16_t port = (uint16_t) strtol(argv[2], &eptr, 10);
return SendUDC(true, chip::Transport::PeerAddress::UDP(commissioner, port));

// udccommissionerpasscode <address> <port> [CommissionerPasscodeReady] [PairingHint] [PairingInst]
// ex. udccommissionerpasscode <address> <port> t 5 'hello world'

Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
id.SetCommissionerPasscode(true);
if (argc > 3)
{
id.SetCommissionerPasscodeReady(strcmp(argv[3], "t") == 0);
}
if (argc > 4)
{
uint16_t hint = (uint16_t) strtol(argv[4], &eptr, 10);
id.SetPairingHint(hint);
}
if (argc > 5)
{
id.SetPairingInst(argv[5]);
}
return Server::GetInstance().SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress::UDP(commissioner, port),
id);
}
if (strcmp(argv[0], "testudc") == 0)
{
char * eptr;
chip::Inet::IPAddress commissioner;
chip::Inet::IPAddress::FromString(argv[1], commissioner);
uint16_t port = (uint16_t) strtol(argv[2], &eptr, 10);

// sendudc <address> <port> [NoPasscode] [CdUponPasscodeDialog] [vid] [PairingHint] [PairingInst]
// ex. sendudc <address> <port> t t 111 5 'hello world'

Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
if (argc > 3)
{
id.SetNoPasscode(strcmp(argv[3], "t") == 0);
}
if (argc > 4)
{
id.SetCdUponPasscodeDialog(strcmp(argv[4], "t") == 0);
}
if (argc > 5)
{
uint16_t vid = (uint16_t) strtol(argv[5], &eptr, 10);
Protocols::UserDirectedCommissioning::TargetAppInfo info;
info.vendorId = vid;
id.AddTargetAppInfo(info);
}
if (argc > 6)
{
uint16_t hint = (uint16_t) strtol(argv[6], &eptr, 10);
id.SetPairingHint(hint);
}
if (argc > 7)
{
id.SetPairingInst(argv[7]);
}
return Server::GetInstance().SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress::UDP(commissioner, port),
id);
}
#endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
// TODO: Figure out whether setdiscoverytimeout is a reasonable thing to do
Expand Down
85 changes: 85 additions & 0 deletions examples/tv-casting-app/linux/CastingShellCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,13 @@ static CHIP_ERROR PrintAllCommands()
sout,
" access <node> Read and display clusters on each endpoint for <node>. Usage: cast access 0xFFFFFFEFFFFFFFFF\r\n");
streamer_printf(sout, " sendudc <address> <port> Send UDC message to address. Usage: cast sendudc ::1 5543\r\n");
streamer_printf(sout, " udccancel <address> <port> Send UDC cancel message to address. Usage: cast udccancel ::1 5543\r\n");
streamer_printf(sout,
" udccommissionerpasscode <address> <port> [CommissionerPasscodeReady] [PairingHint] [PairingInst] Send UDC "
"commissioner passcode message to address. Usage: udccommissionerpasscode ::1 5543 t 5 HelloWorld\r\n");
streamer_printf(sout,
" testudc <address> <port> [NoPasscode] [CdUponPasscodeDialog] [vid] [PairingHint] [PairingInst] Send UDC "
"message to address. Usage: cast testudc ::1 5543 t t 5 HelloWorld\r\n");
streamer_printf(
sout,
" cluster [clustercommand] Send cluster command. Usage: cast cluster keypadinput send-key 1 18446744004990074879 1\r\n");
Expand Down Expand Up @@ -148,6 +155,84 @@ static CHIP_ERROR CastingHandler(int argc, char ** argv)
return CastingServer::GetInstance()->SendUserDirectedCommissioningRequest(
chip::Transport::PeerAddress::UDP(commissioner, port));
}
if (strcmp(argv[0], "udccancel") == 0)
{
char * eptr;
chip::Inet::IPAddress commissioner;
chip::Inet::IPAddress::FromString(argv[1], commissioner);
uint16_t port = (uint16_t) strtol(argv[2], &eptr, 10);

Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
id.SetCancelPasscode(true);
return Server::GetInstance().SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress::UDP(commissioner, port),
id);
}
if (strcmp(argv[0], "udccommissionerpasscode") == 0)
{
char * eptr;
chip::Inet::IPAddress commissioner;
chip::Inet::IPAddress::FromString(argv[1], commissioner);
uint16_t port = (uint16_t) strtol(argv[2], &eptr, 10);

// udccommissionerpasscode <address> <port> [CommissionerPasscodeReady] [PairingHint] [PairingInst]
// ex. udccommissionerpasscode <address> <port> t 5 'hello world'

Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
id.SetCommissionerPasscode(true);
if (argc > 3)
{
id.SetCommissionerPasscodeReady(strcmp(argv[3], "t") == 0);
}
if (argc > 4)
{
uint16_t hint = (uint16_t) strtol(argv[4], &eptr, 10);
id.SetPairingHint(hint);
}
if (argc > 5)
{
id.SetPairingInst(argv[5]);
}
return Server::GetInstance().SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress::UDP(commissioner, port),
id);
}
if (strcmp(argv[0], "testudc") == 0)
{
char * eptr;
chip::Inet::IPAddress commissioner;
chip::Inet::IPAddress::FromString(argv[1], commissioner);
uint16_t port = (uint16_t) strtol(argv[2], &eptr, 10);

// sendudc <address> <port> [NoPasscode] [CdUponPasscodeDialog] [vid] [PairingHint] [PairingInst]
// ex. sendudc <address> <port> t t 111 5 'hello world'

Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
if (argc > 3)
{
id.SetNoPasscode(strcmp(argv[3], "t") == 0);
}
if (argc > 4)
{
id.SetCdUponPasscodeDialog(strcmp(argv[4], "t") == 0);
}
if (argc > 5)
{
uint16_t vid = (uint16_t) strtol(argv[5], &eptr, 10);
Protocols::UserDirectedCommissioning::TargetAppInfo info;
info.vendorId = vid;
id.AddTargetAppInfo(info);
}
if (argc > 6)
{
uint16_t hint = (uint16_t) strtol(argv[6], &eptr, 10);
id.SetPairingHint(hint);
}
if (argc > 7)
{
id.SetPairingInst(argv[7]);
}
return Server::GetInstance().SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress::UDP(commissioner, port),
id);
}
#endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
if (strcmp(argv[0], "print-bindings") == 0)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,10 @@ CHIP_ERROR CastingPlayer::SendUserDirectedCommissioningRequest()

ReturnErrorOnFailure(support::ChipDeviceEventHandler::SetUdcStatus(true));

// TODO: expose options to the higher layer
chip::Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
ReturnErrorOnFailure(chip::Server::GetInstance().SendUserDirectedCommissioningRequest(
chip::Transport::PeerAddress::UDP(*ipAddressToUse, mAttributes.port, mAttributes.interfaceId)));
chip::Transport::PeerAddress::UDP(*ipAddressToUse, mAttributes.port, mAttributes.interfaceId), id));

return CHIP_NO_ERROR;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,9 @@ void CastingServer::OnCommissioningSessionEstablishmentStarted()
#if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
CHIP_ERROR CastingServer::SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress commissioner)
{
return Server::GetInstance().SendUserDirectedCommissioningRequest(commissioner);
// TODO: expose options to the higher layer
Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
return Server::GetInstance().SendUserDirectedCommissioningRequest(commissioner, id);
}

chip::Inet::IPAddress * CastingServer::getIpAddressForUDCRequest(chip::Inet::IPAddress ipAddresses[], const size_t numIPs)
Expand Down
97 changes: 58 additions & 39 deletions src/app/server/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -567,65 +567,84 @@ void Server::Shutdown()
// NOTE: UDC client is located in Server.cpp because it really only makes sense
// to send UDC from a Matter device. The UDC message payload needs to include the device's
// randomly generated service name.
CHIP_ERROR Server::SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress commissioner)
CHIP_ERROR Server::SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress commissioner,
Protocols::UserDirectedCommissioning::IdentificationDeclaration & id)
{
ChipLogDetail(AppServer, "SendUserDirectedCommissioningRequest2");

CHIP_ERROR err;
char nameBuffer[chip::Dnssd::Commission::kInstanceNameMaxLength + 1];
err = app::DnssdServer::Instance().GetCommissionableInstanceName(nameBuffer, sizeof(nameBuffer));
if (err != CHIP_NO_ERROR)
{
ChipLogError(AppServer, "Failed to get mdns instance name error: %" CHIP_ERROR_FORMAT, err.Format());
return err;
}
ChipLogDetail(AppServer, "instanceName=%s", nameBuffer);

Protocols::UserDirectedCommissioning::IdentificationDeclaration id;
id.SetInstanceName(nameBuffer);

uint16_t vendorId = 0;
if (DeviceLayer::GetDeviceInstanceInfoProvider()->GetVendorId(vendorId) != CHIP_NO_ERROR)
// only populate fields left blank by the client
if (strlen(id.GetInstanceName()) == 0)
{
ChipLogDetail(Discovery, "Vendor ID not known");
}
else
{
id.SetVendorId(vendorId);
char nameBuffer[chip::Dnssd::Commission::kInstanceNameMaxLength + 1];
err = app::DnssdServer::Instance().GetCommissionableInstanceName(nameBuffer, sizeof(nameBuffer));
if (err != CHIP_NO_ERROR)
{
ChipLogError(AppServer, "Failed to get mdns instance name error: %" CHIP_ERROR_FORMAT, err.Format());
return err;
}
id.SetInstanceName(nameBuffer);
}
ChipLogDetail(AppServer, "instanceName=%s", id.GetInstanceName());

uint16_t productId = 0;
if (DeviceLayer::GetDeviceInstanceInfoProvider()->GetProductId(productId) != CHIP_NO_ERROR)
{
ChipLogDetail(Discovery, "Product ID not known");
}
else
if (id.GetVendorId() == 0)
{
id.SetProductId(productId);
uint16_t vendorId = 0;
if (DeviceLayer::GetDeviceInstanceInfoProvider()->GetVendorId(vendorId) != CHIP_NO_ERROR)
{
ChipLogDetail(Discovery, "Vendor ID not known");
}
else
{
id.SetVendorId(vendorId);
}
}

char deviceName[chip::Dnssd::kKeyDeviceNameMaxLength + 1] = {};
if (!chip::DeviceLayer::ConfigurationMgr().IsCommissionableDeviceNameEnabled() ||
chip::DeviceLayer::ConfigurationMgr().GetCommissionableDeviceName(deviceName, sizeof(deviceName)) != CHIP_NO_ERROR)
if (id.GetProductId() == 0)
{
ChipLogDetail(Discovery, "Device Name not known");
uint16_t productId = 0;
if (DeviceLayer::GetDeviceInstanceInfoProvider()->GetProductId(productId) != CHIP_NO_ERROR)
{
ChipLogDetail(Discovery, "Product ID not known");
}
else
{
id.SetProductId(productId);
}
}
else

if (strlen(id.GetDeviceName()) == 0)
{
id.SetDeviceName(deviceName);
char deviceName[chip::Dnssd::kKeyDeviceNameMaxLength + 1] = {};
if (!chip::DeviceLayer::ConfigurationMgr().IsCommissionableDeviceNameEnabled() ||
chip::DeviceLayer::ConfigurationMgr().GetCommissionableDeviceName(deviceName, sizeof(deviceName)) != CHIP_NO_ERROR)
{
ChipLogDetail(Discovery, "Device Name not known");
}
else
{
id.SetDeviceName(deviceName);
}
}

#if CHIP_ENABLE_ROTATING_DEVICE_ID && defined(CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID)
char rotatingDeviceIdHexBuffer[RotatingDeviceId::kHexMaxLength];
ReturnErrorOnFailure(
app::DnssdServer::Instance().GenerateRotatingDeviceId(rotatingDeviceIdHexBuffer, ArraySize(rotatingDeviceIdHexBuffer)));
if (id.GetRotatingIdLength() == 0)
{
char rotatingDeviceIdHexBuffer[RotatingDeviceId::kHexMaxLength];
ReturnErrorOnFailure(
app::DnssdServer::Instance().GenerateRotatingDeviceId(rotatingDeviceIdHexBuffer, ArraySize(rotatingDeviceIdHexBuffer)));

uint8_t * rotatingId = reinterpret_cast<uint8_t *>(rotatingDeviceIdHexBuffer);
size_t rotatingIdLen = strlen(rotatingDeviceIdHexBuffer);
id.SetRotatingId(rotatingId, rotatingIdLen);
uint8_t * rotatingId = reinterpret_cast<uint8_t *>(rotatingDeviceIdHexBuffer);
size_t rotatingIdLen = strlen(rotatingDeviceIdHexBuffer);
id.SetRotatingId(rotatingId, rotatingIdLen);
}
#endif

id.SetCdPort(mCdcListenPort);
if (id.GetCdPort() == 0)
{
id.SetCdPort(mCdcListenPort);
}

err = gUDCClient->SendUDCMessage(&mTransports, id, commissioner);

Expand Down
4 changes: 3 additions & 1 deletion src/app/server/Server.h
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,9 @@ class Server
CHIP_ERROR Init(const ServerInitParams & initParams);

#if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT
CHIP_ERROR SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress commissioner);
CHIP_ERROR
SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress commissioner,
Protocols::UserDirectedCommissioning::IdentificationDeclaration & id);
#endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT

/**
Expand Down
Loading

0 comments on commit 54815bf

Please sign in to comment.