Skip to content

Commit d39ea72

Browse files
committed
Merge branch 'develop'
2 parents 2151ad8 + b0ea680 commit d39ea72

File tree

11 files changed

+201
-12
lines changed

11 files changed

+201
-12
lines changed

Diff for: .gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,7 @@
2222
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2323
hs_err_pid*
2424
/target/
25+
26+
.settings/
27+
28+
src/main/java/info/unterrainer/commons/udpobserver/Information.java

Diff for: .settings/org.eclipse.jdt.core.prefs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
eclipse.preferences.version=1
2+
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
23
org.eclipse.jdt.core.compiler.codegen.targetPlatform=13
34
org.eclipse.jdt.core.compiler.compliance=13
45
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled

Diff for: pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<modelVersion>4.0.0</modelVersion>
1212
<groupId>info.unterrainer.commons.udp-observer</groupId>
1313
<artifactId>udp-observer</artifactId>
14-
<version>0.1.9</version>
14+
<version>0.1.10</version>
1515
<name>UdpObserver</name>
1616
<packaging>jar</packaging>
1717

Diff for: src/main/java/info/unterrainer/commons/udpobserver/Information.java

-7
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package info.unterrainer.commons.udpobserver;
2+
3+
import java.io.IOException;
4+
import java.net.DatagramPacket;
5+
import java.net.DatagramSocket;
6+
import java.net.InetAddress;
7+
import java.net.InterfaceAddress;
8+
import java.net.NetworkInterface;
9+
import java.net.SocketException;
10+
import java.net.UnknownHostException;
11+
import java.nio.charset.StandardCharsets;
12+
import java.util.ArrayList;
13+
import java.util.Enumeration;
14+
import java.util.List;
15+
import java.util.Objects;
16+
17+
import info.unterrainer.commons.udpobserver.exceptions.UdpSendException;
18+
import lombok.RequiredArgsConstructor;
19+
import lombok.extern.slf4j.Slf4j;
20+
21+
@Slf4j
22+
@RequiredArgsConstructor
23+
public class UdpSender {
24+
25+
private final int senderPort;
26+
private DatagramSocket sendSocket;
27+
private List<InetAddress> broadcastAddresses;
28+
29+
protected List<InetAddress> getBroadcastAddresses() {
30+
if (broadcastAddresses != null)
31+
return broadcastAddresses;
32+
33+
try {
34+
broadcastAddresses = getAllBroadcastAddresses();
35+
} catch (SocketException e) {
36+
return List.of();
37+
}
38+
return broadcastAddresses;
39+
}
40+
41+
protected DatagramSocket getSendSocket() {
42+
if (sendSocket == null) {
43+
try {
44+
sendSocket = new DatagramSocket(senderPort, InetAddress.getLocalHost());
45+
} catch (SocketException | UnknownHostException e) {
46+
log.error("Error retrieving socket.", e);
47+
throw new UdpSendException(e);
48+
}
49+
try {
50+
sendSocket.setBroadcast(true);
51+
} catch (SocketException e) {
52+
log.error("Error setting broadcast-mode.", e);
53+
throw new UdpSendException(e);
54+
}
55+
}
56+
return sendSocket;
57+
}
58+
59+
public void broadcast(final int targetPort, final String content) {
60+
broadcast(targetPort, content.getBytes(StandardCharsets.UTF_8));
61+
}
62+
63+
public void broadcast(final int targetPort, final byte[] bytes) {
64+
for (InetAddress address : getBroadcastAddresses())
65+
try {
66+
send(address, targetPort, bytes);
67+
} catch (Exception e) {
68+
// NOOP
69+
}
70+
}
71+
72+
public void send(final InetAddress targetAddress, final int targetPort, final String content) {
73+
send(targetAddress.getHostAddress(), targetPort, content);
74+
}
75+
76+
public void send(final InetAddress targetAddress, final int targetPort, final byte[] bytes) {
77+
send(targetAddress.getHostAddress(), targetPort, bytes);
78+
}
79+
80+
public void send(final String targetAddress, final int targetPort, final String content) {
81+
send(targetAddress, targetPort, content.getBytes(StandardCharsets.UTF_8));
82+
}
83+
84+
public void send(final String targetAddress, final int targetPort, final byte[] bytes) {
85+
DatagramPacket packet;
86+
try {
87+
packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(targetAddress), targetPort);
88+
} catch (UnknownHostException e) {
89+
log.error("Error creating new packet.", e);
90+
throw new UdpSendException(e);
91+
}
92+
try {
93+
getSendSocket().send(packet);
94+
} catch (IOException e) {
95+
log.error("Error sending packet.", e);
96+
throw new UdpSendException(e);
97+
}
98+
}
99+
100+
public List<InetAddress> getAllBroadcastAddresses() throws SocketException {
101+
List<InetAddress> broadcastList = new ArrayList<>();
102+
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
103+
while (interfaces.hasMoreElements()) {
104+
NetworkInterface networkInterface = interfaces.nextElement();
105+
106+
if (networkInterface.isLoopback() || !networkInterface.isUp())
107+
continue;
108+
109+
networkInterface.getInterfaceAddresses()
110+
.stream()
111+
.map(InterfaceAddress::getBroadcast)
112+
.filter(Objects::nonNull)
113+
.forEach(broadcastList::add);
114+
}
115+
return broadcastList;
116+
}
117+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package info.unterrainer.commons.udpobserver.exceptions;
2+
3+
public class UdpSendException extends RuntimeException {
4+
5+
private static final long serialVersionUID = 2243163797766428122L;
6+
7+
public UdpSendException(final Throwable cause) {
8+
super(cause);
9+
}
10+
11+
}

Diff for: src/main/java/info/unterrainer/commons/udpobserver/scripts/TestObserver.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@
99

1010
public class TestObserver {
1111

12-
/**
13-
* STA:{"type":"ENOCEAN","adr":"fef2b30d","data":"eltako_button4","vendor":"eltako","state":{"BI":"pressed","BO":"released","AO":"released","AI":"released"}}
14-
*/
1512
private static DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
1613

1714
public static void main(final String[] args) throws InterruptedException, IOException {
18-
UdpObserver observer = new UdpObserver(1901, 256, 1000);
15+
UdpObserver observer = new UdpObserver(8001, 256, 1000);
1916
observer.start();
2017
System.out.println("listening for UDP packets...");
2118
System.out.println("press <enter> to stop.");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package info.unterrainer.commons.udpobserver.scripts;
2+
3+
import java.io.IOException;
4+
import java.net.InetAddress;
5+
import java.util.List;
6+
7+
import info.unterrainer.commons.udpobserver.UdpSender;
8+
9+
public class TestObserverSender {
10+
11+
public static void main(final String[] args) throws InterruptedException, IOException {
12+
UdpSender sender = new UdpSender(8002);
13+
14+
List<InetAddress> broadcastAddresses = sender.getAllBroadcastAddresses();
15+
System.out.println("found broadcast addresses:");
16+
for (InetAddress address : broadcastAddresses)
17+
System.out.println(" - " + address.getHostAddress());
18+
19+
System.out.println("sending UDP packets to port 8001...");
20+
System.out.println("press <enter> to stop.");
21+
while (System.in.available() == 0) {
22+
sender.broadcast(8001, "TestPacket!");
23+
24+
System.out.println("Packet sent.");
25+
Thread.sleep(1000L);
26+
}
27+
System.out.println("done.");
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package info.unterrainer.commons.udpobserver.scripts;
2+
3+
import java.io.IOException;
4+
import java.time.format.DateTimeFormatter;
5+
import java.util.Collection;
6+
7+
import info.unterrainer.commons.udpobserver.UdpDatagram;
8+
import info.unterrainer.commons.udpobserver.UdpObserver;
9+
10+
public class TestObserverShelly {
11+
12+
/**
13+
* STA:{"type":"ENOCEAN","adr":"fef2b30d","data":"eltako_button4","vendor":"eltako","state":{"BI":"pressed","BO":"released","AO":"released","AI":"released"}}
14+
*/
15+
private static DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
16+
17+
public static void main(final String[] args) throws InterruptedException, IOException {
18+
UdpObserver observer = new UdpObserver(1901, 256, 1000);
19+
observer.start();
20+
System.out.println("listening for UDP packets...");
21+
System.out.println("press <enter> to stop.");
22+
while (System.in.available() == 0) {
23+
Thread.sleep(100L);
24+
outputList(observer.getReceivedDatagrams());
25+
}
26+
observer.close();
27+
System.out.println("done.");
28+
}
29+
30+
private static void outputList(final Collection<UdpDatagram> list) {
31+
for (UdpDatagram data : list)
32+
System.out.println(
33+
String.format("[%s] %s", data.getMetaData().getTimestamp().format(formatter), data.getContent()));
34+
}
35+
}

Diff for: start_test_observer.bat

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
java -cp "target/libs/*;target/classes" info.unterrainer.commons.udpobserver.scripts.TestObserver

Diff for: start_test_observer.sh

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
java -cp "target/libs/*;target/classes" info.unterrainer.commons.udpobserver.scripts.TestObserver

0 commit comments

Comments
 (0)