2011-07-01 88 views
13

我有一個原型Android應用程序,該應用程序正在監聽多播數據包以「發現」要與之通信的客戶端。插座設置與此類似:在熱點/共享模式下的Android上的多播支持

InetAddress group = InetAddress.getByName("228.1.2.3"); 
MulticastSocket s = new MulticastSocket(4000); 
s.joinGroup(group); 

當所有設備通過WiFi連接時,此功能非常有效。我想用手機作爲便攜式熱點來支持這一點。但是,儘管我的所有設備似乎都能正確連接到熱點,但我不再接收組播數據。我想知道是否存在禁止在熱點模式下進行此類通信的限制,或者是否有任何其他網絡配置需要啓用此功能?我已經嘗試過在運行薑餅和Froyo的幾款不同設備上運行,但沒有運氣。

+1

我很想聽聽你是否設法解決這個問題。我理解它的方式是,你需要一個多播鎖,以便讓多播工作。贏得一個的唯一途徑是通過wifi管理者。不幸的是,將該設備設置爲熱點時,似乎在eth0接口上創建了組播鎖,而實際的通信發生在wl0.1上。就我所知的這個問題而言,在正確的軌道上。 – Petrus

+0

同樣在這裏....... – zaf

+0

這裏幾乎是一樣的東西。這兩種設備都在播出,但他們不能「看到」彼此。 –

回答

3

正如這篇文章顯示: https://plus.google.com/+Chainfire/posts/9NMemrKYnCd

MulticastSocket時: :setNetworkInterface()

將是答案

你可以找到通過爲wlan0 ETH:

public static NetworkInterface getWlanEth() { 
    Enumeration<NetworkInterface> enumeration = null; 
    try { 
     enumeration = NetworkInterface.getNetworkInterfaces(); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 
    NetworkInterface wlan0 = null; 
    StringBuilder sb = new StringBuilder(); 
    while (enumeration.hasMoreElements()) { 
     wlan0 = enumeration.nextElement(); 
     sb.append(wlan0.getName() + " "); 
     if (wlan0.getName().equals("wlan0")) { 
      //there is probably a better way to find ethernet interface 
      Log.i(TAG, "wlan0 found"); 
      return wlan0; 
     } 
    } 

    return null; 
} 

有一個嘗試,還是讓我知道,如果它或者未熱點模式...

0

我有同樣的問題,並想出了由@braden,@ user707606和Chainfire在這個Link中主要發佈的帖子組合的解決方案。

發佈在鏈接是好的,但並沒有真正提供任何代碼示例,但在這裏。首先你需要獲取組播鎖,這是一些Android設備所必需的,在大多數情況下都沒有嘗試,但是在其他一些帖子中提到過,所以我將它包含在我的代碼中。

權限是必需的,所以首先將權限添加到您的Manifest文件中。

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

然後第二步是在你的方法中獲取組播鎖。

/* Acquire MultiCast Lock */ 
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); 
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

,然後找到你的無線網絡接口

/** 
* Finds Network Interface of Wifi Ethernet. 
* 
* @return 
*/ 
public static NetworkInterface findWifiNetworkInterface() { 

    Enumeration<NetworkInterface> enumeration = null; 

    try { 
     enumeration = NetworkInterface.getNetworkInterfaces(); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 

    NetworkInterface wlan0 = null; 

    while (enumeration.hasMoreElements()) { 

     wlan0 = enumeration.nextElement(); 

     if (wlan0.getName().equals("wlan0")) { 
      return wlan0; 
     } 
    } 

    return null; 
} 

後來,創建多播套接字有一個可用的端口,並設置您的WiFi NetworkInterface的。

MulticastSocket multicastSocket = new MulticastSocket(); 

/* Set NetworkInterface of MultiCast Socket */ 
NetworkInterface wifiNetworkInterface = findWifiNetworkInterface(); 
if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface); 

然後您的其餘實施保持不變。一旦你完成了組播鎖定,建議釋放它。