diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java index ff242eb3..a9d62b45 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java @@ -2,12 +2,19 @@ package se.hal.plugin.zigbee; import com.zsmartsystems.zigbee.ZigBeeNetworkManager; +import com.zsmartsystems.zigbee.ZigBeeProfileType; import com.zsmartsystems.zigbee.ZigBeeStatus; +import com.zsmartsystems.zigbee.app.basic.ZigBeeBasicServerExtension; +import com.zsmartsystems.zigbee.app.discovery.ZigBeeDiscoveryExtension; +import com.zsmartsystems.zigbee.app.iasclient.ZigBeeIasCieExtension; +import com.zsmartsystems.zigbee.app.otaserver.ZigBeeOtaUpgradeExtension; import com.zsmartsystems.zigbee.dongle.cc2531.ZigBeeDongleTiCc2531; import com.zsmartsystems.zigbee.dongle.conbee.ZigBeeDongleConBee; import com.zsmartsystems.zigbee.dongle.xbee.ZigBeeDongleXBee; -import com.zsmartsystems.zigbee.transport.ZigBeePort; -import com.zsmartsystems.zigbee.transport.ZigBeeTransportTransmit; +import com.zsmartsystems.zigbee.security.ZigBeeKey; +import com.zsmartsystems.zigbee.serialization.DefaultDeserializer; +import com.zsmartsystems.zigbee.serialization.DefaultSerializer; +import com.zsmartsystems.zigbee.transport.*; import se.hal.HalContext; import se.hal.intf.*; import se.hal.struct.AbstractDevice; @@ -49,21 +56,58 @@ public class HalZigbeeController implements HalSensorController, HalEventControl serialPort = new ZigBeeJSerialCommPort(comPort); dataStore = new ZigBeeDataStore(); - ZigBeeTransportTransmit dongle = getDongle("CC2531"); + // ---------------------------- + // Initialize Transport Network + // ---------------------------- + + ZigBeeTransportTransmit dongle = getDongle("CC2531", serialPort); networkManager = new ZigBeeNetworkManager(dongle); networkManager.setNetworkDataStore(dataStore); + networkManager.setSerializer(DefaultSerializer.class, DefaultDeserializer.class); + // Initialize Network + + logger.info("Initializing ZigBee Network..."); ZigBeeStatus initResponse = networkManager.initialize(); - System.out.println("NetworkManager.initialize() returned " + initResponse); + logger.info("ZigBee Network initialization finished with: " + initResponse); - if (dongle instanceof ZigBeeDongleTiCc2531) { + // ------------------------ + // Startup Network + // ------------------------ + + networkManager.setDefaultProfileId(ZigBeeProfileType.ZIGBEE_HOME_AUTOMATION.getKey()); + + TransportConfig transportOptions = new TransportConfig(); + transportOptions.addOption(TransportConfigOption.RADIO_TX_POWER, 3); + transportOptions.addOption(TransportConfigOption.TRUST_CENTRE_JOIN_MODE, TrustCentreJoinMode.TC_JOIN_SECURE); + transportOptions.addOption(TransportConfigOption.TRUST_CENTRE_LINK_KEY, new ZigBeeKey(new int[] { + 0x5A, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6C, 0x6C, 0x69, 0x61, 0x6E, 0x63, 0x65, 0x30, 0x39 })); + dongle.updateTransportConfig(transportOptions); + + // Register extensions + + networkManager.addExtension(new ZigBeeOtaUpgradeExtension()); + networkManager.addExtension(new ZigBeeBasicServerExtension()); + networkManager.addExtension(new ZigBeeDiscoveryExtension()); + + // Startup Network + + logger.info("Starting up ZigBee Network..."); + ZigBeeStatus startResponse = networkManager.startup(false); + logger.info("ZigBee Network startup finished with: " + startResponse); + + // ----------- + // Other stuff + // ----------- + + /*if (dongle instanceof ZigBeeDongleTiCc2531) { ZigBeeDongleTiCc2531 tiDongle = (ZigBeeDongleTiCc2531) dongle; tiDongle.setLedMode(1, false); tiDongle.setLedMode(2, false); - } + }*/ } - private ZigBeeTransportTransmit getDongle(String name) { + private static ZigBeeTransportTransmit getDongle(String name, ZigBeePort serialPort) { switch (name) { case "CC2531": return new ZigBeeDongleTiCc2531(serialPort); diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java index fc06686c..e682915b 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java @@ -27,31 +27,42 @@ package se.hal.plugin.zigbee; import com.zsmartsystems.zigbee.IeeeAddress; import com.zsmartsystems.zigbee.database.ZigBeeNetworkDataStore; import com.zsmartsystems.zigbee.database.ZigBeeNodeDao; +import zutil.log.LogUtil; +import java.util.HashMap; import java.util.HashSet; import java.util.Set; +import java.util.logging.Logger; + public class ZigBeeDataStore implements ZigBeeNetworkDataStore { + private static final Logger logger = LogUtil.getLogger(); + private HashMap devices = new HashMap<>(); + @Override public Set readNetworkNodes() { - System.out.println("ZigBeeDataStore.readNetworkNodes()"); - return new HashSet<>(); + return devices.keySet(); } @Override public ZigBeeNodeDao readNode(IeeeAddress address) { System.out.println("ZigBeeDataStore.readNetworkNodes(" + address + ")"); - return null; + + return devices.get(address); } @Override public void writeNode(ZigBeeNodeDao node) { System.out.println("ZigBeeDataStore.writeNode(" + node + ")"); + + devices.put(node.getIeeeAddress(), node); } @Override public void removeNode(IeeeAddress address) { System.out.println("ZigBeeDataStore.removeNode(" + address + ")"); + + devices.remove(address); } } diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java index 6da11adb..34a60e04 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java @@ -111,7 +111,7 @@ public class ZigBeeJSerialCommPort implements ZigBeePort { return true; } catch (Exception e) { - logger.warn("Unable to open serial port: " + e.getMessage()); + logger.error("Unable to open serial port: " + e.getMessage()); return false; } } diff --git a/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java b/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java index e6996e4f..24a05928 100644 --- a/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java +++ b/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java @@ -24,6 +24,8 @@ package se.hal.plugin.zigbee; +import com.zsmartsystems.zigbee.ZigBeeNetworkManager; +import com.zsmartsystems.zigbee.ZigBeeNode; import zutil.log.CompactLogFormatter; import zutil.log.LogUtil; @@ -34,6 +36,7 @@ import java.util.logging.Level; public class HalZigbeeControllerTest { public static void main(String[] args) throws IOException, InterruptedException { + LogUtil.readConfiguration("logging.properties"); LogUtil.setGlobalFormatter(new CompactLogFormatter()); LogUtil.setGlobalLevel(Level.ALL); @@ -43,11 +46,52 @@ public class HalZigbeeControllerTest { System.out.println("PAN ID = " + controller.networkManager.getZigBeePanId()); System.out.println("Extended PAN ID = " + controller.networkManager.getZigBeeExtendedPanId()); System.out.println("Channel = " + controller.networkManager.getZigBeeChannel()); - controller.networkManager.permitJoin(50); - System.out.println("Press ENTER to exit application."); - System.in.read(); + handleConsoleInput('h', controller.networkManager); + + while(true) { + char input = waitForInout(); + handleConsoleInput(input, controller.networkManager); + + if (input == 'q') break; + } controller.close(); } + + + private static void handleConsoleInput(char input, ZigBeeNetworkManager networkManager) { + switch (input) { + case 'l': + for (ZigBeeNode node : networkManager.getNodes()) { + System.out.println(node); + } + System.out.println("Number of ZigBee Nodes: " + networkManager.getNodes().size()); + break; + + case 'p': + System.out.println("Enabling pairing."); + networkManager.permitJoin(200); + break; + + case 'q': + System.out.println("Shutting down."); + break; + + case 'h': + default: + System.out.println("Available commands:"); + System.out.println(" l: List available ZigBee Nodes"); + System.out.println(" p: Enable pairing of ZigBee devices"); + System.out.println(" q: Quit"); + System.out.println(" h: Help text"); + break; + } + } + + private static char waitForInout() throws IOException { + System.out.print("Input command and finish with ENTER: "); + + return (char) System.in.read(); + } } \ No newline at end of file