use of com.zsmartsystems.zigbee.zdo.field.SimpleDescriptor in project com.zsmartsystems.zigbee by zsmartsystems.
the class SimpleDescriptorResponseTest method testReceiveError.
@Test
public void testReceiveError() {
// int[] packet = getPacketData("00 00 00 00 10 C1");
int[] packet = getPacketData("00 81 00 01");
SimpleDescriptorResponse descriptorResponse = new SimpleDescriptorResponse();
DefaultDeserializer deserializer = new DefaultDeserializer(packet);
ZclFieldDeserializer fieldDeserializer = new ZclFieldDeserializer(deserializer);
descriptorResponse.deserialize(fieldDeserializer);
System.out.println(descriptorResponse);
SimpleDescriptor simpleDescriptor = descriptorResponse.getSimpleDescriptor();
assertNull(simpleDescriptor);
assertEquals(ZdoStatus.DEVICE_NOT_FOUND, descriptorResponse.getStatus());
}
use of com.zsmartsystems.zigbee.zdo.field.SimpleDescriptor in project com.zsmartsystems.zigbee by zsmartsystems.
the class DefaultDeserializer method readZigBeeType.
@Override
public /**
* {@inheritDoc}
*/
Object readZigBeeType(ZclDataType type) {
if (index == payload.length) {
return null;
}
Object[] value = new Object[1];
switch(type) {
case BOOLEAN:
value[0] = payload[index++] == 0 ? false : true;
break;
case CHARACTER_STRING:
case OCTET_STRING:
int size = payload[index++];
if (size == 255) {
value[0] = null;
break;
}
int length = size;
for (int cnt = 0; cnt < size; cnt++) {
if (payload[index + cnt] == 0) {
length = cnt;
}
}
value[0] = new String(payload, index, length);
index += size;
break;
case ENDPOINT:
case BITMAP_8_BIT:
case DATA_8_BIT:
case ENUMERATION_8_BIT:
value[0] = Integer.valueOf((byte) payload[index++] & 0xFF);
break;
case EXTENDED_PANID:
int[] panId = new int[8];
for (int iCnt = 7; iCnt >= 0; iCnt--) {
panId[iCnt] = payload[index + iCnt];
}
index += 8;
value[0] = new ExtendedPanId(panId);
break;
case IEEE_ADDRESS:
int[] address = new int[8];
for (int iCnt = 7; iCnt >= 0; iCnt--) {
address[iCnt] = payload[index + iCnt];
}
index += 8;
value[0] = new IeeeAddress(address);
break;
case N_X_ATTRIBUTE_INFORMATION:
break;
case N_X_ATTRIBUTE_RECORD:
break;
case N_X_ATTRIBUTE_REPORT:
break;
case N_X_ATTRIBUTE_REPORTING_CONFIGURATION_RECORD:
break;
case N_X_ATTRIBUTE_SELECTOR:
break;
case N_X_ATTRIBUTE_STATUS_RECORD:
break;
case N_X_EXTENSION_FIELD_SET:
break;
case N_X_NEIGHBORS_INFORMATION:
break;
case N_X_READ_ATTRIBUTE_STATUS_RECORD:
break;
case N_X_UNSIGNED_16_BIT_INTEGER:
int cntN16 = Integer.valueOf((byte) payload[index++] & 0xFF);
List<Integer> arrayN16 = new ArrayList<Integer>(cntN16);
for (int arrayIndex = 0; arrayIndex < cntN16; arrayIndex++) {
arrayN16.add(Integer.valueOf(payload[index++] + ((payload[index++] << 8) & 0xffff)));
}
value[0] = arrayN16;
break;
case N_X_UNSIGNED_8_BIT_INTEGER:
int cntN8 = Integer.valueOf((byte) payload[index++] & 0xFF);
List<Integer> arrayN8 = new ArrayList<Integer>(cntN8);
for (int arrayIndex = 0; arrayIndex < cntN8; arrayIndex++) {
arrayN8.add(Integer.valueOf(payload[index++]));
}
value[0] = arrayN8;
break;
case X_UNSIGNED_8_BIT_INTEGER:
int cntX8 = payload.length - index;
List<Integer> arrayX8 = new ArrayList<Integer>(cntX8);
for (int arrayIndex = 0; arrayIndex < cntX8; arrayIndex++) {
arrayX8.add(Integer.valueOf(payload[index++]));
}
value[0] = arrayX8;
break;
case N_X_ATTRIBUTE_IDENTIFIER:
int cntX16 = (payload.length - index) / 2;
List<Integer> arrayX16 = new ArrayList<Integer>(cntX16);
for (int arrayIndex = 0; arrayIndex < cntX16; arrayIndex++) {
arrayX16.add(Integer.valueOf(payload[index++]));
}
value[0] = arrayX16;
break;
case UNSIGNED_8_BIT_INTEGER_ARRAY:
int cnt8Array = payload.length - index;
int[] intarray8 = new int[cnt8Array];
for (int arrayIndex = 0; arrayIndex < cnt8Array; arrayIndex++) {
intarray8[arrayIndex] = payload[index++];
}
value[0] = intarray8;
break;
case N_X_WRITE_ATTRIBUTE_RECORD:
break;
case N_X_WRITE_ATTRIBUTE_STATUS_RECORD:
break;
case CLUSTERID:
case NWK_ADDRESS:
case BITMAP_16_BIT:
case ENUMERATION_16_BIT:
case SIGNED_16_BIT_INTEGER:
case UNSIGNED_16_BIT_INTEGER:
short s = (short) (payload[index++] + (payload[index++] << 8));
if (type == ZclDataType.SIGNED_16_BIT_INTEGER) {
value[0] = Integer.valueOf(s);
} else {
value[0] = Integer.valueOf(s & 0xFFFF);
}
break;
case BITMAP_32_BIT:
case SIGNED_32_BIT_INTEGER:
case UNSIGNED_32_BIT_INTEGER:
value[0] = payload[index++] + (payload[index++] << 8) + (payload[index++] << 16) + (payload[index++] << 24);
break;
case SIGNED_8_BIT_INTEGER:
value[0] = Integer.valueOf((byte) payload[index++]);
break;
case UNSIGNED_8_BIT_INTEGER:
value[0] = Integer.valueOf((byte) payload[index++] & 0xFF);
break;
case UTCTIME:
break;
case ROUTING_TABLE:
RoutingTable routingTable = new RoutingTable();
routingTable.deserialize(this);
value[0] = routingTable;
break;
case NEIGHBOR_TABLE:
NeighborTable neighborTable = new NeighborTable();
neighborTable.deserialize(this);
value[0] = neighborTable;
break;
case NODE_DESCRIPTOR:
NodeDescriptor nodeDescriptor = new NodeDescriptor();
nodeDescriptor.deserialize(this);
value[0] = nodeDescriptor;
break;
case POWER_DESCRIPTOR:
PowerDescriptor powerDescriptor = new PowerDescriptor();
powerDescriptor.deserialize(this);
value[0] = powerDescriptor;
break;
case BINDING_TABLE:
BindingTable bindingTable = new BindingTable();
bindingTable.deserialize(this);
value[0] = bindingTable;
break;
case SIMPLE_DESCRIPTOR:
SimpleDescriptor simpleDescriptor = new SimpleDescriptor();
simpleDescriptor.deserialize(this);
value[0] = simpleDescriptor;
break;
case ZCL_STATUS:
value[0] = ZclStatus.getStatus(payload[index++]);
break;
case ZDO_STATUS:
value[0] = ZdoStatus.getStatus(payload[index++]);
break;
case ZIGBEE_DATA_TYPE:
value[0] = ZclDataType.getType(payload[index++]);
break;
case BYTE_ARRAY:
int cntB8 = Integer.valueOf((byte) payload[index++] & 0xFF);
byte[] arrayB8 = new byte[cntB8];
for (int arrayIndex = 0; arrayIndex < cntB8; arrayIndex++) {
arrayB8[arrayIndex] = (byte) (payload[index++] & 0xff);
}
value[0] = new ByteArray(arrayB8);
break;
default:
throw new IllegalArgumentException("No reader defined in " + ZigBeeDeserializer.class.getSimpleName() + " for " + type.toString() + " (" + type.getId() + ")");
}
return value[0];
}
use of com.zsmartsystems.zigbee.zdo.field.SimpleDescriptor in project com.zsmartsystems.zigbee by zsmartsystems.
the class ZigBeeNetworkDiscovererTest method testNormal.
@Ignore
@Test
public void testNormal() {
// Add all the required responses to a list
IeeeAddressResponse ieeeResponse = new IeeeAddressResponse();
ieeeResponse.setStatus(ZdoStatus.SUCCESS);
ieeeResponse.setSourceAddress(new ZigBeeEndpointAddress(0));
ieeeResponse.setDestinationAddress(new ZigBeeEndpointAddress(0));
ieeeResponse.setIeeeAddrRemoteDev(new IeeeAddress("1234567890ABCDEF"));
responses.put(ZdoCommandType.IEEE_ADDRESS_REQUEST.getClusterId(), ieeeResponse);
NodeDescriptorResponse nodeResponse = new NodeDescriptorResponse();
nodeResponse.setStatus(ZdoStatus.SUCCESS);
nodeResponse.setSourceAddress(new ZigBeeEndpointAddress(0));
nodeResponse.setDestinationAddress(new ZigBeeEndpointAddress(0));
nodeResponse.setNwkAddrOfInterest(0);
NodeDescriptor nodeDescriptor = new NodeDescriptor();
nodeResponse.setNodeDescriptor(nodeDescriptor);
responses.put(ZdoCommandType.NODE_DESCRIPTOR_REQUEST.getClusterId(), nodeResponse);
PowerDescriptorResponse powerResponse = new PowerDescriptorResponse();
powerResponse.setStatus(ZdoStatus.SUCCESS);
powerResponse.setSourceAddress(new ZigBeeEndpointAddress(0));
powerResponse.setDestinationAddress(new ZigBeeEndpointAddress(0));
powerResponse.setNwkAddrOfInterest(0);
PowerDescriptor powerDescriptor = new PowerDescriptor();
powerResponse.setPowerDescriptor(powerDescriptor);
responses.put(ZdoCommandType.POWER_DESCRIPTOR_REQUEST.getClusterId(), powerResponse);
ActiveEndpointsResponse endpointsResponse = new ActiveEndpointsResponse();
endpointsResponse.setStatus(ZdoStatus.SUCCESS);
endpointsResponse.setSourceAddress(new ZigBeeEndpointAddress(0));
endpointsResponse.setDestinationAddress(new ZigBeeEndpointAddress(0));
endpointsResponse.setNwkAddrOfInterest(0);
List<Integer> activeEpList = new ArrayList<Integer>();
activeEpList.add(1);
endpointsResponse.setActiveEpList(activeEpList);
responses.put(ZdoCommandType.ACTIVE_ENDPOINTS_REQUEST.getClusterId(), endpointsResponse);
SimpleDescriptorResponse simpleResponse = new SimpleDescriptorResponse();
simpleResponse.setStatus(ZdoStatus.SUCCESS);
simpleResponse.setSourceAddress(new ZigBeeEndpointAddress(0));
simpleResponse.setDestinationAddress(new ZigBeeEndpointAddress(0, 1));
simpleResponse.setNwkAddrOfInterest(0);
SimpleDescriptor simpleDescriptor = new SimpleDescriptor();
simpleDescriptor.setDeviceId(0);
simpleDescriptor.setDeviceVersion(0);
simpleDescriptor.setEndpoint(1);
simpleDescriptor.setProfileId(0x104);
List<Integer> inputClusterList = new ArrayList<Integer>();
List<Integer> outputClusterList = new ArrayList<Integer>();
simpleDescriptor.setInputClusterList(inputClusterList);
simpleDescriptor.setOutputClusterList(outputClusterList);
simpleResponse.setSimpleDescriptor(simpleDescriptor);
responses.put(ZdoCommandType.SIMPLE_DESCRIPTOR_REQUEST.getClusterId(), simpleResponse);
ZigBeeNetworkDiscoverer discoverer = new ZigBeeNetworkDiscoverer(networkManager);
discoverer.setRetryPeriod(1);
discoverer.startup();
// Check that the listener registers for startup notifications
Mockito.verify(networkManager).addNetworkStateListener(discoverer);
// Put the system online so it initialises
discoverer.networkStateUpdated(ZigBeeTransportState.ONLINE);
// Check it registers listeners
Mockito.verify(networkManager).addCommandListener(discoverer);
Mockito.verify(networkManager).addAnnounceListener(discoverer);
// Then wait for the node to be added
Mockito.verify(networkManager, Mockito.timeout(5000).times(1)).addNode(nodeCapture.capture());
ZigBeeNode node = nodeCapture.getValue();
assertNotNull(node);
assertEquals(Integer.valueOf(0), node.getNetworkAddress());
assertEquals(new IeeeAddress("1234567890ABCDEF"), node.getIeeeAddress());
assertEquals(1, node.getEndpoints().size());
}
use of com.zsmartsystems.zigbee.zdo.field.SimpleDescriptor in project com.zsmartsystems.zigbee by zsmartsystems.
the class SimpleDescriptorResponseTest method testReceive.
@Test
public void testReceive() {
int[] packet = getPacketData("00 00 00 00 14 01 04 01 00 00 00 03 00 00 01 00 06 00 03 00 00 01 00 06 00");
SimpleDescriptorResponse descriptorResponse = new SimpleDescriptorResponse();
DefaultDeserializer deserializer = new DefaultDeserializer(packet);
ZclFieldDeserializer fieldDeserializer = new ZclFieldDeserializer(deserializer);
descriptorResponse.deserialize(fieldDeserializer);
System.out.println(descriptorResponse);
SimpleDescriptor simpleDescriptor = descriptorResponse.getSimpleDescriptor();
assertEquals(ZdoStatus.SUCCESS, descriptorResponse.getStatus());
assertEquals(0, (int) descriptorResponse.getNwkAddrOfInterest());
assertEquals(1, simpleDescriptor.getEndpoint());
assertEquals(0x104, simpleDescriptor.getProfileId());
assertEquals(3, simpleDescriptor.getInputClusterList().size());
assertTrue(simpleDescriptor.getInputClusterList().contains(0));
assertTrue(simpleDescriptor.getInputClusterList().contains(1));
assertTrue(simpleDescriptor.getInputClusterList().contains(6));
assertEquals(3, simpleDescriptor.getOutputClusterList().size());
}
use of com.zsmartsystems.zigbee.zdo.field.SimpleDescriptor in project com.zsmartsystems.zigbee by zsmartsystems.
the class ZigBeeNodeServiceDiscoverer method getSimpleDescriptor.
/**
* Get the simple descriptor for an endpoint and create the {@link ZigBeeEndpoint}
*
* @param endpointId the endpoint id to request
* @return the newly created {@link ZigBeeEndpoint} for the endpoint, or null on error
* @throws ExecutionException
* @throws InterruptedException
*/
private ZigBeeEndpoint getSimpleDescriptor(final int endpointId) throws InterruptedException, ExecutionException {
final SimpleDescriptorRequest simpleDescriptorRequest = new SimpleDescriptorRequest();
simpleDescriptorRequest.setDestinationAddress(new ZigBeeEndpointAddress(node.getNetworkAddress()));
simpleDescriptorRequest.setNwkAddrOfInterest(node.getNetworkAddress());
simpleDescriptorRequest.setEndpoint(endpointId);
CommandResult response = networkManager.unicast(simpleDescriptorRequest, simpleDescriptorRequest).get();
final SimpleDescriptorResponse simpleDescriptorResponse = (SimpleDescriptorResponse) response.getResponse();
logger.debug("{}: Node SVC Discovery SimpleDescriptorResponse returned {}", node.getIeeeAddress(), simpleDescriptorResponse);
if (simpleDescriptorResponse == null) {
return null;
}
if (simpleDescriptorResponse.getStatus() == ZdoStatus.SUCCESS) {
ZigBeeEndpoint endpoint = new ZigBeeEndpoint(networkManager, node, endpointId);
SimpleDescriptor simpleDescriptor = simpleDescriptorResponse.getSimpleDescriptor();
endpoint.setProfileId(simpleDescriptor.getProfileId());
endpoint.setDeviceId(simpleDescriptor.getDeviceId());
endpoint.setDeviceVersion(simpleDescriptor.getDeviceVersion());
endpoint.setInputClusterIds(simpleDescriptor.getInputClusterList());
endpoint.setOutputClusterIds(simpleDescriptor.getOutputClusterList());
return endpoint;
}
return null;
}
Aggregations