首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Hotspot/Tethering模式的组播支持

Android Hotspot/Tethering模式的组播支持
EN

Stack Overflow用户
提问于 2011-07-02 00:25:57
回答 3查看 5.6K关注 0票数 14

我有一个原型Android应用程序,它正在侦听多播数据包,以‘发现’客户端进行通信。套接字的设置类似于:

代码语言:javascript
复制
InetAddress group = InetAddress.getByName("228.1.2.3");
MulticastSocket s = new MulticastSocket(4000);
s.joinGroup(group);

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

EN

回答 3

Stack Overflow用户

发布于 2014-12-30 11:51:06

如本文所示:https://plus.google.com/+Chainfire/posts/9NMemrKYnCd

MulticastSocket::setNetworkInterface()

将会是答案

您可以通过以下方式查找wlan0 eth:

代码语言:javascript
复制
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;
}

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

票数 3
EN

Stack Overflow用户

发布于 2012-03-23 22:32:32

您是否拥有manifest权限,是否正在创建锁?

有关权限,请参阅:http://developer.android.com/reference/android/Manifest.permission.html中的'CHANGE_WIFI_MULTICAST_STATE‘

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

票数 0
EN

Stack Overflow用户

发布于 2017-02-24 06:43:09

我也遇到过同样的问题,我想出了一个解决方案,将@braden,@user707606和Chainfire在这个Link中的主要帖子结合在一起。

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

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

代码语言:javascript
复制
<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" />

然后第二步是在你的方法中获取多播锁。

代码语言:javascript
复制
/* Acquire MultiCast Lock */
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();

然后找到您的Wifi网络接口

代码语言:javascript
复制
/**
 * 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。

代码语言:javascript
复制
MulticastSocket multicastSocket = new MulticastSocket();

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6550618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档