From 2570d2c6f0be6bb16630b5685063501dd931b4d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Fri, 27 Jan 2012 14:13:30 +0100 Subject: Refactor Android Broadcaster class. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit – Add functionality to find current wi-fi IP. – Clean up resulting code. --- .../main/java/com/orbekk/discovery/Broadcast.java | 82 ------------------- .../java/com/orbekk/discovery/Broadcaster.java | 94 ++++++++++++++++++++++ .../java/com/orbekk/discovery/SameService.java | 6 +- 3 files changed, 97 insertions(+), 85 deletions(-) delete mode 100644 same-android/src/main/java/com/orbekk/discovery/Broadcast.java create mode 100644 same-android/src/main/java/com/orbekk/discovery/Broadcaster.java diff --git a/same-android/src/main/java/com/orbekk/discovery/Broadcast.java b/same-android/src/main/java/com/orbekk/discovery/Broadcast.java deleted file mode 100644 index c674f65..0000000 --- a/same-android/src/main/java/com/orbekk/discovery/Broadcast.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.orbekk.discovery; - -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.SocketException; -import java.net.UnknownHostException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import android.content.Context; -import android.net.DhcpInfo; -import android.net.wifi.WifiManager; - -public class Broadcast { - private Context context; - private Logger logger = LoggerFactory.getLogger(getClass()); - private DatagramSocket socket = null; - - public Broadcast(Context context) { - this.context = context; - } - - public synchronized InetAddress getBroadcastAddress() { - WifiManager wifi = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); - DhcpInfo dhcp = wifi.getDhcpInfo(); - - int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; - byte[] quads = new byte[4]; - for (int k = 0; k < 4; k++) - quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); - try { - return InetAddress.getByAddress(quads); - } catch (UnknownHostException e) { - logger.warn("Failed to find broadcast address."); - return null; - } - } - - public synchronized boolean sendBroadcast(byte[] data, int port) { - try { - socket = new DatagramSocket(0); - socket.setBroadcast(true); - DatagramPacket packet = new DatagramPacket(data, data.length, getBroadcastAddress(), port); - socket.send(packet); - return true; - } catch (SocketException e) { - logger.warn("Failed to send broadcast.", e.fillInStackTrace()); - return false; - } catch (IOException e) { - logger.warn("Error when sending broadcast.", e.fillInStackTrace()); - return false; - } finally { - socket.close(); - socket = null; - } - } - - public synchronized DatagramPacket receiveBroadcast(int port) { - try { - socket = new DatagramSocket(port); - byte[] data = new byte[1024]; - DatagramPacket packet = new DatagramPacket(data, data.length); - socket.receive(packet); - return packet; - } catch (IOException e) { - logger.warn("Failed to receive broadcast.", e); - return null; - } finally { - socket.close(); - socket = null; - } - } - - public void interrupt() { - if (socket != null) { - socket.close(); - } - } -} \ No newline at end of file diff --git a/same-android/src/main/java/com/orbekk/discovery/Broadcaster.java b/same-android/src/main/java/com/orbekk/discovery/Broadcaster.java new file mode 100644 index 0000000..167eda1 --- /dev/null +++ b/same-android/src/main/java/com/orbekk/discovery/Broadcaster.java @@ -0,0 +1,94 @@ +package com.orbekk.discovery; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import android.content.Context; +import android.net.DhcpInfo; +import android.net.wifi.WifiManager; + +public class Broadcaster { + private Context context; + private Logger logger = LoggerFactory.getLogger(getClass()); + private DatagramSocket socket = null; + + public Broadcaster(Context context) { + this.context = context; + } + + public InetAddress fromInt(int ip) { + byte[] quads = new byte[4]; + for (int k = 0; k < 4; k++) + quads[k] = (byte) ((ip >> k * 8) & 0xFF); + try { + return InetAddress.getByAddress(quads); + } catch (UnknownHostException e) { + logger.warn("Failed to find broadcast address."); + return null; + } + } + + public DhcpInfo getDhcpInfo() { + WifiManager wifi = + (WifiManager)context.getSystemService(Context.WIFI_SERVICE); + return wifi.getDhcpInfo(); + } + + public synchronized InetAddress getWlanAddress() { + return fromInt(getDhcpInfo().ipAddress); + } + + public synchronized InetAddress getBroadcastAddress() { + DhcpInfo dhcp = getDhcpInfo(); + int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; + return fromInt(broadcast); + } + + public synchronized boolean sendBroadcast(byte[] data, int port) { + try { + socket = new DatagramSocket(0); + socket.setBroadcast(true); + DatagramPacket packet = new DatagramPacket(data, data.length, getBroadcastAddress(), port); + socket.send(packet); + return true; + } catch (SocketException e) { + logger.warn("Failed to send broadcast.", e.fillInStackTrace()); + return false; + } catch (IOException e) { + logger.warn("Error when sending broadcast.", e.fillInStackTrace()); + return false; + } finally { + socket.close(); + socket = null; + } + } + + public synchronized DatagramPacket receiveBroadcast(int port) { + try { + socket = new DatagramSocket(port); + byte[] data = new byte[1024]; + DatagramPacket packet = new DatagramPacket(data, data.length); + socket.receive(packet); + return packet; + } catch (IOException e) { + logger.warn("Failed to receive broadcast.", e); + return null; + } finally { + socket.close(); + socket = null; + } + } + + public void interrupt() { + if (socket != null) { + socket.close(); + } + } +} \ No newline at end of file diff --git a/same-android/src/main/java/com/orbekk/discovery/SameService.java b/same-android/src/main/java/com/orbekk/discovery/SameService.java index 7ca9778..68a6c0b 100644 --- a/same-android/src/main/java/com/orbekk/discovery/SameService.java +++ b/same-android/src/main/java/com/orbekk/discovery/SameService.java @@ -21,10 +21,10 @@ public class SameService extends Service { private Thread discoveryThread = null; public final class DiscoveryThread extends Thread { - Broadcast broadcast; + Broadcaster broadcast; public DiscoveryThread() { - broadcast = new Broadcast(SameService.this); + broadcast = new Broadcaster(SameService.this); } @Override public void run() { @@ -69,7 +69,7 @@ public class SameService extends Service { private void sendBroadcastDiscovery() { byte[] data = "Discover".getBytes(); - new Broadcast(this).sendBroadcast(data, PORT); + new Broadcaster(this).sendBroadcast(data, PORT); } private void joinNetwork() { -- cgit v1.2.3