diff options
Diffstat (limited to 'same-android/src')
3 files changed, 156 insertions, 0 deletions
| diff --git a/same-android/src/main/java/com/orbekk/Broadcast.java b/same-android/src/main/java/com/orbekk/Broadcast.java new file mode 100644 index 0000000..84b2d6e --- /dev/null +++ b/same-android/src/main/java/com/orbekk/Broadcast.java @@ -0,0 +1,56 @@ +package com.orbekk; + +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()); +     +    public Broadcast(Context context) { +        this.context = context; +    } +     +    public 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 boolean sendBroadcast(byte[] data, int port) { +        try { +            DatagramSocket socket = new DatagramSocket(port); +            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; +        } +    } +}
\ No newline at end of file diff --git a/same-android/src/main/java/com/orbekk/HelloAndroidActivity.java b/same-android/src/main/java/com/orbekk/HelloAndroidActivity.java new file mode 100644 index 0000000..4160bf4 --- /dev/null +++ b/same-android/src/main/java/com/orbekk/HelloAndroidActivity.java @@ -0,0 +1,49 @@ +package com.orbekk; + +import com.orbekk.net.Broadcaster; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; + +public class HelloAndroidActivity extends Activity { + +    private static String TAG = "master"; +    private PingServer pingServer; +     +    /** +     * Called when the activity is first created. +     * @param savedInstanceState If the activity is being re-initialized after  +     * previously being shut down then this Bundle contains the data it most  +     * recently supplied in onSaveInstanceState(Bundle). <b>Note: Otherwise it is null.</b> +     */ +    @Override +    public void onCreate(Bundle savedInstanceState) { +        super.onCreate(savedInstanceState); +         +        System.setProperty("java.net.preferIPv4Stack", "true"); +        System.setProperty("java.net.preferIPv6Addresses", "false"); +         +		Log.i(TAG, "onCreate"); +        setContentView(R.layout.main); + +        pingServer = PingServer.createPingServer(10080); +        try { +            pingServer.start(); +        } catch (Exception e) { +            throw new RuntimeException(e.getMessage()); +        } +         +//        Broadcast broadcast = new Broadcast(this); +//        broadcast.sendBroadcast("Broadcast test".getBytes(), 10010); +        Broadcaster broadcaster = new Broadcaster(); +        Log.i(TAG, "Broadcast success: " + broadcaster.sendBroadcast(10010, "Broadcast test from Android".getBytes())); +    } +     +    @Override +    protected void onDestroy() { +        pingServer.stop(); +        super.onDestroy(); +    } +} + diff --git a/same-android/src/main/java/com/orbekk/PingServer.java b/same-android/src/main/java/com/orbekk/PingServer.java new file mode 100644 index 0000000..5df2346 --- /dev/null +++ b/same-android/src/main/java/com/orbekk/PingServer.java @@ -0,0 +1,51 @@ +package com.orbekk; + +import org.eclipse.jetty.server.Server; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.orbekk.rpc.PingService; +import com.orbekk.rpc.PingServiceImpl; +import com.orbekk.rpc.RpcHandler; + +public class PingServer { +    private Server server; +    private Logger logger = LoggerFactory.getLogger(getClass()); + +    public PingServer(Server server) { +        this.server = server; +    } + +    public static PingServer createPingServer(int port) { +        PingService service = new PingServiceImpl(); +        JsonRpcServer jsonServer = new JsonRpcServer(service, PingService.class);    + +        Server server = new Server(port); +        RpcHandler rpcHandler = new RpcHandler(jsonServer); +        server.setHandler(rpcHandler); + +        return new PingServer(server); +    } + +    public void start() throws Exception { +        logger.info("Starting server."); +        server.start(); +    } + +    public void join() { +        try { +            server.join(); +        } catch (InterruptedException e) { +            logger.info("Received InterruptException while waiting for server.", e.fillInStackTrace()); +        } +    } +     +    public void stop() { +        try { +            server.stop(); +        } catch (Exception e) { +            logger.warn("Exception when stopping server.", e.fillInStackTrace()); +        } +    } +} | 
