/** * Gets the {@link LogicalType} of the node. * <p> * Possible types are -: * <ul> * <li>{@link LogicalType#COORDINATOR} * <li>{@link LogicalType#ROUTER} * <li>{@link LogicalType#END_DEVICE} * <ul> * * @return the {@link LogicalType} of the node */ public LogicalType getLogicalType() { return nodeDescriptor.getLogicalType(); }
/** * Checks if basic device discovery is complete. This ensures that we have received the {@link NodeDescriptor} and * the {@link SimpleDescriptor} so that we know the endpoints. * * @return true if basic device information is known */ public boolean isDiscovered() { return nodeDescriptor.getLogicalType() != LogicalType.UNKNOWN && endpoints.size() != 0; }
@Override public String toString() { StringBuilder builder = new StringBuilder(100); builder.append("ZigBeeNode [state="); builder.append(nodeState); builder.append(", IEEE="); builder.append(ieeeAddress); builder.append(String.format(", NWK=%04X", networkAddress)); if (nodeDescriptor != null) { builder.append(", Type="); builder.append(nodeDescriptor.getLogicalType()); } builder.append(']'); return builder.toString(); }
/** * Starts service discovery for the node in order to update the mesh. This adds the * {@link NodeDiscoveryTask#NEIGHBORS} and {@link NodeDiscoveryTask#ROUTES} tasks to the task list. * <p> * Note that {@link NodeDiscoveryTask#ROUTES} is not added for end devices. */ public void updateMesh() { logger.debug("{}: Node SVC Discovery: Update mesh", node.getIeeeAddress()); Set<NodeDiscoveryTask> tasks = new HashSet<NodeDiscoveryTask>(); tasks.add(NodeDiscoveryTask.NEIGHBORS); if (node.getNodeDescriptor().getLogicalType() != LogicalType.END_DEVICE) { tasks.add(NodeDiscoveryTask.ROUTES); } startDiscovery(tasks); }
/** * Starts service discovery for the node. */ public void startDiscovery() { logger.debug("{}: Node SVC Discovery: start discovery", node.getIeeeAddress()); Set<NodeDiscoveryTask> tasks = new HashSet<NodeDiscoveryTask>(); // Always request the network address - in case it's changed tasks.add(NodeDiscoveryTask.NWK_ADDRESS); if (node.getNodeDescriptor().getLogicalType() == LogicalType.UNKNOWN) { tasks.add(NodeDiscoveryTask.NODE_DESCRIPTOR); } if (node.getPowerDescriptor().getCurrentPowerMode() == CurrentPowerModeType.UNKNOWN) { tasks.add(NodeDiscoveryTask.POWER_DESCRIPTOR); } if (node.getEndpoints().size() == 0 && node.getNetworkAddress() != networkManager.getLocalNwkAddress()) { tasks.add(NodeDiscoveryTask.ACTIVE_ENDPOINTS); } tasks.add(NodeDiscoveryTask.NEIGHBORS); startDiscovery(tasks); }
@Test public void testLocal() throws Exception { ZigBeeNode node = Mockito.mock(ZigBeeNode.class); ZigBeeNodeServiceDiscoverer discoverer = new ZigBeeNodeServiceDiscoverer(networkManager, node); TestUtilities.setField(ZigBeeNodeServiceDiscoverer.class, discoverer, "retryPeriod", 1); NodeDescriptor initialNodeDescriptor = Mockito.mock(NodeDescriptor.class); Mockito.when(initialNodeDescriptor.getLogicalType()).thenReturn(LogicalType.UNKNOWN); Mockito.when(node.getNodeDescriptor()).thenReturn(initialNodeDescriptor); PowerDescriptor initialPowerDescriptor = Mockito.mock(PowerDescriptor.class); Mockito.when(initialPowerDescriptor.getCurrentPowerMode()).thenReturn(CurrentPowerModeType.UNKNOWN); Mockito.when(node.getPowerDescriptor()).thenReturn(initialPowerDescriptor); // Use node 0 and we should not try and get the local endpoints Mockito.when(node.getNetworkAddress()).thenReturn(0); ScheduledFuture<?> futureTask = Mockito.mock(ScheduledFuture.class); TestUtilities.setField(ZigBeeNodeServiceDiscoverer.class, discoverer, "futureTask", futureTask); discoverer.startDiscovery(); Mockito.verify(futureTask, Mockito.times(1)).cancel(true); assertFalse(discoverer.getTasks().contains(NodeDiscoveryTask.ACTIVE_ENDPOINTS)); } }
@Test public void testNodeDescriptorDeserialize() { int[] packet = getPacketData("00 00 00 00 00 40 8F CD AB 52 80 00 41 2A 80 00 00"); NodeDescriptor descriptor = new NodeDescriptor(); DefaultDeserializer deserializer = new DefaultDeserializer(packet); descriptor.deserialize(deserializer); System.out.println(descriptor); assertEquals(0, descriptor.getManufacturerCode()); assertEquals(LogicalType.COORDINATOR, descriptor.getLogicalType()); }
@Test public void testNodeDescriptor() { NodeDescriptor descriptor = new NodeDescriptor(0, 3333, 74, true, 6666, 0, 6, 4444, true, 8); assertTrue(descriptor.isComplexDescriptorAvailable()); assertTrue(descriptor.isUserDescriptorAvailable()); assertEquals(4444, descriptor.getIncomingTransferSize()); assertEquals(6666, descriptor.getManufacturerCode()); assertEquals(3333, descriptor.getBufferSize()); assertTrue(descriptor.getFrequencyBands().contains(FrequencyBandType.FREQ_2400_MHZ)); assertEquals(LogicalType.COORDINATOR, descriptor.getLogicalType()); assertEquals(0, descriptor.getApsFlags()); assertTrue(descriptor.getServerCapabilities().contains(ServerCapabilitiesType.PRIMARY_BINDING_TABLE_CACHE)); assertTrue(descriptor.getServerCapabilities().contains(ServerCapabilitiesType.BACKUP_TRUST_CENTER)); assertTrue(descriptor.getMacCapabilities().contains(MacCapabilitiesType.SECURITY_CAPABLE)); assertTrue(descriptor.getMacCapabilities().contains(MacCapabilitiesType.RECEIVER_ON_WHEN_IDLE)); assertTrue(descriptor.getMacCapabilities().contains(MacCapabilitiesType.FULL_FUNCTION_DEVICE)); }
Mockito.when(initialNodeDescriptor.getLogicalType()).thenReturn(LogicalType.UNKNOWN); Mockito.when(node.getNodeDescriptor()).thenReturn(initialNodeDescriptor);