2013-04-04 25 views
8

Tôi đang tạo một Ứng dụng Android để gửi Gói đa hướng UDP từ thiết bị di động đến máy tính của tôi.UDP Multicasting Từ Di động tới PC

Đây là mã cho ứng dụng di động của tôi:

Đây là phép người dùng trong AndroidManifest.xml

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

DeviceManagerWindow.java

import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.view.Menu; 

public class DeviceManagerWindow extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_device_manager_window); 
     WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
     if(wifi != null) 
     { 
      WifiManager.MulticastLock lock = wifi.createMulticastLock("WifiDevices"); 
      lock.acquire(); 
     } 
     Thread sendMulticast = new Thread(new MultiCastThread()); 
     sendMulticast.start(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.device_manager_window, menu); 
     return true; 
    } 

} 

Tập tin này sẽ gửi các gói tin multicast:

.210

MultiCastThread.java

public class MultiCastThread implements Runnable 
{ 
    MulticastSocket s; 
    DatagramPacket pack; 
    public MultiCastThread() 
    { 
     try 
     { 
      s = new MulticastSocket(WifiConstants.PORT_NO); 
      s.joinGroup(InetAddress.getByName(WifiConstants.GROUP_ADDR)); 
     } 
     catch(Exception e) 
     { 
      Log.v("Socket Error: ",e.getMessage()); 
     } 
    } 
    @Override 
    public void run() 
    { 
     try 
     { 
      pack = new DatagramPacket(WifiConstants.WHO_IS.getBytes(),WifiConstants.WHO_IS.getBytes().length, InetAddress.getByName(WifiConstants.GROUP_ADDR), WifiConstants.PORT_NO); 
      s.setTimeToLive(WifiConstants.TIME_TO_LIVE); 
      s.send(pack); 
     } 
     catch(Exception e) 
     { 
      Log.v("Packet Sending Error: ",e.getMessage()); 
     } 
    } 
} 

WifiConstants.java

Tập tin này giữ hồ sơ của các hằng số cho Wifi tương tác.

public class WifiConstants 
{ 
    public static final int PORT_NO = 5432; 
    public static final String GROUP_ADDR = "225.4.5.6"; 
    public static final int DGRAM_LEN = 1024; 
    public static final String WHO_IS = "Who is?"; 
    public static final int TIME_TO_LIVE = 1; 
} 

Trên hệ thống của tôi, tôi đang chạy một mã java để nhận được các gói và in nó trong giao diện điều khiển.

ListenerDevice.java

package Receiver; 

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


public class ListenerDevice 
{ 
    public static final int PORT_NO = 5432; 
    public static final String GROUP_ADDR = "225.4.5.6"; 
    public static final int DGRAM_LEN = 1024; 
    public static final String WHO_IS = "Who is?"; 
    public static final int TIME_TO_LIVE = 1; 
    public static void main(String[] args) 
    { 
     MulticastSocket socket = null; 
     DatagramPacket inPacket = null; 
     byte[] inBuf = new byte[DGRAM_LEN]; 
     try 
     { 
      //Prepare to join multicast group 
      socket = new MulticastSocket(PORT_NO); 
      InetAddress address = InetAddress.getByName(GROUP_ADDR); 
      socket.joinGroup(address); 

       while(true) 
       { 
        System.out.println("Listening"); 
        inPacket = new DatagramPacket(inBuf, inBuf.length); 
        socket.receive(inPacket); 
        String msg = new String(inBuf, 0, inPacket.getLength()); 
        System.out.println("From :" + inPacket.getAddress() + " Msg : " + msg); 
       } 
     } 
     catch(Exception ioe) 
     { 
      System.out.println(ioe); 
     } 
     } 
} 

Tôi không biết những gì là sai tôi không nhận được bất kỳ đầu ra. Vui lòng trợ giúp. Tôi đã thấy nhiều hướng dẫn và theo dõi từng bước họ nói.

Trả lời

2

Cả hai thiết bị phải được kết nối với cùng một mạng . Khi bạn đang gửi gói từ Trình giả lập đến PC, nó nằm trên cùng một hệ thống. Vì vậy, bạn không phải đối mặt với bất kỳ vấn đề với nó. Nhưng vì bạn sẽ gửi các gói dữ liệu từ máy tính đến thiết bị di động, cả hai thiết bị nên chia sẻ cùng một mạng.

Sẽ có nhiều hơn hiệu quả nếu cả hai thiết bị được kết nối với mạng unfirewalled. vì tường lửa có thể gây ra sự cố khi gửi các gói dữ liệu.

Đây là kết luận mà tôi đã đưa ra.