1 package de.lathanda.eos.ev3.exceptions;
3 import java.io.IOException;
4 import java.net.DatagramPacket;
5 import java.net.DatagramSocket;
6 import java.net.InetAddress;
7 import java.util.Map.Entry;
8 import java.util.TreeMap;
9 import java.util.regex.Matcher;
10 import java.util.regex.Pattern;
12 import de.lathanda.eos.ev3.comm.Identification;
16 private static final Pattern BROADCAST_PATTERN = Pattern.compile(
17 "Serial-Number:\\s(\\w+)\\R" +
20 "Protocol:\\s(\\w+)\\R"
27 private volatile boolean running =
false;
28 private TreeMap<String, Identification> found;
31 found =
new TreeMap<>();
47 try (DatagramSocket socket =
new DatagramSocket(3015, InetAddress.getByName(
"0.0.0.0"))) {
48 socket.setBroadcast(
true);
49 byte[] buf =
new byte[512];
50 DatagramPacket packet =
new DatagramPacket(buf, buf.length);
53 socket.receive(packet);
54 evalPacket(
new String(packet.getData(), packet.getOffset(), packet.getLength()), packet.getAddress());
56 }
catch (IOException e) {
61 private void evalPacket(String broadcastMessage, InetAddress inetaddr) {
62 Matcher matcher = BROADCAST_PATTERN.matcher(broadcastMessage);
63 if (matcher.matches()) {
64 String sn = matcher.group(1);
65 String port = matcher.group(2);
66 String name = matcher.group(3);
67 String protocol = matcher.group(4);
68 synchronized (found) {
75 ev3.
setPort(Integer.parseInt(port, 10));
84 if (ev3.
getName().equalsIgnoreCase(target) || ev3.
getInetadress().getHostAddress().equals(target)) {
92 Entry<String, Identification> first = found.firstEntry();
93 return (first ==
null)?
null:first.getValue();
95 public synchronized void start() {
97 new Thread(
this).start();
InetAddress getInetadress()
void setInetadress(InetAddress inetadress)
void setName(String name)
void setProtocol(String protocol)
Identification getAnyEv3()
static Ev3SeekerThread getInstance()
Identification seekEv3(String target)
synchronized void start()
synchronized boolean isRunning()