View Javadoc

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              // TODO set own IP Address
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              //We need to ensure that the Receiver is bound to the correct Network address..
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                  // ignore packets from myself, print the rest
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 }