diff --git a/examples/java-matter-controller/BUILD.gn b/examples/java-matter-controller/BUILD.gn index 2eb8a691156f17..7c8bdf2f857144 100644 --- a/examples/java-matter-controller/BUILD.gn +++ b/examples/java-matter-controller/BUILD.gn @@ -31,14 +31,36 @@ android_binary("java-matter-controller") { sources = [ "java/src/com/matter/controller/Main.java", - "java/src/com/matter/controller/Off.java", - "java/src/com/matter/controller/On.java", "java/src/com/matter/controller/commands/common/Argument.java", "java/src/com/matter/controller/commands/common/ArgumentType.java", "java/src/com/matter/controller/commands/common/Command.java", + "java/src/com/matter/controller/commands/common/CommandManager.java", "java/src/com/matter/controller/commands/common/CredentialsIssuer.java", "java/src/com/matter/controller/commands/common/IPAddress.java", "java/src/com/matter/controller/commands/common/MatterCommand.java", + "java/src/com/matter/controller/commands/discover/DiscoverCommand.java", + "java/src/com/matter/controller/commands/discover/DiscoverCommissionablesCommand.java", + "java/src/com/matter/controller/commands/discover/DiscoverCommissionersCommand.java", + "java/src/com/matter/controller/commands/pairing/CloseSessionCommand.java", + "java/src/com/matter/controller/commands/pairing/DiscoveryFilterType.java", + "java/src/com/matter/controller/commands/pairing/PairCodeCommand.java", + "java/src/com/matter/controller/commands/pairing/PairCodePaseCommand.java", + "java/src/com/matter/controller/commands/pairing/PairCodeThreadCommand.java", + "java/src/com/matter/controller/commands/pairing/PairCodeWifiCommand.java", + "java/src/com/matter/controller/commands/pairing/PairEthernetCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissionerCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissioningModeCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkDeviceTypeCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkFabricCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkInstanceNameCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkLongCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkShortCommand.java", + "java/src/com/matter/controller/commands/pairing/PairOnNetworkVendorCommand.java", + "java/src/com/matter/controller/commands/pairing/PairingCommand.java", + "java/src/com/matter/controller/commands/pairing/PairingModeType.java", + "java/src/com/matter/controller/commands/pairing/PairingNetworkType.java", + "java/src/com/matter/controller/commands/pairing/UnpairCommand.java", "java/src/com/matter/controller/config/PersistentStorage.java", "java/src/com/matter/controller/config/PersistentStorageOpCertStore.java", "java/src/com/matter/controller/config/PersistentStorageOperationalKeystore.java", diff --git a/examples/java-matter-controller/java/src/com/matter/controller/Main.java b/examples/java-matter-controller/java/src/com/matter/controller/Main.java index f27e4463a6d20f..449be3adefcaa6 100644 --- a/examples/java-matter-controller/java/src/com/matter/controller/Main.java +++ b/examples/java-matter-controller/java/src/com/matter/controller/Main.java @@ -18,82 +18,91 @@ package com.matter.controller; -import chip.devicecontroller.ChipDeviceController; -import chip.devicecontroller.ControllerParams; -import com.matter.controller.commands.common.Command; -import com.matter.controller.commands.common.CredentialsIssuer; -import java.util.Arrays; +import com.matter.controller.commands.common.*; +import com.matter.controller.commands.discover.*; +import com.matter.controller.commands.pairing.*; +import java.util.ArrayList; public class Main { - private static void ShowUsage(Command[] commands) { - StringBuffer arguments = new StringBuffer(); - StringBuffer attributes = new StringBuffer(); - - for (Command command : commands) { - arguments.append(" "); - arguments.append(command.getName()); - - int argumentsCount = command.getArgumentsCount(); - for (int j = 0; j < argumentsCount; j++) { - arguments.append(" "); - arguments.append(command.getArgumentName(j)); - } - - arguments.append("\n"); - - if ("read".equals(command.getName()) && command.getAttribute().isPresent()) { - attributes.append(" " + command.getAttribute().get() + "\n"); - } - } - - System.out.println( - String.format( - "Usage: \n" - + " java_matter_controller command [params]\n\n" - + " Supported commands and their parameters:\n%s\n" - + " Supported attribute names for the 'read' command:\n%s", - arguments, attributes)); + private static void registerCommandsDiscover( + CommandManager commandManager, CredentialsIssuer credentialsIssuer) { + ArrayList clusterCommands = new ArrayList(); + DiscoverCommand discoverCommand = new DiscoverCommand(credentialsIssuer); + DiscoverCommissionablesCommand discoverCommissionablesCommand = + new DiscoverCommissionablesCommand(credentialsIssuer); + DiscoverCommissionersCommand discoverCommissionersCommand = + new DiscoverCommissionersCommand(credentialsIssuer); + clusterCommands.add(discoverCommand); + clusterCommands.add(discoverCommissionablesCommand); + clusterCommands.add(discoverCommissionersCommand); + + commandManager.register("discover", clusterCommands); } - private static void runCommand(CredentialsIssuer credIssuerCmds, String[] args) { - - // TODO::Start list of available commands, this hard coded list need to be replaced by command - // registration mechanism. - Command[] commands = {new On(credIssuerCmds), new Off(credIssuerCmds)}; - // End list of available commands - - if (args.length == 0) { - ShowUsage(commands); - return; - } - - for (Command cmd : commands) { - if (cmd.getName().equals(args[0])) { - String[] temp = Arrays.copyOfRange(args, 1, args.length); - - try { - cmd.initArguments(args.length - 1, temp); - cmd.run(); - } catch (IllegalArgumentException e) { - System.out.println("Arguments init failed with exception: " + e.getMessage()); - } catch (Exception e) { - System.out.println("Run command failed with exception: " + e.getMessage()); - } - break; - } - } + private static void registerCommandsPairing( + CommandManager commandManager, CredentialsIssuer credentialsIssuer) { + ArrayList clusterCommands = new ArrayList(); + UnpairCommand unpairCommand = new UnpairCommand(credentialsIssuer); + PairCodeCommand pairCodeCommand = new PairCodeCommand(credentialsIssuer); + PairCodePaseCommand pairCodePaseCommand = new PairCodePaseCommand(credentialsIssuer); + PairCodeWifiCommand pairCodeWifiCommand = new PairCodeWifiCommand(credentialsIssuer); + PairCodeThreadCommand pairCodeThreadCommand = new PairCodeThreadCommand(credentialsIssuer); + PairEthernetCommand pairEthernetCommand = new PairEthernetCommand(credentialsIssuer); + PairOnNetworkCommand pairOnNetworkCommand = new PairOnNetworkCommand(credentialsIssuer); + PairOnNetworkShortCommand pairOnNetworkShortCommand = + new PairOnNetworkShortCommand(credentialsIssuer); + PairOnNetworkLongCommand pairOnNetworkLongCommand = + new PairOnNetworkLongCommand(credentialsIssuer); + PairOnNetworkVendorCommand pairOnNetworkVendorCommand = + new PairOnNetworkVendorCommand(credentialsIssuer); + PairOnNetworkCommissioningModeCommand pairOnNetworkCommissioningModeCommand = + new PairOnNetworkCommissioningModeCommand(credentialsIssuer); + PairOnNetworkCommissionerCommand pairOnNetworkCommissionerCommand = + new PairOnNetworkCommissionerCommand(credentialsIssuer); + PairOnNetworkDeviceTypeCommand pairOnNetworkDeviceTypeCommand = + new PairOnNetworkDeviceTypeCommand(credentialsIssuer); + PairOnNetworkInstanceNameCommand pairOnNetworkInstanceNameCommand = + new PairOnNetworkInstanceNameCommand(credentialsIssuer); + clusterCommands.add(unpairCommand); + clusterCommands.add(pairCodeCommand); + clusterCommands.add(pairCodePaseCommand); + clusterCommands.add(pairCodeWifiCommand); + clusterCommands.add(pairCodeThreadCommand); + clusterCommands.add(pairEthernetCommand); + clusterCommands.add(pairOnNetworkCommand); + clusterCommands.add(pairOnNetworkShortCommand); + clusterCommands.add(pairOnNetworkLongCommand); + clusterCommands.add(pairOnNetworkVendorCommand); + clusterCommands.add(pairOnNetworkCommissioningModeCommand); + clusterCommands.add(pairOnNetworkCommissionerCommand); + clusterCommands.add(pairOnNetworkDeviceTypeCommand); + clusterCommands.add(pairOnNetworkInstanceNameCommand); + + commandManager.register("pairing", clusterCommands); } public static void main(String[] args) { + /* TODO: uncomment when SDK integration is done ChipDeviceController controller = new ChipDeviceController( ControllerParams.newBuilder() .setUdpListenPort(0) .setControllerVendorId(0xFFF1) .build()); + */ CredentialsIssuer credentialsIssuer = new CredentialsIssuer(); + CommandManager commandManager = new CommandManager(); + + registerCommandsDiscover(commandManager, credentialsIssuer); + registerCommandsPairing(commandManager, credentialsIssuer); - runCommand(credentialsIssuer, args); + try { + commandManager.run(args); + } catch (IllegalArgumentException e) { + System.out.println("Arguments init failed with exception: " + e.getMessage()); + } catch (Exception e) { + System.out.println("Run command failed with exception: " + e.getMessage()); + } } } diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java new file mode 100644 index 00000000000000..edcc61c3be86cc --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.common; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +public final class CommandManager { + private final ArrayList mCommandMgr = new ArrayList(); + private final Map> mClusters = + new HashMap>(); + + public final void register(String clusterName, ArrayList commandsList) { + mClusters.put(clusterName, commandsList); + } + + public final void run(String[] args) { + Command command; + + if (args.length < 1) { + System.out.println("Missing cluster name"); + showClusters(); + return; + } + + ArrayList commands = mClusters.get(args[0]); + if (commands == null) { + System.out.println("Unknown cluster: " + args[0]); + showClusters(); + return; + } + + if (args.length < 2) { + System.out.println("Missing command name"); + showCluster(args[0], commands); + return; + } + + if (!isGlobalCommand(args[0])) { + command = getCommand(commands, args[1]); + if (command == null) { + System.out.printf("Unknown command: %s", args[1]); + showCluster(args[0], commands); + throw new IllegalArgumentException(); + } + } else if (isEventCommand(args[1])) { + if (args.length < 3) { + System.out.println("Missing event name"); + showClusterEvents(args[0], args[1], commands); + throw new IllegalArgumentException(); + } + + command = getGlobalCommand(commands, args[1], args[2]); + if (command == null) { + System.out.println("Unknown event: " + args[2]); + showClusterEvents(args[0], args[1], commands); + throw new IllegalArgumentException(); + } + } else { + if (args.length < 3) { + System.out.println("Missing attribute name"); + showClusterAttributes(args[0], args[1], commands); + throw new IllegalArgumentException(); + } + + command = getGlobalCommand(commands, args[1], args[2]); + if (command == null) { + System.out.println("Unknown attribute: " + args[2]); + showClusterAttributes(args[0], args[1], commands); + throw new IllegalArgumentException(); + } + } + + String[] temp = Arrays.copyOfRange(args, 1, args.length); + + try { + command.initArguments(args.length - 1, temp); + command.run(); + } catch (IllegalArgumentException e) { + System.out.println("Arguments init failed with exception: " + e.getMessage()); + } catch (Exception e) { + System.out.println("Run command failed with exception: " + e.getMessage()); + } + } + + private boolean isAttributeCommand(String commandName) { + return commandName.equals("read") + || commandName.equals("write") + || commandName.equals("subscribe"); + } + + private boolean isEventCommand(String commandName) { + return commandName.equals("read-event") || commandName.equals("subscribe-event"); + } + + private boolean isGlobalCommand(String commandName) { + return isAttributeCommand(commandName) || isEventCommand(commandName); + } + + private Command getCommand(ArrayList commands, String commandName) { + for (Command command : commands) { + if (commandName.equals(command.getName())) { + return command; + } + } + + return null; + } + + private Command getGlobalCommand( + ArrayList commands, String commandName, String attributeName) { + for (Command command : commands) { + if (commandName.equals(command.getName()) && attributeName.equals(command.getAttribute())) { + return command; + } + } + + return null; + } + + private void showClusters() { + System.out.println("Usage:"); + System.out.println(" java-matter-controller cluster_name command_name [param1 param2 ...]"); + System.out.println("\n"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + System.out.println( + " | Clusters: |"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + + for (String key : mClusters.keySet()) { + System.out.printf(" | * %-82s|\n", key.toLowerCase()); + } + + System.out.println( + " +-------------------------------------------------------------------------------------+"); + } + + private void showCluster(String clusterName, ArrayList commands) { + System.out.println("Usage:"); + System.out.println( + " java-matter-controller " + clusterName + " command_name [param1 param2 ...]"); + System.out.println("\n"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + System.out.println( + " | Commands: |"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + boolean readCommand = false; + boolean writeCommand = false; + boolean subscribeCommand = false; + boolean readEventCommand = false; + boolean subscribeEventCommand = false; + + for (Command command : commands) { + boolean shouldPrint = true; + String cmdName = command.getName(); + if (isGlobalCommand(cmdName)) { + if (cmdName.equals("read") && !readCommand) { + readCommand = true; + } else if (cmdName.equals("write") && !writeCommand) { + writeCommand = true; + } else if (cmdName.equals("subscribe") && !subscribeCommand) { + subscribeCommand = true; + } else if (cmdName.equals("read-event") && !readEventCommand) { + readEventCommand = true; + } else if (cmdName.equals("subscribe-event") && !subscribeEventCommand) { + subscribeEventCommand = true; + } else { + shouldPrint = false; + } + } + + if (shouldPrint) { + System.out.printf(" | * %-82s|\n", cmdName); + } + } + System.out.println( + " +-------------------------------------------------------------------------------------+\n"); + } + + private void showClusterAttributes( + String clusterName, String commandName, ArrayList commands) { + System.out.println("Usage:"); + System.out.printf( + " java-matter-controller %s %s attribute-name [param1 param2 ...]\n", + clusterName, commandName); + System.out.println("\n"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + System.out.println( + " | Attributes: |"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + for (Command command : commands) { + if (commandName.equals(command.getName())) { + System.out.printf(" | * %-82s|\n", command.getAttribute().get()); + } + } + System.out.println( + " +-------------------------------------------------------------------------------------+"); + } + + private void showClusterEvents( + String clusterName, String commandName, ArrayList commands) { + System.out.println("Usage:"); + System.out.printf( + " java-matter-controller %s %s event-name [param1 param2 ...]\n", + clusterName, commandName); + System.out.println("\n"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + System.out.println( + " | Events: |"); + System.out.println( + " +-------------------------------------------------------------------------------------+"); + + for (Command command : commands) { + if (commandName.equals(command.getName())) { + System.out.printf(" | * %-82s|\n", command.getAttribute().get()); + } + } + System.out.println( + " +-------------------------------------------------------------------------------------+"); + } +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/On.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommand.java similarity index 73% rename from examples/java-matter-controller/java/src/com/matter/controller/On.java rename to examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommand.java index 29fb65fbf97117..00c81d10d866a5 100644 --- a/examples/java-matter-controller/java/src/com/matter/controller/On.java +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommand.java @@ -1,37 +1,41 @@ -/* - * Copyright (c) 2022 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. - * - */ - -package com.matter.controller; - -import com.matter.controller.commands.common.CredentialsIssuer; -import com.matter.controller.commands.common.MatterCommand; -import java.util.concurrent.atomic.AtomicLong; - -public final class On extends MatterCommand { - private final AtomicLong mNodeId = new AtomicLong(); - private final AtomicLong mFabricId = new AtomicLong(); - - public On(CredentialsIssuer credIssuerCmds) { - super("on", credIssuerCmds); - addArgument("nodeid", 0, Long.MAX_VALUE, mNodeId, null); - addArgument("fabricid", 0, Long.MAX_VALUE, mFabricId, null); - } - - @Override - protected final void runCommand() {} -} +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.discover; + +import com.matter.controller.commands.common.CredentialsIssuer; +import com.matter.controller.commands.common.MatterCommand; +import java.util.concurrent.atomic.AtomicLong; + +public final class DiscoverCommand extends MatterCommand { + private final AtomicLong mNodeId = new AtomicLong(); + private final AtomicLong mFabricId = new AtomicLong(); + + public DiscoverCommand(CredentialsIssuer credsIssuer) { + super("resolve", credsIssuer); + addArgument("nodeid", 0, Long.MAX_VALUE, mNodeId, null); + addArgument("fabricid", 0, Long.MAX_VALUE, mFabricId, null); + } + + @Override + protected final void runCommand() { + runCommand(mNodeId.get(), mFabricId.get()); + } + + private final void runCommand(long remoteId, long fabricId) {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/Off.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommissionablesCommand.java similarity index 65% rename from examples/java-matter-controller/java/src/com/matter/controller/Off.java rename to examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommissionablesCommand.java index 2eceb657222f50..cb128c41b005d4 100644 --- a/examples/java-matter-controller/java/src/com/matter/controller/Off.java +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommissionablesCommand.java @@ -16,20 +16,14 @@ * */ -package com.matter.controller; +package com.matter.controller.commands.discover; import com.matter.controller.commands.common.CredentialsIssuer; import com.matter.controller.commands.common.MatterCommand; -import java.util.concurrent.atomic.AtomicLong; -public final class Off extends MatterCommand { - private final AtomicLong mNodeId = new AtomicLong(); - private final AtomicLong mFabricId = new AtomicLong(); - - public Off(CredentialsIssuer credIssuerCmds) { - super("off", credIssuerCmds); - addArgument("nodeid", 0L, Long.MAX_VALUE, mNodeId, null); - addArgument("fabricid", 0L, Long.MAX_VALUE, mFabricId, null); +public final class DiscoverCommissionablesCommand extends MatterCommand { + public DiscoverCommissionablesCommand(CredentialsIssuer credsIssuer) { + super("commissionables", credsIssuer); } @Override diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommissionersCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommissionersCommand.java new file mode 100644 index 00000000000000..a7a373683ae16c --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/discover/DiscoverCommissionersCommand.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.discover; + +import com.matter.controller.commands.common.CredentialsIssuer; +import com.matter.controller.commands.common.MatterCommand; + +public final class DiscoverCommissionersCommand extends MatterCommand { + public DiscoverCommissionersCommand(CredentialsIssuer credsIssuer) { + super("commissioners", credsIssuer); + } + + @Override + protected final void runCommand() { + // mCommissionableNodeController.DiscoverCommissioners(); + } +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/CloseSessionCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/CloseSessionCommand.java new file mode 100644 index 00000000000000..f756f531746873 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/CloseSessionCommand.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; +import com.matter.controller.commands.common.MatterCommand; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +public final class CloseSessionCommand extends MatterCommand { + private final AtomicLong mDestinationId = new AtomicLong(); + private final AtomicInteger mTimeoutSecs = new AtomicInteger(); + + public CloseSessionCommand(CredentialsIssuer credsIssuer) { + super("close-session", credsIssuer); + addArgument("destination-id", 0, Long.MAX_VALUE, mDestinationId, null); + addArgument( + "timeout", + (short) 0, + Short.MAX_VALUE, + mTimeoutSecs, + "Time, in seconds, before this command is considered to have timed out."); + } + + @Override + protected final void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/DiscoveryFilterType.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/DiscoveryFilterType.java new file mode 100644 index 00000000000000..1d614eb5b462d2 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/DiscoveryFilterType.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.pairing; + +public enum DiscoveryFilterType { + NONE, + SHORT_DISCRIMINATOR, + LONG_DISCRIMINATOR, + VENDOR_ID, + DEVICE_TYPE, + COMMISSIONING_MODE, + INSTANCE_NAME, + COMMISSIONER, + COMPRESSED_FABRIC_ID, +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeCommand.java new file mode 100644 index 00000000000000..ceadf2ffed00c6 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeCommand.java @@ -0,0 +1,12 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairCodeCommand extends PairingCommand { + public PairCodeCommand(CredentialsIssuer credsIssue) { + super("code", PairingModeType.CODE, PairingNetworkType.NONE, credsIssue); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodePaseCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodePaseCommand.java new file mode 100644 index 00000000000000..32a3bad4c14f93 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodePaseCommand.java @@ -0,0 +1,12 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairCodePaseCommand extends PairingCommand { + public PairCodePaseCommand(CredentialsIssuer credsIssue) { + super("code-paseonly", PairingModeType.CODE_PASE_ONLY, PairingNetworkType.NONE, credsIssue); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeThreadCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeThreadCommand.java new file mode 100644 index 00000000000000..8d036d2944beec --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeThreadCommand.java @@ -0,0 +1,12 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairCodeThreadCommand extends PairingCommand { + public PairCodeThreadCommand(CredentialsIssuer credsIssue) { + super("code-thread", PairingModeType.CODE, PairingNetworkType.THREAD, credsIssue); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeWifiCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeWifiCommand.java new file mode 100644 index 00000000000000..80c8098405d667 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairCodeWifiCommand.java @@ -0,0 +1,12 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairCodeWifiCommand extends PairingCommand { + public PairCodeWifiCommand(CredentialsIssuer credsIssue) { + super("code-wifi", PairingModeType.CODE, PairingNetworkType.WIFI, credsIssue); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairEthernetCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairEthernetCommand.java new file mode 100644 index 00000000000000..4296df73b9cef5 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairEthernetCommand.java @@ -0,0 +1,12 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairEthernetCommand extends PairingCommand { + public PairEthernetCommand(CredentialsIssuer credsIssue) { + super("ethernet", PairingModeType.ETHERNET, PairingNetworkType.ETHERNET, credsIssue); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommand.java new file mode 100644 index 00000000000000..073e13fee7d2b8 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommand.java @@ -0,0 +1,12 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkCommand extends PairingCommand { + public PairOnNetworkCommand(CredentialsIssuer credsIssue) { + super("onnetwork", PairingModeType.ON_NETWORK, PairingNetworkType.NONE, credsIssue); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissionerCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissionerCommand.java new file mode 100644 index 00000000000000..6feb9d94670a81 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissionerCommand.java @@ -0,0 +1,17 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkCommissionerCommand extends PairingCommand { + public PairOnNetworkCommissionerCommand(CredentialsIssuer credsIssue) { + super( + "onnetwork-commissioner", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.COMMISSIONER); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissioningModeCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissioningModeCommand.java new file mode 100644 index 00000000000000..4b44e5cd7896a2 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkCommissioningModeCommand.java @@ -0,0 +1,17 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkCommissioningModeCommand extends PairingCommand { + public PairOnNetworkCommissioningModeCommand(CredentialsIssuer credsIssue) { + super( + "onnetwork-commissioning-mode", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.COMMISSIONING_MODE); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkDeviceTypeCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkDeviceTypeCommand.java new file mode 100644 index 00000000000000..ad6e98fe57d45f --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkDeviceTypeCommand.java @@ -0,0 +1,17 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkDeviceTypeCommand extends PairingCommand { + public PairOnNetworkDeviceTypeCommand(CredentialsIssuer credsIssue) { + super( + "onnetwork-device-type", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.DEVICE_TYPE); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkFabricCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkFabricCommand.java new file mode 100644 index 00000000000000..c430cd7da0cda5 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkFabricCommand.java @@ -0,0 +1,18 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; +import java.net.UnknownHostException; + +public final class PairOnNetworkFabricCommand extends PairingCommand { + public PairOnNetworkFabricCommand(CredentialsIssuer credsIssue) throws UnknownHostException { + super( + "onnetwork-fabric", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.COMPRESSED_FABRIC_ID); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkInstanceNameCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkInstanceNameCommand.java new file mode 100644 index 00000000000000..c3dd7f7731047a --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkInstanceNameCommand.java @@ -0,0 +1,17 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkInstanceNameCommand extends PairingCommand { + public PairOnNetworkInstanceNameCommand(CredentialsIssuer credsIssue) { + super( + "onnetwork-instance-name", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.INSTANCE_NAME); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongCommand.java new file mode 100644 index 00000000000000..62ee8c03ccf8c9 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongCommand.java @@ -0,0 +1,17 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkLongCommand extends PairingCommand { + public PairOnNetworkLongCommand(CredentialsIssuer credsIssue) { + super( + "onnetwork-long", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.LONG_DISCRIMINATOR); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkShortCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkShortCommand.java new file mode 100644 index 00000000000000..e6af8dc6bd7f5a --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkShortCommand.java @@ -0,0 +1,17 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkShortCommand extends PairingCommand { + public PairOnNetworkShortCommand(CredentialsIssuer credsIssue) { + super( + "onnetwork-short", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.SHORT_DISCRIMINATOR); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkVendorCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkVendorCommand.java new file mode 100644 index 00000000000000..398203d916d48a --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkVendorCommand.java @@ -0,0 +1,17 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class PairOnNetworkVendorCommand extends PairingCommand { + public PairOnNetworkVendorCommand(CredentialsIssuer credsIssue) { + super( + "onnetwork-vendor", + PairingModeType.ON_NETWORK, + PairingNetworkType.NONE, + credsIssue, + DiscoveryFilterType.VENDOR_ID); + } + + @Override + protected void runCommand() {} +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingCommand.java new file mode 100644 index 00000000000000..151c88bf8bd2ca --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingCommand.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; +import com.matter.controller.commands.common.IPAddress; +import com.matter.controller.commands.common.MatterCommand; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +public abstract class PairingCommand extends MatterCommand { + private PairingModeType mPairingMode = PairingModeType.NONE; + private PairingNetworkType mNetworkType = PairingNetworkType.NONE; + private DiscoveryFilterType mFilterType = DiscoveryFilterType.NONE; + private final IPAddress mRemoteAddr; + private final AtomicLong mNodeId = new AtomicLong(); + private final AtomicLong mDiscoveryFilterCode = new AtomicLong(); + private final AtomicInteger mTimeout = new AtomicInteger(); + private final AtomicBoolean mDiscoverOnce = new AtomicBoolean(); + private final AtomicBoolean mUseOnlyOnNetworkDiscovery = new AtomicBoolean(); + private final AtomicInteger mRemotePort = new AtomicInteger(); + private final AtomicInteger mDiscriminator = new AtomicInteger(); + private final AtomicInteger mSetupPINCode = new AtomicInteger(); + private final StringBuffer mOperationalDataset = new StringBuffer(); + private final StringBuffer mSSID = new StringBuffer(); + private final StringBuffer mPassword = new StringBuffer(); + private final StringBuffer mOnboardingPayload = new StringBuffer(); + private final StringBuffer mDiscoveryFilterInstanceName = new StringBuffer(); + + public PairingCommand( + String commandName, + PairingModeType mode, + PairingNetworkType networkType, + CredentialsIssuer credsIssuer) { + this(commandName, mode, networkType, credsIssuer, DiscoveryFilterType.NONE); + } + + public PairingCommand( + String commandName, + PairingModeType mode, + PairingNetworkType networkType, + CredentialsIssuer credsIssuer, + DiscoveryFilterType filterType) { + super(commandName, credsIssuer); + this.mPairingMode = mode; + this.mNetworkType = networkType; + this.mFilterType = filterType; + + try { + this.mRemoteAddr = new IPAddress(InetAddress.getByName("0.0.0.0")); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + + addArgument("node-id", 0, Long.MAX_VALUE, mNodeId, null); + + switch (networkType) { + case NONE: + case ETHERNET: + break; + case WIFI: + addArgument("ssid", mSSID, null); + addArgument("password", mPassword, null); + break; + case THREAD: + addArgument("operationalDataset", mOperationalDataset, null); + break; + } + + switch (mode) { + case NONE: + break; + case CODE: + case CODE_PASE_ONLY: + Only: + addArgument("payload", mOnboardingPayload, null); + addArgument("discover-once", mDiscoverOnce, null); + addArgument("use-only-onnetwork-discovery", mUseOnlyOnNetworkDiscovery, null); + break; + case BLE: + addArgument("setup-pin-code", 0, 134217727, mSetupPINCode, null); + addArgument("discriminator", (short) 0, (short) 4096, mDiscriminator, null); + break; + case ON_NETWORK: + addArgument("setup-pin-code", 0, 134217727, mSetupPINCode, null); + break; + case SOFT_AP: + AP: + addArgument("setup-pin-code", 0, 134217727, mSetupPINCode, null); + addArgument("discriminator", (short) 0, (short) 4096, mDiscriminator, null); + addArgument("device-remote-ip", mRemoteAddr); + addArgument("device-remote-port", (short) 0, Short.MAX_VALUE, mRemotePort, null); + break; + case ETHERNET: + addArgument("setup-pin-code", 0, 134217727, mSetupPINCode, null); + addArgument("discriminator", (short) 0, (short) 4096, mDiscriminator, null); + addArgument("device-remote-ip", mRemoteAddr); + addArgument("device-remote-port", (short) 0, Short.MAX_VALUE, mRemotePort, null); + break; + } + + switch (filterType) { + case NONE: + break; + case SHORT_DISCRIMINATOR: + addArgument("discriminator", (short) 0, (short) 4096, mDiscriminator, null); + break; + case LONG_DISCRIMINATOR: + addArgument("discriminator", (short) 0, (short) 4096, mDiscriminator, null); + break; + case VENDOR_ID: + addArgument("vendor-id", (short) 0, Short.MAX_VALUE, mDiscoveryFilterCode, null); + break; + case COMPRESSED_FABRIC_ID: + addArgument("fabric-id", 0, Long.MAX_VALUE, mDiscoveryFilterCode, null); + break; + case COMMISSIONING_MODE: + case COMMISSIONER: + break; + case DEVICE_TYPE: + addArgument("device-type", (short) 0, Short.MAX_VALUE, mDiscoveryFilterCode, null); + break; + case INSTANCE_NAME: + addArgument("name", mDiscoveryFilterInstanceName, null); + break; + } + + addArgument("timeout", (short) 0, Short.MAX_VALUE, mTimeout, null); + } +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingModeType.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingModeType.java new file mode 100644 index 00000000000000..015bb8005acc25 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingModeType.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.pairing; + +public enum PairingModeType { + NONE, + CODE, + CODE_PASE_ONLY, + BLE, + SOFT_AP, + ETHERNET, + ON_NETWORK; +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingNetworkType.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingNetworkType.java new file mode 100644 index 00000000000000..1edbe327585577 --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairingNetworkType.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2022 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. + * + */ + +package com.matter.controller.commands.pairing; + +public enum PairingNetworkType { + NONE, + WIFI, + THREAD, + ETHERNET; +} diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/UnpairCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/UnpairCommand.java new file mode 100644 index 00000000000000..8cf1f844e1511d --- /dev/null +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/UnpairCommand.java @@ -0,0 +1,12 @@ +package com.matter.controller.commands.pairing; + +import com.matter.controller.commands.common.CredentialsIssuer; + +public final class UnpairCommand extends PairingCommand { + public UnpairCommand(CredentialsIssuer credsIssue) { + super("unpair", PairingModeType.NONE, PairingNetworkType.NONE, credsIssue); + } + + @Override + protected void runCommand() {} +}