1 package org.rpi.songcast;
2
3 import java.io.IOException;
4 import java.net.DatagramPacket;
5 import java.net.InetAddress;
6 import java.net.InetSocketAddress;
7 import java.net.MulticastSocket;
8 import java.net.NetworkInterface;
9 import java.net.UnknownHostException;
10 import java.util.Enumeration;
11
12 import org.apache.log4j.Logger;
13
14 class UDPReceiver implements Runnable {
15
16 private Logger log = Logger.getLogger(this.getClass());
17
18 int mcastPort = 0;
19
20 InetAddress mcastAddr = null;
21
22 InetAddress localHost = null;
23
24 String zoneID = "";
25
26 private boolean bConnected = false;
27
28 private MulticastSocket mSocket = null;
29
30 private boolean bRunning = true;
31
32 public UDPReceiver(int port, InetAddress addr, String zoneID) {
33
34 mcastPort = port;
35
36 mcastAddr = addr;
37 this.zoneID = zoneID;
38
39 try {
40
41 localHost = InetAddress.getByName("192.168.1.72");
42
43 } catch (UnknownHostException uhe) {
44
45 log.error("Problems identifying local host", uhe);
46
47 }
48
49 }
50
51 public void run() {
52
53
54
55 try {
56 log.debug("Setting up multicast receiver");
57
58 mSocket = new MulticastSocket(mcastPort);
59 InetAddress inet = InetAddress.getByName("192.168.1.72");
60 NetworkInterface netIf = NetworkInterface.getByInetAddress(inet);
61 mSocket.setNetworkInterface(netIf);
62 mSocket.setReuseAddress(true);
63 NetworkInterface ifs = mSocket.getNetworkInterface();
64 log.debug("Receiver NetworkInterface: " + ifs.getDisplayName());
65 log.debug("Joining Mutlicast Group: " + mcastAddr.getHostAddress() + ":" + mcastPort);
66 mSocket.joinGroup(mcastAddr);
67 setConnected(true);
68 } catch (IOException ioe) {
69 log.error("Trouble opening multicast port", ioe);
70 }
71
72 DatagramPacket packet;
73 log.debug("Multicast receiver set up ");
74 while (bRunning) {
75 try {
76 byte[] buf = new byte[1000];
77 packet = new DatagramPacket(buf, buf.length);
78 log.debug("McastReceiver: waiting for packet");
79 mSocket.receive(packet);
80 log.debug("Received Packet: " + packet.getAddress().getHostAddress());
81 byte[] data = packet.getData();
82 StringBuilder sb = new StringBuilder();
83 for (byte b : data) {
84 sb.append(String.format("%02X ", b));
85 }
86 log.debug("Received: " + sb.toString());
87 String text = new String(data, "UTF-8");
88 log.debug("Received: " + text);
89 OHMessage mess = new OHMessage();
90 mess.data = data;
91 mess.checkMessageType();
92
93 log.debug("Address: " + packet.getAddress().getHostAddress());
94 if (!(packet.getAddress().equals(localHost))) {
95 log.debug("Recevied from: " + packet.getAddress());
96 } else {
97 log.debug("That was a Localhost:");
98 }
99 } catch (Exception e) {
100 log.error("Trouble reading multicast message", e);
101 }
102 }
103
104 }
105
106 public boolean isConnected() {
107 return bConnected;
108 }
109
110 private void setConnected(boolean bConnected) {
111 this.bConnected = bConnected;
112 }
113
114 public void disconnect()
115 {
116 bRunning = false;
117 if(mSocket !=null)
118 {
119 try {
120 mSocket.leaveGroup(mcastAddr);
121 } catch (IOException e) {
122 log.error("Error Leave Group");
123 }
124 try
125 {
126 mSocket.close();
127 }
128 catch(Exception e)
129 {
130 log.error("Error Close");
131 }
132 }
133 }
134
135 }