2012-02-29 3 views
2

내가 실제로하고 싶은 것은 wifi를 통해 메시지를 브로드 캐스트하는 것입니다 (다른 셀에 내가 작성한 앱이 실행 중이지만 IP는 아직 모르는 경우). 와이파이를 통해 그 장치의 IP와 메시지, 나는 이상적인 조건 에서이 장치는 두 장치가 같은 응용 프로그램을 실행하는 내가이 장치에 다른 장치에 wifi를 통해 메시지를 방송하는 기능을 추가하려면 원하는 만든 생각하고 있어요, 가능합니다 또는 어떻게?다른 휴대 기기의 IP 주소를 얻는 방법은 무엇입니까?

+1

iPhone 용 Bonjour 서비스와 같은 것을 들려주고 싶나요? http://stackoverflow.com/questions/2474143/how-can-i-discover-zeroconf-bonjour-services-on-android-im-having-trouble-wi –

답변

3

Java로이 데모 프로그램을 만들었습니다. 각 호스트 (Android 기기)는 클라이언트 코드와 서버 코드를 모두 실행합니다. 클라이언트는 계속해서 멀티 캐스트 주소에 IP 주소를 게시합니다. 멀티 캐스트 주소에서는 다른 모든 장치가이를 수신하고 추적합니다. 똑같은 장치는 동일한 멀티 캐스트 주소의 수신기이기 때문에 다른 Androids가 패킷을 보낼 때이를 발견 할 수 있습니다. 이 아키텍처는 리소스 사용에 매우 부담이되며 전혀 확장되지 않습니다. 단순히 데이터 그램과 재생이 쓴 또한 멀티 캐스트 포장이 안드로이드 스택에 의해 필터링되기 때문에 당신은 그래서 당신이 권한 android.permission.CHANGE_WIFI_MULTICAST_STATE이 필요합니다 안드로이드 부분에 관한 질문

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(); 
    } 

} 

에 가장 가까운 답을 보인다 will be use 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. 나는 우리가 wifi에서 채팅하는 것과 마찬가지로 메시지를 보내는 방법을 알고 싶었습니다. – Saqib

+1

좋습니다! 그래서 당신은 폐쇄 된 환경에서 일하고 있습니다! 그러면 시나리오가 변경됩니다. 그렇다면 TCP 패킷을 사용하고 클라이언트/서버 쪽을 프로그래밍하는 것과 같은 것을해야한다고 생각합니다. – Caumons

관련 문제