@Nullable
private final Integer port;
- private byte @Nullable [] magicPacket;
- private final Consumer<byte[]> magicPacketSender;
+ private final Consumer<byte[]> magicPacketMacSender;
+ private final Consumer<byte[]> magicPacketIpSender;
public WakeOnLanPacketSender(String macAddress, @Nullable String hostname, @Nullable Integer port) {
+ logger.debug("initialized WOL Packet Sender (mac: {}, hostname: {}, port: {}", macAddress, hostname, port);
this.macAddress = macAddress;
this.hostname = hostname;
this.port = port;
- this.magicPacketSender = this::sendMagicPacket;
+ this.magicPacketMacSender = this::sendMagicPacketViaMac;
+ this.magicPacketIpSender = this::sendMagicPacketViaIp;
}
+ /**
+ * Used for testing only.
+ */
public WakeOnLanPacketSender(String macAddress) {
+ logger.debug("initialized WOL Packet Sender (mac: {}", macAddress);
this.macAddress = macAddress;
this.hostname = null;
this.port = null;
- this.magicPacketSender = this::sendMagicPacket;
+ this.magicPacketMacSender = this::sendMagicPacketViaMac;
+ this.magicPacketIpSender = this::sendMagicPacketViaIp;
}
/**
this.macAddress = macAddress;
this.hostname = null;
this.port = null;
- this.magicPacketSender = magicPacketSender;
+ this.magicPacketMacSender = magicPacketSender;
+ this.magicPacketIpSender = this::sendMagicPacketViaIp;
}
- public void sendPacket() {
- byte[] localMagicPacket = magicPacket;
- if (localMagicPacket == null) {
- localMagicPacket = createMagicPacket(createMacBytes(macAddress));
- magicPacket = localMagicPacket;
- }
+ public void sendWakeOnLanPacketViaMac() {
+ byte[] magicPacket = createMagicPacket();
+ this.magicPacketMacSender.accept(magicPacket);
+ }
- magicPacketSender.accept(localMagicPacket);
+ public void sendWakeOnLanPacketViaIp() {
+ byte[] magicPacket = createMagicPacket();
+ this.magicPacketIpSender.accept(magicPacket);
+ }
+
+ private byte[] createMagicPacket() {
+ byte[] macBytes = createMacBytes(this.macAddress);
+ byte[] magicPacket = new byte[MAGIC_PACKET_BYTE_SIZE];
+ Arrays.fill(magicPacket, 0, PREFIX_BYTE_SIZE, (byte) 0xff);
+ for (int i = PREFIX_BYTE_SIZE; i < MAGIC_PACKET_BYTE_SIZE; i += MAC_BYTE_SIZE) {
+ System.arraycopy(macBytes, 0, magicPacket, i, macBytes.length);
+ }
+ return magicPacket;
}
private byte[] createMacBytes(String macAddress) {
return HexUtils.hexToBytes(hexString);
}
- private byte[] createMagicPacket(byte[] macBytes) {
- byte[] bytes = new byte[MAGIC_PACKET_BYTE_SIZE];
- Arrays.fill(bytes, 0, PREFIX_BYTE_SIZE, (byte) 0xff);
- for (int i = PREFIX_BYTE_SIZE; i < MAGIC_PACKET_BYTE_SIZE; i += MAC_BYTE_SIZE) {
- System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
+ private void sendMagicPacketViaMac(byte[] magicPacket) {
+ try (DatagramSocket socket = new DatagramSocket()) {
+ logger.debug("Sending Wake-on-LAN Packet via Broadcast");
+ broadcastMagicPacket(magicPacket, socket);
+ } catch (SocketException e) {
+ logger.error("Failed to open Wake-on-LAN datagram socket", e);
}
- return bytes;
}
- private void sendMagicPacket(byte[] magicPacket) {
+ private void sendMagicPacketViaIp(byte[] magicPacket) {
try (DatagramSocket socket = new DatagramSocket()) {
- if (StringUtils.isEmpty(hostname)) {
- broadcastMagicPacket(magicPacket, socket);
- } else {
+ if (!StringUtils.isEmpty(this.hostname)) {
+ logger.debug("Sending Wake-on-LAN Packet via IP Address");
SocketAddress socketAddress = new InetSocketAddress(this.hostname,
Objects.requireNonNullElse(this.port, WOL_UDP_PORT));
sendMagicPacketToIp(magicPacket, socket, socketAddress);
+ } else {
+ throw new IllegalStateException("Hostname is not set!");
}
} catch (SocketException e) {
logger.error("Failed to open Wake-on-LAN datagram socket", e);
DatagramPacket packet = new DatagramPacket(magicPacket, MAGIC_PACKET_BYTE_SIZE, broadcastAddress,
WOL_UDP_PORT);
socket.send(packet);
- logger.debug("Wake-on-LAN packet sent (MAC address: {}, broadcast address: {})", macAddress,
+ logger.debug("Wake-on-LAN packet sent (MAC address: {}, broadcast address: {})", this.macAddress,
broadcastAddress.getHostAddress());
} catch (IOException e) {
- logger.debug("Failed to send Wake-on-LAN packet (MAC address: {}, broadcast address: {})", macAddress,
- broadcastAddress.getHostAddress(), e);
+ logger.error("Failed to send Wake-on-LAN packet (MAC address: {}, broadcast address: {})",
+ this.macAddress, broadcastAddress.getHostAddress(), e);
}
});
- logger.info("Wake-on-LAN packets sent (MAC address: {})", macAddress);
+ logger.info("Wake-on-LAN packets sent (MAC address: {})", this.macAddress);
}
private void sendMagicPacketToIp(byte[] magicPacket, DatagramSocket socket, SocketAddress ip) {
try {
socket.send(packet);
} catch (IOException e) {
- logger.debug("Failed to send Wake-on-LAN packet (MAC address: {}, address: {})", macAddress, ip, e);
+ logger.error("Failed to send Wake-on-LAN packet (IP address: {})", ip, e);
}
- logger.info("Wake-on-LAN packets sent (MAC address: {}, IP address: {})", macAddress, ip);
+ logger.info("Wake-on-LAN packets sent (IP address: {})", ip);
}
private Stream<InetAddress> broadcastAddressStream() {
try {
return InetAddress.getByName(address);
} catch (UnknownHostException e) {
- logger.debug("Failed to get broadcast address '{}' by name", address, e);
+ logger.error("Failed to get broadcast address '{}' by name", address, e);
return null;
}
}).filter(Objects::nonNull);
WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6f:70:65:6e:48:41",
bytes -> System.arraycopy(bytes, 0, actualPacket, 0, bytes.length));
- sender.sendPacket();
+ sender.sendWakeOnLanPacketViaMac();
assertValidMagicPacket(HexUtils.hexToBytes("6f:70:65:6e:48:41", ":"), actualPacket);
}
WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6F-70-65-6E-48-41",
bytes -> System.arraycopy(bytes, 0, actualPacket, 0, bytes.length));
- sender.sendPacket();
+ sender.sendWakeOnLanPacketViaMac();
assertValidMagicPacket(HexUtils.hexToBytes("6F-70-65-6E-48-41", "-"), actualPacket);
}
WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6f70656e4841",
bytes -> System.arraycopy(bytes, 0, actualPacket, 0, bytes.length));
- sender.sendPacket();
+ sender.sendWakeOnLanPacketViaMac();
assertValidMagicPacket(HexUtils.hexToBytes("6f70656e4841"), actualPacket);
}
}
@Test
- public void sendWithHostnameNullAndPortNull() throws IOException, InterruptedException {
- sendWOLTest(null, null);
+ public void sendWithHostnameNullAndPortNull() {
+ assertThrows(IllegalStateException.class, () -> sendWOLTest(null, null));
}
@Test
- public void sendWithHostnameNull() throws IOException, InterruptedException {
- sendWOLTest(null, 4444);
+ public void sendWithHostnameNull() {
+ assertThrows(IllegalStateException.class, () -> sendWOLTest(null, 4444));
}
private void sendWOLTest(String hostname, Integer port) throws InterruptedException, IOException {
Thread.sleep(100);
}
- WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6f70656e4841", hostname, port);
- sender.sendPacket();
+ try {
+ WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6f70656e4841", hostname, port);
+ sender.sendWakeOnLanPacketViaIp();
- // This Test is only applicable for IP Requests
- if (hostname != null && port != null) {
- socket.receive(datagramPacket);
- }
-
- socket.close();
+ // This Test is only applicable for IP Requests
+ if (hostname != null && port != null) {
+ socket.receive(datagramPacket);
+ }
- Assertions.assertTrue(datagramPacket.getData().length > 0);
+ Assertions.assertTrue(datagramPacket.getData().length > 0);
+ } finally {
+ socket.close();
+ }
}
@Test
public void sendWithEmptyMacAddressThrowsException() {
- assertThrows(IllegalStateException.class, () -> new WakeOnLanPacketSender("").sendPacket());
+ assertThrows(IllegalStateException.class, () -> new WakeOnLanPacketSender("").sendWakeOnLanPacketViaMac());
}
@Test
public void sendWithTooShortMacAddressThrowsException() {
- assertThrows(IllegalStateException.class, () -> new WakeOnLanPacketSender("6f:70:65:6e:48").sendPacket());
+ assertThrows(IllegalStateException.class,
+ () -> new WakeOnLanPacketSender("6f:70:65:6e:48").sendWakeOnLanPacketViaMac());
}
@Test
public void sendWithTooLongMacAddressThrowsException() {
- assertThrows(IllegalStateException.class, () -> new WakeOnLanPacketSender("6f:70:65:6e:48:41:42").sendPacket());
+ assertThrows(IllegalStateException.class,
+ () -> new WakeOnLanPacketSender("6f:70:65:6e:48:41:42").sendWakeOnLanPacketViaMac());
}
@Test
public void sendWithUnsupportedSeparatorInMacAddressThrowsException() {
- assertThrows(IllegalStateException.class, () -> new WakeOnLanPacketSender("6f=70=65=6e=48=41").sendPacket());
+ assertThrows(IllegalStateException.class,
+ () -> new WakeOnLanPacketSender("6f=70=65=6e=48=41").sendWakeOnLanPacketViaMac());
}
}