Skip to content

Commit ada3ef2

Browse files
authored
Fix handling of APS counter (#327)
Signed-off-by: Chris Jackson <[email protected]>
1 parent d85f6ed commit ada3ef2

File tree

11 files changed

+66
-55
lines changed

11 files changed

+66
-55
lines changed

com.zsmartsystems.zigbee.dongle.cc2531/src/main/java/com/zsmartsystems/zigbee/dongle/cc2531/ZigBeeDongleTiCc2531.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,10 @@ public void sendCommand(final ZigBeeApsFrame apsFrame) {
259259
if (!groupCommand) {
260260
networkManager.sendCommand(new AF_DATA_REQUEST(apsFrame.getDestinationAddress(),
261261
(short) apsFrame.getDestinationEndpoint(), sender, apsFrame.getCluster(),
262-
apsFrame.getSequence(), (byte) 0x30, (byte) apsFrame.getRadius(), apsFrame.getPayload()));
262+
apsFrame.getApsCounter(), (byte) 0x30, (byte) apsFrame.getRadius(), apsFrame.getPayload()));
263263
} else {
264264
networkManager.sendCommand(new AF_DATA_REQUEST_EXT(apsFrame.getDestinationAddress(), sender,
265-
apsFrame.getCluster(), apsFrame.getSequence(), (byte) (0), (byte) 0, apsFrame.getPayload()));
265+
apsFrame.getCluster(), apsFrame.getApsCounter(), (byte) (0), (byte) 0, apsFrame.getPayload()));
266266
}
267267
}
268268
}
@@ -282,7 +282,7 @@ public boolean notify(final AF_INCOMING_MSG clusterMessage) {
282282

283283
// nwkHeader.setDestinationAddress(clusterMessage.geta);
284284
apsFrame.setSourceAddress(clusterMessage.getSrcAddr());
285-
apsFrame.setSequence(clusterMessage.getTransId());
285+
apsFrame.setApsCounter(clusterMessage.getTransId());
286286

287287
apsFrame.setPayload(clusterMessage.getData());
288288

com.zsmartsystems.zigbee.dongle.conbee/src/main/java/com/zsmartsystems/zigbee/dongle/conbee/ZigBeeDongleConBee.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ public String getVersionString() {
283283
public void sendCommand(final ZigBeeApsFrame apsFrame) {
284284
ConBeeEnqueueSendDataRequest request = new ConBeeEnqueueSendDataRequest();
285285

286-
request.setRequestId(apsFrame.getSequence());
286+
request.setRequestId(apsFrame.getApsCounter());
287287
request.setClusterId(apsFrame.getCluster());
288288
switch (apsFrame.getAddressMode()) {
289289
case DEVICE:

com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/ZigBeeDongleEzsp.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,8 @@ public void sendCommand(final ZigBeeApsFrame apsFrame) {
349349
if (apsFrame.getAddressMode() == ZigBeeNwkAddressMode.DEVICE && apsFrame.getDestinationAddress() < 0xfff8) {
350350
EzspSendUnicastRequest emberUnicast = new EzspSendUnicastRequest();
351351
emberUnicast.setIndexOrDestination(apsFrame.getDestinationAddress());
352-
emberUnicast.setMessageTag(apsFrame.getSequence());
353-
emberUnicast.setSequenceNumber(apsFrame.getSequence());
352+
emberUnicast.setMessageTag(apsFrame.getApsCounter());
353+
emberUnicast.setSequenceNumber(apsFrame.getApsCounter());
354354
emberUnicast.setType(EmberOutgoingMessageType.EMBER_OUTGOING_DIRECT);
355355
emberUnicast.setApsFrame(emberApsFrame);
356356
emberUnicast.setMessageContents(apsFrame.getPayload());
@@ -361,8 +361,8 @@ public void sendCommand(final ZigBeeApsFrame apsFrame) {
361361

362362
EzspSendBroadcastRequest emberBroadcast = new EzspSendBroadcastRequest();
363363
emberBroadcast.setDestination(apsFrame.getDestinationAddress());
364-
emberBroadcast.setMessageTag(apsFrame.getSequence());
365-
emberBroadcast.setSequenceNumber(apsFrame.getSequence());
364+
emberBroadcast.setMessageTag(apsFrame.getApsCounter());
365+
emberBroadcast.setSequenceNumber(apsFrame.getApsCounter());
366366
emberBroadcast.setApsFrame(emberApsFrame);
367367
emberBroadcast.setRadius(apsFrame.getRadius());
368368
emberBroadcast.setMessageContents(apsFrame.getPayload());
@@ -375,7 +375,7 @@ public void sendCommand(final ZigBeeApsFrame apsFrame) {
375375
emberMulticast.setApsFrame(emberApsFrame);
376376
emberMulticast.setHops(apsFrame.getRadius());
377377
emberMulticast.setNonmemberRadius(apsFrame.getNonMemberRadius());
378-
emberMulticast.setMessageTag(apsFrame.getSequence());
378+
emberMulticast.setMessageTag(apsFrame.getApsCounter());
379379
emberMulticast.setMessageContents(apsFrame.getPayload());
380380

381381
emberCommand = emberMulticast;
@@ -412,7 +412,6 @@ public void handlePacket(EzspFrame response) {
412412
apsFrame.setProfile(emberApsFrame.getProfileId());
413413
apsFrame.setSourceEndpoint(emberApsFrame.getSourceEndpoint());
414414

415-
apsFrame.setSequence(incomingMessage.getSequenceNumber());
416415
apsFrame.setSourceAddress(incomingMessage.getSender());
417416
apsFrame.setPayload(incomingMessage.getMessageContents());
418417
zigbeeTransportReceive.receiveCommand(apsFrame);

com.zsmartsystems.zigbee.dongle.xbee/src/test/java/com/zsmartsystems/zigbee/dongle/xbee/ZigBeeDongleXBeeTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void sendCommand() {
7676
apsFrame.setCluster(32774);
7777
apsFrame.setAddressMode(ZigBeeNwkAddressMode.DEVICE);
7878
apsFrame.setRadius(31);
79-
apsFrame.setSequence(42);
79+
apsFrame.setApsCounter(42);
8080
apsFrame.setPayload(new int[] { 0x00, 0x00, 0x2E, 0x5B, 0x01, 0x01 });
8181

8282
System.out.println(command);

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

+2-12
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,6 @@ public class ZigBeeApsFrame {
126126
*/
127127
private int apsCounter;
128128

129-
private int sequence;
130-
131129
/**
132130
* The APS payload.
133131
* <p>
@@ -173,14 +171,6 @@ public void setRadius(int radius) {
173171
this.radius = radius;
174172
}
175173

176-
public int getSequence() {
177-
return sequence;
178-
}
179-
180-
public void setSequence(int sequence) {
181-
this.sequence = sequence;
182-
}
183-
184174
public boolean isSecurityEnable() {
185175
return securityEnable;
186176
}
@@ -288,8 +278,8 @@ public String toString() {
288278
builder.append(addressMode);
289279
builder.append(", radius=");
290280
builder.append(radius);
291-
builder.append(", sequence=");
292-
builder.append(sequence);
281+
builder.append(", apsCounter=");
282+
builder.append(apsCounter);
293283
builder.append(", payload=");
294284
if (payload != null) {
295285
for (int c = 0; c < payload.length; c++) {

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,9 @@ public int sendCommand(ZigBeeCommand command) {
539539
// Create the application frame
540540
ZigBeeApsFrame apsFrame = new ZigBeeApsFrame();
541541

542-
int sequence = sequenceNumber.getAndIncrement() & 0xff;
543-
command.setTransactionId(sequence);
542+
if (command.getTransactionId() == null) {
543+
command.setTransactionId(sequenceNumber.getAndIncrement() & 0xff);
544+
}
544545

545546
// Set the source address - should probably be improved!
546547
// Note that the endpoint is set (currently!) in the transport layer
@@ -555,7 +556,6 @@ public int sendCommand(ZigBeeCommand command) {
555556
// TODO: Set the source address correctly?
556557
apsFrame.setSourceAddress(0);
557558

558-
apsFrame.setSequence(sequence);
559559
apsFrame.setRadius(31);
560560

561561
if (command.getDestinationAddress() instanceof ZigBeeEndpointAddress) {
@@ -612,7 +612,7 @@ public int sendCommand(ZigBeeCommand command) {
612612
zclHeader.setFrameType(zclCommand.isGenericCommand() ? ZclFrameType.ENTIRE_PROFILE_COMMAND
613613
: ZclFrameType.CLUSTER_SPECIFIC_COMMAND);
614614
zclHeader.setCommandId(zclCommand.getCommandId());
615-
zclHeader.setSequenceNumber(sequence);
615+
zclHeader.setSequenceNumber(command.getTransactionId());
616616
zclHeader.setDirection(zclCommand.getCommandDirection());
617617

618618
command.serialize(fieldSerializer);
@@ -626,7 +626,7 @@ public int sendCommand(ZigBeeCommand command) {
626626

627627
transport.sendCommand(apsFrame);
628628

629-
return sequence;
629+
return command.getTransactionId();
630630
}
631631

632632
@Override

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

+14-5
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ public class ZigBeeNode implements ZigBeeCommandListener {
125125
*/
126126
private final ZigBeeNetworkManager networkManager;
127127

128+
/**
129+
* Broadcast endpoint definition
130+
*/
131+
private final static int BROADCAST_ENDPOINT = 0xFF;
132+
128133
/**
129134
* Constructor
130135
*
@@ -623,12 +628,16 @@ public void commandReceived(ZigBeeCommand command) {
623628
ZclCommand zclCommand = (ZclCommand) command;
624629
ZigBeeEndpointAddress endpointAddress = (ZigBeeEndpointAddress) zclCommand.getSourceAddress();
625630

626-
ZigBeeEndpoint endpoint = endpoints.get(endpointAddress.getEndpoint());
627-
if (endpoint == null) {
628-
return;
631+
if (endpointAddress.getEndpoint() == BROADCAST_ENDPOINT) {
632+
for (ZigBeeEndpoint endpoint : endpoints.values()) {
633+
endpoint.commandReceived(zclCommand);
634+
}
635+
} else {
636+
ZigBeeEndpoint endpoint = endpoints.get(endpointAddress.getEndpoint());
637+
if (endpoint != null) {
638+
endpoint.commandReceived(zclCommand);
639+
}
629640
}
630-
631-
endpoint.commandReceived(zclCommand);
632641
}
633642

634643
/**

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/otaserver/ZclOtaUpgradeServer.java

+20-10
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,8 @@ private void handleQueryNextImageCommand(QueryNextImageCommand command) {
583583
if (otaFile == null || !(command.getManufacturerCode().equals(otaFile.getManufacturerCode())
584584
&& command.getImageType().equals(otaFile.getImageType()))) {
585585
logger.debug("{} OTA Error: Request is inconsistent with OTA file.", cluster.getZigBeeAddress());
586-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.NO_IMAGE_AVAILABLE);
586+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
587+
ZclStatus.NO_IMAGE_AVAILABLE);
587588
return;
588589
}
589590

@@ -593,15 +594,17 @@ private void handleQueryNextImageCommand(QueryNextImageCommand command) {
593594
&& otaFile.getMaximumHardware() != null) {
594595
if (command.getHardwareVersion() < otaFile.getMinimumHardware()
595596
|| command.getHardwareVersion() > otaFile.getMaximumHardware()) {
596-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.NO_IMAGE_AVAILABLE);
597+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
598+
ZclStatus.NO_IMAGE_AVAILABLE);
597599
return;
598600
}
599601
}
600602

601603
// Some devices may make further requests for files once they have been updated
602604
// By default, don't resend the existing file
603605
if (!allowExistingFile && command.getFileVersion().equals(otaFile.getFileVersion())) {
604-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.NO_IMAGE_AVAILABLE);
606+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
607+
ZclStatus.NO_IMAGE_AVAILABLE);
605608
return;
606609
}
607610

@@ -630,7 +633,8 @@ private void handleImagePageCommand(ImagePageCommand command) {
630633
// No current support for device specific requests
631634
if ((command.getFieldControl() & IMAGE_BLOCK_FIELD_IEEE_ADDRESS) != 0) {
632635
logger.debug("{} OTA Error: No file is set.", cluster.getZigBeeAddress());
633-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.UNSUP_CLUSTER_COMMAND);
636+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
637+
ZclStatus.UNSUP_CLUSTER_COMMAND);
634638
return;
635639
}
636640

@@ -639,15 +643,17 @@ private void handleImagePageCommand(ImagePageCommand command) {
639643
|| !command.getFileVersion().equals(otaFile.getFileVersion())
640644
|| !command.getImageType().equals(otaFile.getImageType())) {
641645
logger.debug("{} OTA Error: Request is inconsistent with OTA file.", cluster.getZigBeeAddress());
642-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.NO_IMAGE_AVAILABLE);
646+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
647+
ZclStatus.NO_IMAGE_AVAILABLE);
643648
return;
644649
}
645650

646651
// Check that the offset is within bounds of the image data
647652
if (command.getFileOffset() > otaFile.getImageSize()) {
648653
logger.debug("{} OTA Error: Requested offset is larger than file ({}>{})", cluster.getZigBeeAddress(),
649654
command.getFileOffset(), otaFile.getImageSize());
650-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.MALFORMED_COMMAND);
655+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
656+
ZclStatus.MALFORMED_COMMAND);
651657
return;
652658
}
653659

@@ -672,7 +678,8 @@ private void handleImageBlockCommand(ImageBlockCommand command) {
672678
// No current support for device specific requests
673679
if ((command.getFieldControl() & IMAGE_BLOCK_FIELD_IEEE_ADDRESS) != 0) {
674680
logger.debug("{} OTA Error: No file is set.", cluster.getZigBeeAddress());
675-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.UNSUP_CLUSTER_COMMAND);
681+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
682+
ZclStatus.UNSUP_CLUSTER_COMMAND);
676683
return;
677684
}
678685

@@ -681,15 +688,17 @@ private void handleImageBlockCommand(ImageBlockCommand command) {
681688
|| !command.getFileVersion().equals(otaFile.getFileVersion())
682689
|| !command.getImageType().equals(otaFile.getImageType())) {
683690
logger.debug("{} OTA Error: Request is inconsistent with OTA file.", cluster.getZigBeeAddress());
684-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.NO_IMAGE_AVAILABLE);
691+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
692+
ZclStatus.NO_IMAGE_AVAILABLE);
685693
return;
686694
}
687695

688696
// Check that the offset is within bounds of the image data
689697
if (command.getFileOffset() > otaFile.getImageSize()) {
690698
logger.debug("{} OTA Error: Requested offset is larger than file ({}>{})", cluster.getZigBeeAddress(),
691699
command.getFileOffset(), otaFile.getImageSize());
692-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.MALFORMED_COMMAND);
700+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
701+
ZclStatus.MALFORMED_COMMAND);
693702
return;
694703
}
695704

@@ -729,7 +738,8 @@ private void handleUpgradeEndCommand(UpgradeEndCommand command) {
729738
|| !command.getFileVersion().equals(otaFile.getFileVersion())
730739
|| !command.getImageType().equals(otaFile.getImageType())) {
731740
logger.debug("{} OTA Error: Request is inconsistent with OTA file.", cluster.getZigBeeAddress());
732-
cluster.sendDefaultResponse(command.getCommandId(), ZclStatus.NO_IMAGE_AVAILABLE);
741+
cluster.sendDefaultResponse(command.getTransactionId(), command.getCommandId(),
742+
ZclStatus.NO_IMAGE_AVAILABLE);
733743
return;
734744
}
735745

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/internal/ClusterMatcher.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.zsmartsystems.zigbee.ZigBeeCommandListener;
2020
import com.zsmartsystems.zigbee.ZigBeeNetworkManager;
2121
import com.zsmartsystems.zigbee.ZigBeeNode;
22+
import com.zsmartsystems.zigbee.zcl.protocol.ZclClusterType;
2223
import com.zsmartsystems.zigbee.zdo.ZdoStatus;
2324
import com.zsmartsystems.zigbee.zdo.command.MatchDescriptorRequest;
2425
import com.zsmartsystems.zigbee.zdo.command.MatchDescriptorResponse;
@@ -51,7 +52,7 @@ public class ClusterMatcher implements ZigBeeCommandListener {
5152
* @param networkManager the {@link ZigBeeNetworkManager} to which this matcher is linked
5253
*/
5354
public ClusterMatcher(ZigBeeNetworkManager networkManager) {
54-
logger.debug("{}: ClusterMatcher starting", networkManager.getZigBeeExtendedPanId());
55+
logger.debug("ClusterMatcher starting");
5556
this.networkManager = networkManager;
5657

5758
networkManager.addCommandListener(this);
@@ -63,7 +64,7 @@ public ClusterMatcher(ZigBeeNetworkManager networkManager) {
6364
* @param cluster the cluster to match
6465
*/
6566
public void addCluster(int cluster) {
66-
logger.debug("{}: ClusterMatcher adding cluster {}", networkManager.getZigBeeExtendedPanId(), cluster);
67+
logger.debug("ClusterMatcher adding cluster {}", ZclClusterType.getValueById(cluster));
6768
clusters.add(cluster);
6869
}
6970

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/zcl/ZclCluster.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -495,11 +495,13 @@ public Future<CommandResult> unbind() {
495495
/**
496496
* Sends a default response to the client
497497
*
498+
* @param transactionId the transaction ID to use in the response
498499
* @param commandIdentifier the command identifier to which this is a response
499500
* @param status the {@link ZclStatus} to send in the response
500501
*/
501-
public void sendDefaultResponse(Integer commandIdentifier, ZclStatus status) {
502+
public void sendDefaultResponse(Integer transactionId, Integer commandIdentifier, ZclStatus status) {
502503
DefaultResponse defaultResponse = new DefaultResponse();
504+
defaultResponse.setTransactionId(transactionId);
503505
defaultResponse.setCommandIdentifier(commandIdentifier);
504506
defaultResponse.setDestinationAddress(zigbeeEndpoint.getEndpointAddress());
505507
defaultResponse.setClusterId(clusterId);

0 commit comments

Comments
 (0)