2013-04-04 22 views
8

Tworzę aplikację dla systemu Android, aby wysyłać pakiety UDP Multicast z telefonu komórkowego na komputer.UDP Rozsyłanie z telefonu komórkowego na komputer

Jest to kod dla mojej aplikacji mobilnych:

To uprawnienie użytkownika w 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; 
    } 

} 

Ten plik wysyła pakiety multicast:

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

Plik ten prowadzi ewidencję stałych za wifi interakcji.

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

W moim systemie używam kodu Java, aby odebrać pakiety i wydrukować je w konsoli.

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

Nie wiem co jest nie tak, że nie otrzymuję żadnych wyników. Proszę o pomoc. Widziałem wiele tutoriali i śledziłem każdy krok, jaki im powiedzieli.

Odpowiedz

2

Oba urządzenia powinny być podłączone do tej samej sieci sieci. Przesyłając pakiet z emulatora na komputer, znajduje się on w tym samym systemie. Dlatego nie masz z tym żadnego problemu. Ale ponieważ wyślesz pakiety danych z komputera na urządzenie mobilne, oba urządzenia powinny współdzielić tę samą sieć.

Byłoby bardziej wydajne, jeśli oba urządzenia są podłączone do sieci unfirewalled. ponieważ zapora może powodować problemy z wysyłaniem pakietów danych.

To jest wniosek, do którego doszedłem.

Powiązane problemy