2015-04-17 170 views
3

我是新來的wifi直接,我希望能夠廣播消息,因爲我有一個時間表,當我點擊發布按鈕,我希望所有連接的設備都顯示該消息在他們的時間表上。我能夠發送數據點對點。我已經搜索了這個問題,我發現使用UDP是一個不錯的選擇,但我不知道如何實現它在WiFi直接。使用UDP在Wifi Direct上廣播

我發現這個代碼,使用UDP Wi-Fi以獲取廣播地址

InetAddress getBroadcastAddress() throws IOException { 
WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE); 
DhcpInfo dhcp = wifi.getDhcpInfo(); 
// handle null somehow 

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); 
return InetAddress.getByAddress(quads);} 

這對於發送和接收UDP廣播數據包

DatagramSocket socket = new DatagramSocket(PORT); 
socket.setBroadcast(true); 
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), 
getBroadcastAddress(), DISCOVERY_PORT); 
socket.send(packet); 

byte[] buf = new byte[1024]; 
DatagramPacket packet = new DatagramPacket(buf, buf.length); 
socket.receive(packet); 

能否請你幫我,給我解釋一下它如何工作 在此先感謝。

+0

我有一個解決方案,您可以將數據包組播到多播組。所以如果所有的設備都加入了一個組播IP。然後發送一個UDP數據包到該組播IP將被所有設備接收。如果您希望我詳細說明,請告訴我。 –

+0

@ZiadHalabi是的請詳細說明,如果你的代碼給出了一些很好的示例代碼 – lna1994

+0

@ Ina1994請編輯你的問題,以便它在WiFi Direct中詢問更廣泛的廣播問題。 –

回答

1

一種解決方案是將數據包組播到組播組。所有設備加入一個組播IP,並且發送者將數據包發送到該組播IP。確保您分配的IP屬於多播IP的範圍。在處理多播時,設備需要獲取多播鎖。請注意,由於Multicast基於UDP,因此預計會發生傳輸中的一些錯誤。

的AsyncTask類的設備將接收數據包:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import java.net.UnknownHostException; 

import android.content.Context; 
import android.net.wifi.WifiManager; 
import android.net.wifi.WifiManager.MulticastLock; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 

public class ReceiverMulticastAsyncTask extends AsyncTask<Void, Integer ,String > { 

    @Override 
    protected String doInBackground(Void... params) { 

     //Acquire the MulticastLock 
     WifiManager wifi = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); 
     MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
     multicastLock.setReferenceCounted(true); 
     multicastLock.acquire(); 

     //Join a Multicast Group 
     InetAddress address=null; 
     MulticastSocket clientSocket=null; 
     try { 
      clientSocket = new MulticastSocket(1212); 
      address = InetAddress.getByName("224.0.0.1"); 
      clientSocket.joinGroup(address); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace();   
     } 
     DatagramPacket packet=null;   
     byte[] buf = new byte[1024]; 
     packet = new DatagramPacket(buf, buf.length); 
     //Receive packet and get the Data 
     try { 
      clientSocket.receive(packet); 
      byte[] data = packet.getData(); 
      Log.d("DATA", data.toString()+""); 

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

     } 
     multicastLock.release(); 

     try { 
      clientSocket.leaveGroup(address); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     clientSocket.close(); 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     //do whatever... 
    } 
} 

的AsyncTask類的設備將發送數據包:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

import android.content.Context; 
import android.net.wifi.WifiManager; 
import android.net.wifi.WifiManager.MulticastLock; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 

public class SenderMulticastAsyncTask extends AsyncTask<Void, Integer, String> { 

    @Override 
    protected String doInBackground(Void... params) { 

     int port =1212; 
     DatagramSocket socket=null; 
     try { 
      socket = new DatagramSocket(port); 
     } catch (SocketException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     InetAddress group = null; 
     try { 
      group = InetAddress.getByName("224.0.0.1"); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      socket.close(); 
      e.printStackTrace(); 
     } 

     //Sending to Multicast Group 
     String message_to_send ="Test"; 
     byte[] buf = message_to_send.getBytes(); 
     DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port); 
     try { 
      socket.send(packet); 
      Log.d("Send", "Sending Packet"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      socket.close(); 
      e.printStackTrace(); 
     } 

     socket.close(); 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     //do whatever ... 
    } 
} 
+0

我不明白我怎麼可以實現這個代碼在WiFi直接 – lna1994

+0

我的意思是'wifi'變量的類型'WifiManager'不'WifiP2pManager',我不能使用'的類型爲'WifiP2pManager'的createMulticastLock' – lna1994

+0

建立WiFi Direct連接可以執行這些AsyncTask類。當建立WiFi Direct連接時,設備和組所有者之間的關係與處理接入點時的相同。例如在一個按鈕監聽器中,你可以寫下這個:new SenderMulticastAsyncTask.execute(); –

3

在Android中的Wi-Fi P2P有一個「組所有者」的概念,它是充當接入點的設備。對於當前API,羣組所有者的IP地址似乎設置爲192.168.49.1,我認爲這是硬編碼的地方。有關該組網絡的廣播地址的快速猜測將爲192.168.49.255。對於我已經測試過的所有(少數)設備,事實證明是這樣。