Skip to content

Commit 6e8f6a1

Browse files
authored
Merge pull request #59 from matchews/codex/implement-single-ack-packet-in-udpmessage
Use single ACK packet for OmniLogic UDP
2 parents a80bbfb + ba1930e commit 6e8f6a1

3 files changed

Lines changed: 30 additions & 33 deletions

File tree

bundles/org.openhab.binding.haywardomnilogiclocal/src/main/java/org/openhab/binding/haywardomnilogiclocal/internal/net/AckHandler.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.net.InetAddress;
2020

2121
import org.eclipse.jdt.annotation.NonNullByDefault;
22-
import org.openhab.binding.haywardomnilogiclocal.internal.HaywardMessageType;
2322

2423
/**
2524
* Handles sending ACK responses back to the OmniLogic controller.
@@ -35,12 +34,6 @@ public AckHandler(InetAddress address, int port) {
3534
}
3635

3736
public void sendAck(DatagramSocket socket, int messageId) throws IOException {
38-
byte[] out = UdpMessage.encodeRequest(HaywardMessageType.ACK, "ACK", messageId);
39-
DatagramPacket packet = new DatagramPacket(out, out.length, address, port);
40-
socket.send(packet);
41-
42-
byte[] ackBytes = UdpMessage.encodeRequest(HaywardMessageType.ACK, "", messageId);
43-
DatagramPacket ackPacket = new DatagramPacket(ackBytes, ackBytes.length, address, port);
44-
socket.send(ackPacket);
37+
socket.send(new DatagramPacket(UdpMessage.buildAck(messageId), UdpMessage.buildAck(messageId).length, address, port));
4538
}
4639
}

bundles/org.openhab.binding.haywardomnilogiclocal/src/main/java/org/openhab/binding/haywardomnilogiclocal/internal/net/UdpMessage.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ public static byte[] encodeRequest(HaywardMessageType msgType, String xml) throw
7777
return encodeRequest(msgType, xml, null);
7878
}
7979

80+
/**
81+
* Builds a single ACK packet for the given message id.
82+
*/
83+
public static byte[] buildAck(int messageId) throws UnsupportedEncodingException {
84+
return encodeRequest(HaywardMessageType.ACK, "ACK", Integer.valueOf(messageId));
85+
}
86+
8087
/**
8188
* Decodes a response message received from the controller.
8289
*/

bundles/org.openhab.binding.haywardomnilogiclocal/src/test/java/org/openhab/binding/haywardomnilogiclocal/internal/net/UdpClientTest.java

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public void sendShouldIgnoreAckAndProcessSubsequentData() throws Exception {
4545
final int port = server.getLocalPort();
4646
final AtomicBoolean ackBeforeLead = new AtomicBoolean(false);
4747
final AtomicBoolean ackAfterLead = new AtomicBoolean(false);
48+
final AtomicBoolean extraAckAfterLead = new AtomicBoolean(false);
4849
final String responseXml = "<Response>OK</Response>";
4950

5051
Thread serverThread = new Thread(() -> {
@@ -86,12 +87,13 @@ public void sendShouldIgnoreAckAndProcessSubsequentData() throws Exception {
8687
if (msgType == HaywardMessageType.ACK.getMsgInt()) {
8788
ackAfterLead.set(true);
8889
}
89-
// consume possible second ACK
90+
// ensure no extra ACK is sent
9091
server.setSoTimeout(100);
9192
try {
9293
server.receive(new DatagramPacket(new byte[4096], 4096));
94+
extraAckAfterLead.set(true);
9395
} catch (SocketTimeoutException ex) {
94-
// ignore
96+
// expected - no extra ACK
9597
}
9698
} catch (SocketTimeoutException e) {
9799
// no ACK received
@@ -116,6 +118,7 @@ public void sendShouldIgnoreAckAndProcessSubsequentData() throws Exception {
116118
assertEquals(responseXml, response.getXml());
117119
assertFalse(ackBeforeLead.get());
118120
assertTrue(ackAfterLead.get());
121+
assertFalse(extraAckAfterLead.get());
119122
}
120123

121124
@Test
@@ -154,32 +157,26 @@ public void sendShouldHandleUncompressedMultiBlockResponse() throws Exception {
154157
int clientPort = requestPacket.getPort();
155158
byte[] lead = createLeadPacket(msgId, 2, false);
156159
server.send(new DatagramPacket(lead, lead.length, clientAddress, clientPort));
157-
// consume ACKs for lead
158-
for (int i = 0; i < 2; i++) {
159-
server.setSoTimeout(2000);
160-
server.receive(new DatagramPacket(new byte[4096], 4096));
161-
}
160+
// consume ACK for lead
161+
server.setSoTimeout(2000);
162+
server.receive(new DatagramPacket(new byte[4096], 4096));
162163
byte[] block1 = createBlockPacket(msgId, part1, false);
163164
server.send(new DatagramPacket(block1, block1.length, clientAddress, clientPort));
164-
for (int i = 0; i < 2; i++) {
165-
DatagramPacket ack = new DatagramPacket(new byte[4096], 4096);
166-
server.setSoTimeout(2000);
167-
server.receive(ack);
168-
if (ByteBuffer.wrap(ack.getData(), 0, ack.getLength()).getInt(16) ==
169-
HaywardMessageType.ACK.getMsgInt()) {
170-
block1Acks.incrementAndGet();
171-
}
165+
DatagramPacket ack1 = new DatagramPacket(new byte[4096], 4096);
166+
server.setSoTimeout(2000);
167+
server.receive(ack1);
168+
if (ByteBuffer.wrap(ack1.getData(), 0, ack1.getLength()).getInt(16) ==
169+
HaywardMessageType.ACK.getMsgInt()) {
170+
block1Acks.incrementAndGet();
172171
}
173172
byte[] block2 = createBlockPacket(msgId, part2, false);
174173
server.send(new DatagramPacket(block2, block2.length, clientAddress, clientPort));
175-
for (int i = 0; i < 2; i++) {
176-
DatagramPacket ack = new DatagramPacket(new byte[4096], 4096);
177-
server.setSoTimeout(2000);
178-
server.receive(ack);
179-
if (ByteBuffer.wrap(ack.getData(), 0, ack.getLength()).getInt(16) ==
180-
HaywardMessageType.ACK.getMsgInt()) {
181-
block2Acks.incrementAndGet();
182-
}
174+
DatagramPacket ack2 = new DatagramPacket(new byte[4096], 4096);
175+
server.setSoTimeout(2000);
176+
server.receive(ack2);
177+
if (ByteBuffer.wrap(ack2.getData(), 0, ack2.getLength()).getInt(16) ==
178+
HaywardMessageType.ACK.getMsgInt()) {
179+
block2Acks.incrementAndGet();
183180
}
184181
} catch (Exception e) {
185182
// ignore for test
@@ -194,8 +191,8 @@ public void sendShouldHandleUncompressedMultiBlockResponse() throws Exception {
194191
server.close();
195192

196193
assertEquals(responseXml, response.getXml());
197-
assertEquals(2, block1Acks.get());
198-
assertEquals(2, block2Acks.get());
194+
assertEquals(1, block1Acks.get());
195+
assertEquals(1, block2Acks.get());
199196
}
200197

201198
@Test

0 commit comments

Comments
 (0)