14

我有一个原型 Android 应用程序正在侦听多播数据包以“发现”客户端进行通信。套接字设置与此类似:

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

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

4

3 回答 3

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

试一试,让我知道它在热点模式下是否有效......

于 2014-12-30T03:51:05.620 回答
0

您是否拥有清单权限并且正在创建锁?

如需许可,请参阅:http: //developer.android.com/reference/android/Manifest.permission.html中的“CHANGE_WIFI_MULTICAST_STATE”

另外,要创建多播锁...请参阅:http: //developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html

于 2012-03-23T14:32:31.597 回答
0

我遇到了同样的问题,并通过@braden、@user707606 和 Chainfire 在此链接中的主要帖子的组合提出了解决方案。

在链接中发布很好,但实际上并没有提供任何代码示例,但在这里。首先你需要获取组播锁,这对于一些安卓设备是必需的,大部分都没有尝试过,但在其他一些帖子中提到过,所以我已经将它包含在我的代码中。

需要权限,所以首先,将权限添加到您的清单文件中。

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

然后,找到您的 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;
}

稍后,创建一个具有可用端口的多播套接字并设置您的 Wifi NetworkInterface。

MulticastSocket multicastSocket = new MulticastSocket();

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

然后你的实施的其余部分保持不变。完成多播锁定后,建议释放它。

于 2017-02-23T22:43:08.940 回答