Fixed device pairing for ZigBee devices, endpoints not working still

This commit is contained in:
Ziver Koc 2021-01-07 01:25:58 +01:00
parent 3b949b13f7
commit 326d773741
4 changed files with 113 additions and 14 deletions

View file

@ -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);

View file

@ -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<IeeeAddress,ZigBeeNodeDao> devices = new HashMap<>();
@Override
public Set<IeeeAddress> 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);
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}