EOS 2  1.1.0
Einfache Objektbasierte Sprache
Ev3SeekerThread.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.ev3.exceptions;
2 
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;
11 
12 import de.lathanda.eos.ev3.comm.Identification;
13 
14 public class Ev3SeekerThread implements Runnable {
15  private static Ev3SeekerThread seeker;
16  private static final Pattern BROADCAST_PATTERN = Pattern.compile(
17  "Serial-Number:\\s(\\w+)\\R" +
18  "Port:\\s(\\d+)\\R" +
19  "Name:\\s(\\w+)\\R" +
20  "Protocol:\\s(\\w+)\\R"
21  );
22  //Example Broadcast
23  //Serial-Number: 0016533f0c1e
24  //Port: 5555
25  //Name: EV3
26  //Protocol: EV3
27  private volatile boolean running = false;
28  private TreeMap<String, Identification> found;
29 
30  private Ev3SeekerThread() {
31  found = new TreeMap<>();
32  }
33  public static Ev3SeekerThread getInstance() {
34  synchronized (Ev3SeekerThread.class) {
35  if (seeker == null) {
36  seeker = new Ev3SeekerThread();
37  }
38  }
39  return seeker;
40  }
41  public synchronized boolean isRunning() {
42  return running;
43  }
44 
45  @Override
46  public void run() {
47  try (DatagramSocket socket = new DatagramSocket(3015, InetAddress.getByName("0.0.0.0"))) {
48  socket.setBroadcast(true);
49  byte[] buf = new byte[512]; //67 needed for 3 character name
50  DatagramPacket packet = new DatagramPacket(buf, buf.length);
51  running = true;
52  while (running) {
53  socket.receive(packet);
54  evalPacket(new String(packet.getData(), packet.getOffset(), packet.getLength()), packet.getAddress());
55  }
56  } catch (IOException e) {
57  running = false;
58  }
59  }
60 
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) {
69  Identification ev3 = found.get(sn);
70  if (ev3 == null) {
71  ev3 = new Identification(sn);
72  found.put(sn, ev3);
73  }
74  ev3.setInetadress(inetaddr);
75  ev3.setPort(Integer.parseInt(port, 10));
76  ev3.setName(name);
77  ev3.setProtocol(protocol);
78  }
79  }
80  }
81  public Identification seekEv3(String target) {
82  synchronized(found) {
83  for (Identification ev3 : found.values()) {
84  if (ev3.getName().equalsIgnoreCase(target) || ev3.getInetadress().getHostAddress().equals(target)) {
85  return ev3;
86  }
87  }
88  }
89  return null;
90  }
92  Entry<String, Identification> first = found.firstEntry();
93  return (first == null)?null:first.getValue();
94  }
95  public synchronized void start() {
96  if (!isRunning()) {
97  new Thread(this).start();
98  }
99  }
100 }
void setInetadress(InetAddress inetadress)
Impressum