Skip to content

Commit a1ccb3d

Browse files
committed
Updates following Smart Energy certification
Signed-off-by: Chris Jackson <[email protected]>
1 parent 4032a5f commit a1ccb3d

File tree

9 files changed

+4467
-1531
lines changed

9 files changed

+4467
-1531
lines changed

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeEndpoint.java

+11
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,17 @@ public void commandReceived(ZclCommand command) {
454454
return;
455455
}
456456

457+
// Ensure security is used if required
458+
if (cluster.getApsSecurityRequired() && !command.getApsSecurity()) {
459+
logger.debug("{}: Endpoint {}. Cluster '{}' requires security but command is not secured", getIeeeAddress(),
460+
getEndpointId(), cluster.getClusterName());
461+
DefaultResponse response = ZclCluster.createDefaultResponse(command, ZclStatus.UNSECURED);
462+
if (response != null) {
463+
sendTransaction(response);
464+
}
465+
return;
466+
}
467+
457468
cluster.handleCommand(command);
458469
}
459470

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNetworkManager.java

+6
Original file line numberDiff line numberDiff line change
@@ -1019,13 +1019,19 @@ private ZigBeeCommand receiveZclCommand(final ZclFieldDeserializer fieldDeserial
10191019
ZigBeeNode node = getNode(apsFrame.getSourceAddress());
10201020
if (node == null) {
10211021
logger.debug("Unknown remote node {}", String.format("%04X", apsFrame.getSourceAddress()));
1022+
if (zclHeader.getDirection() == ZclCommandDirection.CLIENT_TO_SERVER) {
1023+
createDefaultResponse(apsFrame, zclHeader, ZclStatus.FAILURE);
1024+
}
10221025
return null;
10231026
}
10241027

10251028
ZigBeeEndpoint endpoint = node.getEndpoint(apsFrame.getSourceEndpoint());
10261029
if (endpoint == null) {
10271030
logger.debug("{}: Endpoint {}. Unknown remote endpoint", node.getIeeeAddress(),
10281031
apsFrame.getSourceEndpoint());
1032+
if (zclHeader.getDirection() == ZclCommandDirection.CLIENT_TO_SERVER) {
1033+
createDefaultResponse(apsFrame, zclHeader, ZclStatus.FAILURE);
1034+
}
10291035
return null;
10301036
}
10311037

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/SmartEnergyClient.java

+21-16
Original file line numberDiff line numberDiff line change
@@ -560,8 +560,7 @@ private void discoverServices(Integer destination, int clusterId) {
560560

561561
MatchDescriptorRequest matchRequest = new MatchDescriptorRequest();
562562
matchRequest.setInClusterList(clusterList);
563-
matchRequest.setOutClusterList(clusterList);
564-
matchRequest.setDestinationAddress(new ZigBeeEndpointAddress(destination));
563+
matchRequest.setOutClusterList(Collections.emptyList());
565564
matchRequest.setDestinationAddress(new ZigBeeEndpointAddress(destination));
566565
matchRequest.setProfileId(ZigBeeProfileType.ZIGBEE_SMART_ENERGY.getKey());
567566
matchRequest.setNwkAddrOfInterest(destination);
@@ -678,8 +677,8 @@ private ZigBeeStatus requestSimpleDescriptor(final ZigBeeEndpoint endpoint)
678677
CommandResult response = networkManager.sendTransaction(simpleDescriptorRequest, simpleDescriptorRequest).get();
679678

680679
final SimpleDescriptorResponse simpleDescriptorResponse = (SimpleDescriptorResponse) response.getResponse();
681-
logger.debug("{}: SEP Extension: SimpleDescriptorResponse returned {}", endpoint.getIeeeAddress(),
682-
simpleDescriptorResponse);
680+
logger.debug("{}: SEP Extension: Endpoint {} SimpleDescriptorResponse returned {}", endpoint.getIeeeAddress(),
681+
endpoint.getEndpointId(), simpleDescriptorResponse);
683682
if (simpleDescriptorResponse == null) {
684683
return ZigBeeStatus.FAILURE;
685684
}
@@ -771,26 +770,32 @@ private void handleMatchDescriptorResponse(MatchDescriptorResponse response) {
771770
case DISCOVER_METERING_SERVERS:
772771
ZigBeeNode node = networkManager.getNode(response.getSourceAddress().getAddress());
773772
if (node == null) {
774-
logger.debug("SEP Extension: SEP discovery Node {} is unknown - getting IEEE address.",
773+
logger.debug("{}: SEP Extension: SEP discovery node is unknown - getting IEEE address.",
775774
response.getSourceAddress().getAddress());
776775
// This node is unknown to us - get the long address
777776
IeeeAddress ieeeAddress = requestIeeeAddress(response.getSourceAddress().getAddress());
778777
node = new ZigBeeNode(networkManager, ieeeAddress);
779778
networkManager.updateNode(node);
780779
}
781780

781+
// Check if this node is authorised to communicate securely
782+
if (!cbkeProvider.isAuthorised(node.getIeeeAddress())) {
783+
logger.debug("{}: SEP Extension: SEP discovery node is not authorised", node.getIeeeAddress());
784+
return;
785+
}
786+
782787
ZigBeeNode updatedNode = new ZigBeeNode(networkManager, node.getIeeeAddress(),
783788
node.getNetworkAddress());
784789
for (Integer endpointId : response.getMatchList()) {
785790
ZigBeeEndpoint endpoint = new ZigBeeEndpoint(updatedNode, endpointId);
786-
logger.debug("SEP Extension: Metering endpoint {} being added/updated",
787-
endpoint.getEndpointAddress());
791+
logger.debug("{}: SEP Extension: Endpoint {} Metering endpoint being added/updated",
792+
node.getIeeeAddress(), endpoint.getEndpointAddress());
788793

789794
try {
790795
requestSimpleDescriptor(endpoint);
791796
} catch (InterruptedException | ExecutionException e) {
792-
logger.debug("SEP Extension: Exception getting simple descriptor from endpoint {}",
793-
endpoint.getEndpointAddress());
797+
logger.debug("{}: SEP Extension: Endpoint {} Exception getting simple descriptor",
798+
node.getIeeeAddress(), endpoint.getEndpointAddress());
794799
}
795800
updatedNode.addEndpoint(endpoint);
796801
}
@@ -927,12 +932,12 @@ private void setProfileSecurity(ZigBeeNode node) {
927932
logger.debug("{}: SEP Extension: Node is not authorised", node.getIeeeAddress());
928933
return;
929934
}
930-
logger.debug("{}: SEP node is authorised", node.getIeeeAddress());
935+
logger.debug("{}: SEP Extension: Node is authorised", node.getIeeeAddress());
931936

932937
for (ZigBeeEndpoint endpoint : node.getEndpoints()) {
933938
if (endpoint.getProfileId() != ZigBeeProfileType.ZIGBEE_SMART_ENERGY.getKey()) {
934-
logger.debug("{}: SEP Extension: Endpoint {} is not SmartEnergy", node.getIeeeAddress(),
935-
endpoint.getEndpointId());
939+
logger.debug("{}: SEP Extension: Endpoint {} is not SmartEnergy [{}]", node.getIeeeAddress(),
940+
endpoint.getEndpointId(), String.format("%04X", endpoint.getProfileId()));
936941
continue;
937942
}
938943

@@ -942,8 +947,8 @@ private void setProfileSecurity(ZigBeeNode node) {
942947
continue;
943948
}
944949

945-
logger.debug("{}: SEP Extension: Setting profile security for input cluster {}", node.getIeeeAddress(),
946-
clusterType);
950+
logger.debug("{}: SEP Extension: Endpoint {} Setting profile security for input cluster {}",
951+
node.getIeeeAddress(), endpoint.getEndpointId(), clusterType);
947952
cluster.setApsSecurityRequired(true);
948953
}
949954

@@ -953,8 +958,8 @@ private void setProfileSecurity(ZigBeeNode node) {
953958
continue;
954959
}
955960

956-
logger.debug("{}: SEP Extension: Setting profile security for output cluster {}", node.getIeeeAddress(),
957-
clusterType);
961+
logger.debug("{}: SEP Extension: Endpoint {} Setting profile security for output cluster {}",
962+
node.getIeeeAddress(), endpoint.getEndpointId(), clusterType);
958963
cluster.setApsSecurityRequired(true);
959964
}
960965
}

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentClient.java

+6
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,9 @@ public void run() {
574574

575575
setState(KeyEstablishmentState.COMPLETE);
576576
stopCbke(0);
577+
578+
// Send the default response since we don't handle this in the main handler
579+
keCluster.sendDefaultResponse(response, ZclStatus.SUCCESS);
577580
}
578581
}
579582

@@ -602,6 +605,9 @@ public void run() {
602605
logger.debug("{}: CBKE Terminate Key establishment client: Terminate status={}, suite={}, wait={} seconds",
603606
ieeeAddress, status, suite, waitTime);
604607
stopCbke(waitTime);
608+
609+
// Send the default response since we don't handle this in the main handler
610+
keCluster.sendDefaultResponse(response, ZclStatus.SUCCESS);
605611
}
606612
}
607613

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentServer.java

+7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.zsmartsystems.zigbee.zcl.ZclAttribute;
3131
import com.zsmartsystems.zigbee.zcl.ZclCommand;
3232
import com.zsmartsystems.zigbee.zcl.ZclCommandListener;
33+
import com.zsmartsystems.zigbee.zcl.ZclStatus;
3334
import com.zsmartsystems.zigbee.zcl.clusters.ZclKeyEstablishmentCluster;
3435
import com.zsmartsystems.zigbee.zcl.clusters.keyestablishment.ConfirmKeyDataRequestCommand;
3536
import com.zsmartsystems.zigbee.zcl.clusters.keyestablishment.EphemeralDataRequestCommand;
@@ -399,6 +400,9 @@ public void run() {
399400

400401
setState(KeyEstablishmentState.COMPLETE);
401402
stopCbke();
403+
404+
// Send the default response since we don't handle this in the main handler
405+
keCluster.sendDefaultResponse(request, ZclStatus.SUCCESS);
402406
}
403407
}
404408

@@ -417,6 +421,9 @@ public void run() {
417421

418422
setState(KeyEstablishmentState.FAILED);
419423
stopCbke();
424+
425+
// Send the default response since we don't handle this in the main handler
426+
keCluster.sendDefaultResponse(request, ZclStatus.SUCCESS);
420427
}
421428
}
422429

0 commit comments

Comments
 (0)