Android在热点/栓系模式下的多播支持

Android在热点/栓系模式下的多播支持,android,wifi,android-wifi,multicast,Android,Wifi,Android Wifi,Multicast,我有一个Android原型应用程序,它正在监听多播数据包以“发现”与之通信的客户端。插座设置与此类似: InetAddress group = InetAddress.getByName("228.1.2.3"); MulticastSocket s = new MulticastSocket(4000); s.joinGroup(group); 当所有设备都通过WiFi连接时,此功能非常有效。我想通过手机作为便携式热点来支持这一点。然而,虽然我的所有设备似乎都正确连接到热点,但我不再接收多播

我有一个Android原型应用程序,它正在监听多播数据包以“发现”与之通信的客户端。插座设置与此类似:

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

当所有设备都通过WiFi连接时,此功能非常有效。我想通过手机作为便携式热点来支持这一点。然而,虽然我的所有设备似乎都正确连接到热点,但我不再接收多播数据。我想知道是否有限制不允许在热点模式下进行这种类型的通信,或者是否需要任何额外的网络配置来启用此功能?我在运行Gingerbread和Froyo的两个不同设备上尝试了这一点,但没有成功。

您是否拥有清单权限,是否正在创建锁

有关权限,请参阅中的“更改无线网络\u多播\u状态”

另外,要创建多播锁。。。请参阅:

如本文所示:

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;
}
publicstaticnetworkinterface getWlanEth(){
枚举=空;
试一试{
枚举=NetworkInterface.getNetworkInterfaces();
}捕获(SocketException e){
e、 printStackTrace();
}
网络接口wlan0=null;
StringBuilder sb=新的StringBuilder();
while(枚举.hasMoreElements()){
wlan0=枚举.nextElement();
sb.append(wlan0.getName()+);
if(wlan0.getName().equals(“wlan0”)){
//可能有更好的方法找到以太网接口
Log.i(标记“找到wlan0”);
返回wlan0;
}
}
返回null;
}

尝试一下,让我知道它是否在热点模式下工作…

我也遇到了同样的问题,并通过结合@braden、@user707606和这篇文章中主要是通过Chainfire发布的文章,提出了一个解决方案

链接中的帖子很好,但没有提供任何代码示例,但在这里。首先,你需要获得多播锁,这是一些Android设备所需要的,大多数设备没有尝试过,但在其他一些帖子中提到过,所以我在代码中包含了它

权限是必需的,因此首先,将权限添加到清单文件中

<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" />
然后,找到您的Wifi网络接口

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

然后,其余的实现保持不变。完成多播锁后,建议您释放它。

我很想知道您是否解决了这个问题。我的理解是,您需要一个多播锁才能让多播工作。唯一的办法就是通过wifimanager。不幸的是,将设备设置为热点时,多播锁似乎是在eth0接口上创建的,而实际的通信是在wl0.1上进行的。这是我所能解决的问题,不确定我是否在正确的轨道上。这里的情况大致相同。这两台设备都在广播,但它们无法相互“看到”。我很想告诉你们,我已经完成了解决方案。:)通过热点进行多播。想在这里发布吗,甘地先生?
/**
 * 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;
}
MulticastSocket multicastSocket = new MulticastSocket();

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