2012-02-29 14 views
2

私が実際にやってみたいのは、Wi-Fiを介してメッセージをブロードキャストすることです(他のセルには私が作成したアプリがありますが、まだそのIPはわかりません)。 Wi-Fiを介してそのデバイスのIPを持つメッセージ、私は両方のデバイスが同じアプリケーションを実行している理想的な状況でこのシナリオを考えている私はちょうど他のデバイスに無線LAN経由でメッセージをブロードキャストする機能を追加したいと思ったまたはどのように?他のモバイルデバイスのIPアドレスを取得する方法は?

+1

iPhone用のBonjourサービスのように思っているようですが、この質問をチェックしましたか? http://stackoverflow.com/questions/2474143/how-can-i-discover-zerocon-bonjour-services-on-android-im-having-trouble-wi –

答えて

3

私はこのデモプログラムをJavaで作成しました。各ホスト(Androidデバイス)は、クライアントコードとサーバーコードの両方を実行します。クライアントはマルチキャストアドレスにIPアドレスを継続的に公開します。マルチキャストアドレスでは、他のすべてのデバイスがリスンして追跡しています。まったく同じデバイスは同じマルチキャストアドレス上のリスナーでもあるため、パケットを送信する際に他のアンドロイドを発見することができます。このアーキテクチャーはリソース使用量が非常に重く、まったくスケールされないことに注意してください。私は単純にデータグラムを再生するには、これを書いて、それはまた、マルチキャストパックは、Androidスタックによって除外されているので、あなたはので、あなたは、許可android.permission.CHANGE_WIFI_MULTICAST_STATEが必要になりますAndroidの一部については、あなたの質問

import java.net.DatagramPacket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 

public class Main { 

    public static final int PORT = 2345; 
    public static final String MULTICAST = "224.0.0.99"; 

    /* 
    * A simple server that prints the name of the first 
    * device discovered and then terminates 
    */ 
    static class Server extends Thread{ 
     @Override 
     public void run() { 
      try { 
       MulticastSocket socket = new MulticastSocket(PORT); 
       InetAddress group = InetAddress.getByName(MULTICAST); 
       socket.joinGroup(group); 
       byte[] buf = new byte[256]; 

       // receive request 
       DatagramPacket packet = new DatagramPacket(buf, buf.length); 
       socket.receive(packet); 
       System.out.printf("SERVER receives: %s", new String(packet.getData())); 

       socket.leaveGroup(group); 
       socket.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    /* 
    * This client send own IP address to all machines 
    * listening on MULTICAST 
    */ 
    static class Client extends Thread{ 
     @Override 
     public void run() { 
      try { 
       MulticastSocket socket = new MulticastSocket(); 
       socket.setBroadcast(true); 
       byte[] buffer = "I'm a new client. My IP is XXX.XXX.XXX.XXX".getBytes(); 
       DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST), PORT); 
       socket.send(packet); 

       socket.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

    public static void main(String[] args) throws InterruptedException { 
     new Server().start(); 
     Thread.sleep(1000); // Make sure server started 
     new Client().start(); 
    } 

} 

に最も近い答えを思わWifiManager.MulticastLock

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo"); 
multicastLock.acquire(); 
1

私は数日前にこれについて正確に考えていました。私の結論は、あなたがDHCPを介して取得できるようにデバイスのIPで中継することはできず、毎回変更することができるということでした。だから、非常に簡単な方法は、電子メールに添付されたデータを送信し、それを受信者に送信することです。

データを読み取ることができるパーサー(XMLファイルで記述されていると仮定)を実装し、必要なものを受信側で実行する必要があります。これを達成するには、転送するファイルの種類の意図ACTION_VIEWに応答するために正しいコンポーネント(アクティビティ)を登録する必要があります。 XML。

希望すると助かります!

+0

よく、私は地元の大学のためにデザインすることになっています接続されたデバイスに割り当てられたルータから(ほとんどの場合は)静的IPを持っています。私はちょうど私達がwifiでチャットをするのと同様にメッセージを送信する方法を知りたがっていました。 – Saqib

+1

あなたは閉じた環境で働いています!これにより、シナリオが変更されます。それで、私はあなたがTCPパケットを多分使い、クライアント/サーバ側をプログラムするような何かをすべきだと思います... – Caumons

関連する問題