2011-07-01 48 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); 

然后您的其余实施保持不变。一旦你完成了组播锁定,建议释放它。